1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
Private Declare Function LockWindowUpdate _
Lib "User32" ( _
ByVal HwndLock As Long) As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Ctrl As OLEObject
Dim Combo As MSForms.ComboBox
Dim Module As Object
Dim Ligne As String
Dim I As Integer
On Error Resume Next
Supprime
On Error GoTo 0
'seulement en colonne A
If Intersect(Target, Columns("A")) Is Nothing Then Exit Sub
'fige le rafraîchissement du VBE et d'Excel
LockWindowUpdate Application.VBE.MainWindow.Hwnd
Application.ScreenUpdating = False
'cellule active dans la colonne A
With ActiveCell
Set Ctrl = Me.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=.Left, _
Top:=.Top, _
Width:=.Width, _
Height:=.Height)
End With
'renomme le contrôle
Ctrl.Name = "BT_CONTROL"
'passe la propriété Objet de l'OLE à l'objet ComboBox
'afin de pouvoir utiliser certaines de ses propriétés
Set Combo = Ctrl.Object
Combo.Name = "BT_CONTROL"
'rempli le combo à partir de la colonne B, adapter...
For I = 1 To 20
Combo.AddItem Range("B" & I)
Next I
Set Module = ThisWorkbook.VBProject.VBComponents(Me.CodeName).CodeModule
'écrit la procédure évènementielle du combo dans le module de la feuille
'procédure qui appelle ma macro ci-dessous "MacroCombo"
With Module
Ligne = .CreateEventProc("Click", "BT_CONTROL")
.replaceline Ligne + 1, "MacroCombo"
End With
'rafraîchi
Application.Visible = True
LockWindowUpdate 0&
Set Module = Nothing
Set Combo = Nothing
Set Ctrl = Nothing
End Sub
Sub MacroCombo()
'procédure appelée par la procédure évènementielle du combobox
'ici, inscrit la valeur choisie dans le combobox, adapter...
With Me.OLEObjects("BT_CONTROL")
.TopLeftCell.Value = .Object.Value
End With
'supprime le combo une fois la valeur entrée dans la cellule
Supprime
End Sub
Sub Supprime()
Dim Ctrl As OLEObject
Dim Module As Object
Dim Ligne As String
Set Ctrl = Worksheets("Feuil1").OLEObjects("BT_CONTROL")
'fige
Application.ScreenUpdating = False
'supprime le contrôle
Ctrl.Delete
Set Module = ThisWorkbook.VBProject.VBComponents(Me.CodeName).CodeModule
'supprime la procédure évènementielle précédemment écrite dans le module
With Module
Ligne = .ProcStartLine("BT_CONTROL_Click", 0)
.DeleteLines Ligne, 4
End With
'rafraîchi
Application.ScreenUpdating = True
Set Module = Nothing
End Sub |
Partager