Excel Forum Per condividere esperienze su Microsoft Excel

Posizionamento Userform

  • Messaggi
  • OFFLINE
    by sal
    Post: 6.878
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 06/07/2022 09:34
    Ciao a tutti, sto cercando di far quadrare una userform, la sposto a piacere, ma ho difficoltà a recepire l'ultima riga visibile a schermo.

    in modo che l'userform nel caso si posizioni sopra l'ultima riga e non vada sotto lo schermo visibile

    non so se si sono spiegato bene, il codice usato è questo al momento dove "Rr" è la Riga e "Cc" è la Colonna

    With Me
       If Rr > 15 Then
        .Top = sh1.Cells(Rr - 15, Cc).Top + 140
        .Left = sh1.Cells(Rr - 15, Cc).Left - 4
      Else
        .Top = sh1.Cells(Rr, Cc).Top + 140
        .Left = sh1.Cells(Rr, Cc).Left - 4
      End If
    End With


    credo che Top-Left sia l'angolo superiore sinistro, penso che dovrei trovare l'angolo inferiore Destro della userform per posizionarlo sopra la riga

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    tanimon
    Post: 1.512
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 06/07/2022 10:05
    ciao Salvatore,
    dai un'occhiata se può esserti utile

    ciao
    Frank

    qui



    vb
    Private Sub UserForm_Initialize() 
    
    Dim lngWinState As XlWindowState 
    
    With Application 
    .ScreenUpdating = False 
    lngWinState = .WindowState 
    .WindowState = xlMaximized 
    Me.Move 0, 0, .Width, .Height 
    .WindowState = lngWinState 
    .ScreenUpdating = True 
    End With 
    
    End Sub
    [Modificato da tanimon 06/07/2022 10:05]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    by sal
    Post: 6.878
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 06/07/2022 10:16
    Ciao Frank ora provo, sto aggiustando il file per il calcio, un altro file aveva una posizione ferma dove visualizzare i dati dei calciatori, nell'ultimo file che ho inserito è sto modificando, i calciatori sono in una lista potrei far visualizzare centralmente il form con i dati del calciatore, ma sarebbe bello seguire la posizione del calciatore, un esempio.



    Come vedi il form non si posiziona nel modo giusto, vorrei che si posizionasse sotto se ce spazio e sopra se manca spazio in basso

    come detto provo il tuo codice.

    Ciao By Sal (8-D
    [Modificato da by sal 06/07/2022 10:18]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    dodo47
    Post: 3.318
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 06/07/2022 10:31
    ciao Salvatore
    temo tu debba utilizzare le API.

    QUI le indicazioni di C_Pearson

    saluti




    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    tanimon
    Post: 1.513
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 06/07/2022 10:32
    ciao Salvatore,
    quanto ti ho suggerito, non va bene per quello che avevi chiesto.

    Ho capito male io, la tua richiesta.

    Se ho tempo cerco di fare qualcosa anch'io

    Buona giornata
    Frank







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    by sal
    Post: 6.879
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 06/07/2022 11:03
    Ciao Domenico io le posizioni le ricavo dalla cella che è il mio punto 0zero se do questa posizione alla userform, si posiziona con l'angolo superiore sx con l'angolo supreriore sx della cella.

    logicamente incremento dell'altezza della cella, il problema che le misure non corrispondono, nel senso che a quanto ho capito una usa Pixel e l'altra usa i punti dovrei trovare e se mi ricordo bene l'ho letto da qualche parte una conversione tra punti e pixel o viceversa.

    comunque ci sto lavorando.

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    tanimon
    Post: 1.514
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 06/07/2022 12:25
    ciao Salvatore
    ed un saluto a Domenico 😀

    trovando la giusta proporzione tra l'altezza della finestra di Excel e dove vuoi posizionare il top della Userform,

    puoi fare un tentativo, non costa molto....😂

    vb
    Private Sub UserForm_Activate()
    
    With Me
               If ActiveCell.Row > 15 Then
                                    
                .Top = Int(Application.Height / 6)
                
              Else
               
                .Top = Int(Application.Height / 3)
                
                
              End If
      End With
    
    End Sub
    



    [Modificato da tanimon 06/07/2022 12:29]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    tanimon
    Post: 1.515
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 06/07/2022 14:42
    ciao Salvatore,

    oltre la proposta precedente e con le conseguenze del caso, potresti gradire un'alternativa

    ciao
    Frank

    vb
    Private Sub UserForm_Activate()
    
    
    With Me
               
                    Select Case ActiveCell.Row
                        Case 16 To 35
                        
                        .Top = Int(Application.Height / 3)
                        ActiveWindow.ScrollRow = ActiveCell.Row
                    
                    
                                   
                        Case 2 To 15
                        
                            .Top = Int(Application.Height / 3)
                            ActiveWindow.ScrollRow = ActiveCell.Row
                    End Select
                
              
      End With
    
    End Sub


    EDIT:

    Puoi anche non usare il Select Case ed una volta chiusa la UserForm, tornare alla visualizzazione originaria con

    vb
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ActiveWindow.ScrollRow = Range("a1").Row
    End Sub
    
    [Modificato da tanimon 06/07/2022 15:08]







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    by sal
    Post: 6.880
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 06/07/2022 17:31
    Ciao credo di aver risolto, era più semplice del previsto, invece di fare calcoli o altro ho fatto fare riferimento direttamente alla cella con:

    With UserForm2
      .Caption = "Dati del Calciatore " & dd
      .Top = Cells(Rr + 2, Cc).Top + 5
      .Left = Cells(Rr + 2, Cc).Left - 5
    End With
    


    dove "Rr" è la riga e "Cc" e la colonna, ho dovuto solo aggiustare un poco il tiro con +5 e -5

    però ho anche visto che una volta data la posizione la form rimane immobile anche se scorro il foglio, a questo punto ho pensato di usare glli Activex creando un gruppo "Immagine-Label" è come si può vedere ecco il risultato:



    qui si vede la differenza, per il form devo chiuderlo per aprire uno nuovo, con il gruppo basta selezionare un nuovo giocatore e resta vincolato alla cella anche se scorro il foglio.

    ho messo un flag =1 per vedere le due opzioni.

    non ricordo una cosa però, per le "Activex" il MAC non le legge, ma il Form è lo stesso anche quello ha difficoltà a visualizzarlo, non ricordo

    Cosa mi consigliate, quale adottare?

    Ciao By Sal (8-D

    [Modificato da by sal 06/07/2022 17:35]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    dodo47
    Post: 3.319
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 07/07/2022 10:12
    ciao Salvatore
    personalmente ho dei seri dubbi; a meno che ricordi male, il Top ed il Left fanno riferimento allo schermo, pertanto se tu avessi excel in visualizzazione ridotta, quel codice non mostrerebbe risultati corretti.

    Prova a fare:
    Private Sub UserForm_Initialize()
    UserForm2.StartUpPosition = 0

    vedrai la UF posizionata nell'angolo superiore sinistro del tuo schermo, a prescindere che excel sia visibile a pieno schermo, ridotto oppure ad icona.

    Per essere sicuro che quanto dici sia veramente corretto, prova il tuo codice su un altro pc.....

    saluti



    Domenico
    Win 10 - Excel 2016
  • OFFLINE
    by sal
    Post: 6.884
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 07/07/2022 11:12
    Ciao Domenico lo so che la posizione 0zero è in alto a sx, ma eseguendo il codice con il riferimento della cella il suo punto 0zero è l'angolo superiore sx della cella, per cui poi si sposta di riga e colonna indicata, aggiungendo quel +5 e -5 serve per aggiustare la posizione finale.

    infatti se tu scrivi nel Codice "Rr" + 3" si sposta di 3 righe e non di 3 punti o pixel, perche il punto 0zero dell'userform diventa 3 righe più in basso.

    Comunque ho deciso di usare gli activex al posto dell'userform, più duttili e si spostano con lo schermo.

    mi dispiace per gli utenti del Mac, volevo rendere la cosa disponibile anche per loro.

    non ho un altro PC per fare le prove ora vedo se qualche amico mi usa la cortesia di fare questa prova, tanto per esserne sicuro.

    Ciao e Grazie By Sal (8-D
    [Modificato da by sal 07/07/2022 11:14]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    Marius44
    Post: 1.006
    Registrato il: 24/06/2015
    Città: CATANIA
    Età: 80
    Utente Veteran
    Excel2019
    00 07/07/2022 22:15
    Salve a tutta la compagnia
    Ho inserito in un foglio un Rettangolo abbastanza grande (base più piccola dell'altezza) ed ho inserito nel modulo dl Foglio questo codice

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim altezzafinestra As Double, cellaattiva As Double, altezzafigura
    altezzafinestra = Application.ActiveWindow.UsableHeight
    cellaattiva = ActiveCell.Top
    altezzafigura = ActiveSheet.Shapes("Rettangolo 1").Height
    If cellaattiva + altezzafigura > altezzafinestra Then
      ActiveSheet.Shapes("Rettangolo 1").Top = cellaattiva - altezzafigura
    Else
      ActiveSheet.Shapes("Rettangolo 1").Top = cellaattiva
    End If
    End Sub


    Mi sembra che funzioni come hai chiesto.
    Se ti interessa c'è pure la proprietà Application.ActiveWindow.UsableWidth
    Ciao,
    Mario
    [Modificato da by sal 08/07/2022 07:08]
  • OFFLINE
    by sal
    Post: 6.888
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/07/2022 07:11
    Ciao Mario bello il tuo codice che tiene conto del monitor usato, in questo modo si può scegliere a piacere dove visualizzare i dati.
    la metterò nel mio Archivio.

    Ciao By Sal (8.D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    tanimon
    Post: 1.516
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 08/07/2022 09:54
    Ciao Salvatore,
    conosco l'impegno che dedichi al Forum e concordo sul fatto che i consigli di due "mostri sacri" come Marius e Dodo47,
    oltre che più eleganti ed efficaci, siano più congeniali al tuo scopo,
    ma senza volere fare alcuna polemica, tanto meno con Te che nel tempo mi hai risolto un sacco di problemi,

    mi sarei almeno aspettato un qualcosa del genere:
    "Ti ringrazio Frank, ma il tuo suggerimento non raggiunge il mio obiettivo."

    Scusami,
    ma sai che con il tempo il mio carattere, invece di migliorare...

    Una buona giornata.
    Frank







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    by sal
    Post: 6.889
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/07/2022 10:14
    Ciao Frank, lungi da me non rispondere, ma quando ho trovato il metodo, non ho più provato la tua soluzione, purtroppo l'età avanza e non sono più attento come una volta, perdonami.

    sai che quando pongo io un quesito, nel frattempo cerco di trovare anche io la risposta, quindi un continuo aggiornamento, "workinginprogress" non mi piace l'inlgese non so se ho scritto bene, del problema e mano a mano che ricevo risposte le provo, ma la tua è giunta diciamo nel momento sbagliato, non che non fosse valida fare le prove, mi sono accorto della risposta quando ho scritto il post, ed infervorato dalla soluzione non ho risposto.

    Ciao Salvatore (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui