IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Commande OnAction avec ComboBox Active X


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Par défaut Commande OnAction avec ComboBox Active X
    Bonjour, à toutes et tous.

    je viens souvent sur ce forum et vous ai "emprunté" à plusieurs reprises des idées ou bouts de code pour mes applications, mais là, je sèche.

    le but:
    -création de combobox via vba sur une sheet.
    -le nombre de combobox est variable à chaque usage du programme.
    -chaque combobox est lié à une cellule et permet, soit de rapatrier la valeur de ladite cellule, soit via une liste dans le combo, de la modifier, et si il n'y a pas de bonne valeur dans la liste du combo, de la rentrer à la main(mais sans rajouter cette nouvelle valeur à la liste initiale).
    -une fois la modification effectuée, le bouton ne doit plus être utilisé(enabled ou bien visible=false, je ne sais pas encore) voire même delete.
    -affecter à chaque bouton créé une procédure qui s'execute au click( ou change)

    pour ce faire, je pensais passer par "Onaction", mais comme je ne passe pas par un formulaire, cela ne fonctionne pas( ou bien j'ai raté quelque chose)

    j'ai ensuite trouvé des bouts de code par-ci par-là, mais aujourd'hui rien ne fonctionne.

    je n'arrive pas à appeler une procédure à partir d'un oleobjet créé dynamiquement.

    j'ai aussi regardé avec les modules de classes, mais je ne maîtrise pas du tout cette partie.

    voici la partie de code qui fonctionne. je doit avoir un problème de vocabulaire ou syntaxe, mais pour l'instant, je suis en panne.
    merci par avance du temps consacré à mon problème, ainsi que des idées, voire solutions que vous pourrez m'apporter.

    hurluberlu2


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Public Sub CREA_BT(ByVal T As Range)
    '
    '
        Set CTRL = ActiveSheet.OLEObjects.Add(classtype:="Forms.comboBox.1", Left:=T.Left, Top:=T.Top,  Width:=38, Height:=T.Height, link:=True)
        With CTRL
            .Name = "BT_CONTROL" & NUMERO_BT' le nom et numero de chaque bouton
            .ListFillRange = "le lien vers la liste source des combos"
            .LinkedCell = "B" & 6 + NUMERO_BT 'la cellule liée
            .Locked = False
            .Object.ListRows = 20
            .Object.Font.Name = "Arial"
            .Object.Font.Bold = False
            .Object.Font.Size = 8
            .Object.BackStyle = 1
            .Object.BorderStyle = 1
            .Object.DropButtonStyle = 1
            .Object.TextAlign = 2 
            .Object.SpecialEffect = 0
            .Object.BackColor = RGB(255, 204, 255)
            .Object.ForeColor = RGB(128, 0, 0)
            .Object.ListWidth = 65
            .PrintObject = False
        End With
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    Une piste. J'ai écris ce code il y a pas mal de temps et je viens de l'adapter un peu à ton cas mais il va falloir que tu mettes les mains dans le cambouis pour l'adapter à ce que tu veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Hervé.

Discussions similaires

  1. [XL-2010] Commande .OnAction d'un bouton et affectation d'une procedure avec parametres
    Par simonosaxo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/06/2011, 16h07
  2. Commandes WPF avec un ComboBox
    Par helper_moi dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 22/06/2010, 11h25
  3. Réponses: 11
    Dernier message: 12/04/2005, 14h08
  4. Commande fopen avec Mingw32
    Par Blitzz dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 29/10/2003, 11h07
  5. [VB6] [Interface] Grille avec combobox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/01/2003, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo