UserForm à coté de la cellule active

Bonjour à tous,

Je bloque sur l'affichage de mon UserForm (qui me sert de liste déroulante) pour l'afficher à coté de la cellule sur laquelle je clique pour faire appel à mon UserForm.

Malgré les différents codes trouvées sur le forum, je n'y arrive toujours pas...

Si quelqu'un peut m'aider comme d’habitude..

D'avance merci !

Bonjour

Tu devrais joindre ton fichier, ce serait plus simple.

Bye !

Bonjour,

ci joint un fichier :

Il vous permettra de faire ce que vous cherchez à faire, en y ajoutant les réglages que vous souhaitez.

@ bientôt

LouReeD

Bonjour,

En complément de la réponse de LouReed On pourrait compléter avec cette macro à mettre dans le module de la feuille concernée

(afin d'éviter l'effet de bordure quand on arrive un peu trop à droite ou en bas de l'écran)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 10 Then ActiveWindow.ScrollRow = Target.Row - 10
If Target.Column > 5 Then ActiveWindow.ScrollColumn = Target.Column - 5
End Sub

A+

Merci pour votre réactivité habituelle !!!

Par contre, si ma feuille a un affichage inférieur à 100%, mon UserForm ne se trouve pas à coté de la cellule active.

C'est peut être barge mon idée, mais j'aimerai qu'il puisse être à côté car mon fichier risque d'être long sur la largeur.

Même si j'ai un doute que cela soit possible...

Encore merci !

60test-liste.xlsm (54.90 Ko)

Bonsoir,

sans avoir regardé votre fichier :

Sub UserFormPos()
    Dim x#, y#, w#, h#
    x = GetDeviceCaps(GetDC(0), 88) / 72
    y = GetDeviceCaps(GetDC(0), 90) / 72
    With UserForm1
        .StartUpPosition = 0
        .Left = (ActiveCell.Column * ActiveCell.Width) * (ActiveWindow.Zoom / 100) + 20
        .Top = (ActiveCell.Row * ActiveCell.Height) * (ActiveWindow.Zoom / 100) + 120
'        .Left = (ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left * x) * 1 / x) + 4
'        .Top = (ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top * y) * 1 / y) + ActiveCell.Height + 4
    End With
End Sub

J'intègre une modification de la position en fonction du zoom.

Ici cela marche car les cellules ont la même hauteur et même largeur...

A voir comment l'adapter.

@ bientôt

LouReeD

Je n'y arrive toujours pas.

Merci à tous pour votre aide mais je crois que je vais abandonner mon idée...

Bonjour,

voici les différents codes à mettre en place à différents endroit de votre classeur :

Code sur la feuille, liè au double clic sur une colonne qui contient "TYPE" en ligne 1 :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Cells(1, Target.Column) = "TYPE" Then ' si la valeur de la cellule de la colonne cliquée en première ligne est égale à TYPE alors
        If Target.Row > 1 And Target.Row < 21 Then ' si le numéro de ligne de la cellule cliquée est compris entre 2 et 20 inclus alors
            Cancel = True ' on annule le double clic car on est dans une zone surveillée
            Liste.Show ' on affiche le USF Liste
        End If
    End If
End Sub

si le double clic est fait sur une colonne qui contient le mot TYPE en ligne 1 ET que la cellule cliquée est sur une ligne > 1 ET <21 alors on est bien sur une colonne de choix de TYPE, on annule donc la saisie dans la cellule avec CANCEL = TRUE puis on affiche le USF

Code sur le USF :

Option Explicit

Private Sub UserForm_Initialize()
    Call UserFormPos ' on appel la procédure de position
    Me.ComboBox1.List = Sheets("SOURCES").Range("H5:H7").Value
    If Val(Application.Version) > 10 Then SendKeys "{F4}"
End Sub
Private Sub ComboBox1_click()
    ActiveCell.Value = Me.ComboBox1 ' la cellule active prend la valeur choisie
    Unload Me ' on décharge le USF
End Sub

Code de la procédure de position :

Option Explicit

Sub UserFormPos()
    Dim NB_Cell_Width As Integer, Der_Col_Figée As Integer, Der_Col_Masquée As Integer
    Dim NB_Cell_Height As Integer, Der_Lig_Figée As Integer, Der_Lig_Masquée As Integer
    With ActiveWindow
        If .FreezePanes Then 's'il y a les volets figés
            Der_Col_Figée = ActiveSheet.Cells(.SplitRow + 1, .SplitColumn + 1).Column - 1 ' détermination de la dernière colonne figée
            If ActiveCell.Column > Der_Col_Figée Then
                Der_Col_Masquée = ActiveWindow.VisibleRange(1).Column - 1
                NB_Cell_Width = (ActiveCell.Column - Der_Col_Masquée) + Der_Col_Figée
            Else
                NB_Cell_Width = ActiveCell.Column
            End If
            Der_Lig_Figée = ActiveSheet.Cells(.SplitRow + 1, .SplitColumn + 1).Row - 1 ' détermination de la dernière colonne figée
            If ActiveCell.Row > Der_Lig_Figée Then
                Der_Lig_Masquée = ActiveWindow.VisibleRange(1).Row - 1
                NB_Cell_Height = (ActiveCell.Row - Der_Lig_Masquée) + Der_Lig_Figée
            Else
                NB_Cell_Height = ActiveCell.Row
            End If
        Else
            NB_Cell_Width = ActiveCell.Column
            NB_Cell_Height = ActiveCell.Row
        End If
    End With

    With Liste
        .StartUpPosition = 0
        .Left = (NB_Cell_Width * ActiveCell.Width) * (ActiveWindow.Zoom / 100) + 24     ' 24 = largeur de la "colonne" d'entête des numéros de lignes
        .Top = (NB_Cell_Height * ActiveCell.Height) * (ActiveWindow.Zoom / 100) + 120   ' 120 = largeur barre de fenêtre plus ruban d'Excel
                                                                                        ' ces deux valeurs sont peut être à régler, ou bien dans un prochain code à calculer
    End With
End Sub

Suppression de tout ce qui n'était pas utile !

Maintenant le USF se place à droite de la cellule double cliqué, et prend en compte le fait de savoir si les volets sont figés ou pas, la position est alors calculée en fonction de cela.

Les valeurs "en dur" 24 et 120 correspondent au décalage dus au ruban d'Excel et de la barre supérieur de la fenêtre ainsi qu'à la largeur de la colonne d'entête des numéros de lignes.

ATTENTION !!! Ce code prend pour hypothèse que la largeur des cellules est identique sur toute la feuille, il en est ainsi pour la hauteur.

Sinon, il faudra mettre en place un système de boucle afin d'additionner l'ensemble des tailles pour trouver la bonne valeur...

@ bientôt

louReeD

Allez, je ne vous laisse pas comme cela !

Voici le fichier :

@ bientôt

LouReeD

Merci !!!!!!!!!!!

Et en plus j'ai compris grâce à vos explications !!!

Alors si je veux aller plus loin, dans l'optique que les tailles de mes colonnes ne soient pas identique, comment dois-je calculer et incrémenter .left et .top?

Encore merci, tu m'as sorti de terre !!!

Allez, je ne vous laisse pas comme cela !

Voici le fichier : LouReeD position USF feuille figée ou pas.xlsm@ bientôt

LouReeD

Bonjour,

merci de vos remerciements !

ceci dit sans contraintes de temps, je regarde de mon coté pour rendre l'idée fonctionnelle quelque soit la mise en page de l'application : plein écran, avec ou sans ruban, avec ou sans titres de colonnes et de lignes, en fonction du zoomz, et surtout en fonction de chaque taille de cellule... Je ne pensais pas mais il va me falloir du temps...

C'est ça le problème quand on se croit fort !!!

@ bientôt

LouReeD

Bonjour,

n'hésitez pas à passer le sujet en résolus...

@ bientôt

LouReeD

Rechercher des sujets similaires à "userform cote active"