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