VBA checkbox et combobox

bonjour

alors voila j'ai un problème que je n'arrive pas régler depuis quelques jours

grâce à une macro j'ai un certain nombre de checkbox créées dynamiquement grâce a OLEObject, chaque checkbox est associée à une combobox que j'initialise sur visible = false mon but est donc d'afficher la combobox qd ma checkbox est cochée j'ai essayé de plusieurs façon mais je n'arrive pas à obtenir le résultat voulu si quelqu'un peut m'aider...

alors en gros je fais un tableau croisé dynamique avec les champs souhaités ensuite je créé des checkbox et des combobox en fonction du nombre de lignes que contient mon tcd et le but est que les combobox ne s affichent qu'une fois que leur checkbox respectives soient cochées afin de récupérer certaines info du tcd (j'espère que c'est assez clair ) j'ai essayé de faire comme ca :

Sub auto() 

Dim fichier1 As Variant 
Dim total_ligne_tcd As Integer 
Dim c As OLEObject 
Dim d As OLEObject 
Dim i As Integer 
Dim ligne As Integer 

fichier1 = Application.GetOpenFilename("Fichier (*.*), *.*") 
If fichier1 = False Then 
MsgBox "erreur de fichier Excel" 
Exit Sub 
End If 
Workbooks.Open (fichier1) 
Sheets("Smp99_Donnees").Select 
Sheets("Smp99_Donnees").Activate 
Sheets("Smp99_Donnees").Move _ 
Before:=Workbooks("Classeur1.xls").Sheets(3) 

'Comptage du nombre d'arrets 

Sheets("Smp99_Donnees").Select 
ligne = 8 
dat = Cells(ligne, 2) 
Do While dat <> "" 
ligne = ligne + 1 
dat = Cells(ligne, 2) 
Loop 
total_ligne = ligne - 1 
Range("B8").Select 

'tableau dynamique 

Sheets("Smp99_Donnees").Select 
Range(Cells(7, 2), Cells(total_ligne, 40)).Select 
ActiveWorkbook.Names.Add Name:="tcd_tcd", RefersToR1C1:= _ 
Range(Cells(7, 2), Cells(total_ligne, 40)) 
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ 
"tcd_tcd").CreatePivotTable TableDestination:="Feuil2!R5C1", TableName:= _ 
"Tableau croisé dynamique", DefaultVersion:=xlPivotTableVersion10 
Sheets("Feuil2").Select 
Cells(5, 1).Select 
ActiveSheet.PivotTables("Tableau croisé dynamique").AddDataField ActiveSheet. _ 
PivotTables("Tableau croisé dynamique").PivotFields("Durée"), "Somme de Durée" _ 
, xlSum 
With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Type") 
.Orientation = xlRowField 
.Position = 1 
End With 
With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Zone") 
.Orientation = xlRowField 
.Position = 2 
End With 
With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields( _ 
"Evénement") 
.Orientation = xlRowField 
.Position = 3 
End With 
With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields( _ 
"Commentaire") 
.Orientation = xlRowField 
.Position = 4 
End With 

ActiveWorkbook.Sheets("Feuil2").Select 
ligne = 7 
dat = Cells(ligne, 5) 
Do While dat <> "" 
ligne = ligne + 1 
dat = Cells(ligne, 5) 
Loop 
total_ligne_tcd = ligne - 1 

For i = 7 To total_ligne_tcd 

With ActiveSheet.Range("G" & i) 
Set c = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 
c.Name = "CheckBox_" & i 
End With 

With ActiveSheet.Range("H" & i) 
Set d = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 
d.Name = "ComboBox_" & i 
d.Visible = False 

End With 
Next 

End Sub 

j'ai essayé avec

For i = 7 To total_ligne_tcd 
If ActiveSheet.OLEObjects("CheckBox_" & i).Object.Value = True Then 
ActiveSheet.OLEObjects("ComboBox_" & i).Object.Visible = True 
End If 
Next 

mais ca ne marche tjs pas

merci d'avance

Bonjour JuJuK,

Tout d'abord, édite ton message et utilise les balises de code pour le mettre en forme.

Ensuite, ton code pour vérifier la valeur des checkbox, il faut que tu le mettes dans une macro indépendante et que tu associes cette macro aux évènements checkbox_i_change.

T'as un message d'erreur quelque part?

Ca marche ta boucle pour faire défiler les Checkbox et combobox?

Sinon avec ça :

Dim Obj As OLEObject

For Each Obj In Sheets("Bus info (1)").OLEObjects
    MsgBox Obj.Name

    MsgBox Obj.LinkedCell.Row
Next Obj
 

Tu peux tester le type d'objet et faire des trucs dessus!

Bon courage!


Bonjour JuJuK,

Tout d'abord, édite ton message et utilise les balises de code pour le mettre en forme.

Ensuite, ton code pour vérifier la valeur des checkbox, il faut que tu le mettes dans une macro indépendante et que tu associes cette macro aux évènements checkbox_i_change.

T'as un message d'erreur quelque part?

Ca marche ta boucle pour faire défiler les Checkbox et combobox?

Sinon avec ça :

Dim Obj As OLEObject

For Each Obj In Sheets("Bus info (1)").OLEObjects
    MsgBox Obj.Name

    MsgBox Obj.LinkedCell.Row
Next Obj
 

Tu peux tester le type d'objet et faire des trucs dessus!

Bon courage!

voilà j'ai édité mon message...

en ce qui concerne la création de mes checkbox et combobox il n'y a aucun souci aucun message d'erreur

par contre pouvez vous être plus précis concernant la macro associée aux évènements checkbox_i_change, comment faire pour qu'elle prenne à chaque fois la bonne valeur de i ??

merci d'avance

Bonjour,

Tout d'abord remplace ces lignes de code

'Comptage du nombre d'arrets 
Sheets("Smp99_Donnees").Select 
ligne = 8 
dat = Cells(ligne, 2) 
Do While dat <> "" 
ligne = ligne + 1 
dat = Cells(ligne, 2) 
Loop 
total_ligne = ligne - 1 
Range("B8").Select 

par

    total_ligne  = Sheets("Smp99_Donnees").Cells(Rows.count,2).End (xlup).row

Et le deuxième aussi

Pour suivre l'évolution des CheckBox. faudrait créer une collection (module de classe) pour un retour de changement d'état.

Si intéresser tu dis je te mettrais un exemple.

A+

JuJuK a écrit :

évènements checkbox_i_change, comment faire pour qu'elle prenne à chaque fois la bonne valeur de i ??

Là t'as pas le choix, tu dois mettre la macro dans laquelle tu testes les états des checkbox, dans les évènements de chacune de tes checkbox...

Et oui, bien vu lermite, j'avais même pas tilté en parcourant le code!

tout d'abord merci pour l'intérêt que vous portez à mon problème et sinon j'aimerai bien un exemple des collections pour voir comment ca marche

merci encore une fois

Avec cet exemple tu peu géré tes CheckBox et tes Combo

Il contient

  • Une collection d'objets pour les Combo qui permet de gérer ses propriétés notamment VISIBLE
  • Une collection de classe pour les CheckBox qui permet d'avoir le retour des évènements notamment CLICK
  • Une collection de classe pour les ComboBox qui permet d'avoir le retour des évènements notamment CLICK
  • Un exemple pour ajouter les items dans les comboBox lors de leurs création.

Pour commencer lancer la procédure CréerContol

Ensuite la procédure InitCollect

Pour lancer les procédures. au cas ou tu ne sais pas

Mettre le curseur DANS la procédure et taper F5

NOTE : A chaque fois que tu modifie le code, ne fusse que d'une lettre, tu dois relancer la procédure InitCollect

En général je la relance dans le Form_Activate

Tu dis..

waw impressionnant par contre est ce qu'on est obligé de lancer chaque procédure toute seule ?? ou c'est possible d'en lancer une seule qui appelle les autres...

Les procédures sont séparées parce que quand ont modifie le code il faut rappeler la 2è, mais rien n’empêche d'appeller la deuxième à partir de la 1ère.

Sub CréerContol()
Dim Check As OLEObject
Dim Combo As OLEObject
Dim i As Integer, S As String
    For i = 7 To 12 ' Cells(Rows.Count, "G").End(xlUp).Row
    '......
    Next
    InitCollect
End Sub

A l'ouverture du fichier faut juste lancer CréerContol et si tu ne fait pas de modif dans le code c'est tout.

S'il vous plaît pouvez-vous jeter un coup oeil à mon fichier et me dire ce qui ne va pas

(lorsque vous lancez selectionnez tcm la 1ère fois puis SE2-SE4 la seconde )

un énorme merci a vous

31classeur7test.zip (17.62 Ko)
34tcm.zip (26.91 Ko)
36se2-se4-po4.zip (21.19 Ko)

Et classeur 7 y fait quoi ?


Oui, Ca va j'ai compris pou le 7.

Mais où ça cloche, pour que je cherche pas n'importe quoi ?

c'est bon j'ai trouvé par contre une autre petite question concernant

For Each Obj In Sheets("feuil2").OLEObjects
        'verifie s'il s'agit d'un CheckBox
        If TypeOf Obj.Object Is MSForms.CheckBox Then
            Set Cl = New Classe1
            Set Cl.GroupCheck = Obj.Object
            ColectCheck.Add Cl
            S = Right(Obj.Name, 3)
            CollectCK.Add Obj, S
            'ou d'un ComboBox
        ElseIf TypeOf Obj.Object Is MSForms.ComboBox Then
            Set Cl = New Classe1
            Set Cl.GroupCombo = Obj.Object
            ColectCombo.Add Cl
            S = Right(Obj.Name, 3)
            CollectCB.Add Obj, S
        End If
    Next Obj

si je vx que ma boucle ne dépasse pas une certaine colonne comment je fais( car j'ai 2 groupes de checkbox et combobox)

Si j'ai bien compris..

Aucune importance que ce soit ton premier groupe ou le second l'initialisation se ferra normalement et ne tient aucun compte des lignes ou des colonnes

Ben apparement ca ne veut pas....voila mon code

Option Explicit

Public ColectCheck As Collection
Public ColectCombo As Collection
Public CollectCK As Collection
Public CollectCB As Collection

Sub test()

    Dim fichier1 As Variant
    Dim fichier2 As Variant
    Dim FichierJournal As Workbook
    Dim total_ligne As Integer
    Dim total_ligne_tcd As Integer
    Dim total_ligne_tcd2 As Integer
    Dim i As Integer
    Dim j As Integer
    Dim ligne As Integer
    Dim Check As OLEObject
    Dim Combo As OLEObject
    Dim S As String

    fichier1 = Application.GetOpenFilename("Fichier (*.*), *.*")
    If fichier1 = False Then
        MsgBox "erreur de fichier Excel"
        Exit Sub
    End If
    Workbooks.Open (fichier1)
    Sheets("Smp99_Donnees").Select
    Sheets("Smp99_Donnees").Activate
    Sheets("Smp99_Donnees").Move _
    Before:=Workbooks("Classeur7.xls").Sheets(3)

    fichier2 = Application.GetOpenFilename("Fichier (*.*), *.*")
    If fichier2 = False Then
        MsgBox "erreur de fichier Excel"
        Exit Sub
    End If
    Workbooks.Open (fichier2)
    Sheets("Smp99_Donnees").Select
    Sheets("Smp99_Donnees").Activate
    Sheets("Smp99_Donnees").Move _
    Before:=Workbooks("Classeur7.xls").Sheets(3)

    'Comptage du nombre d'arrets

    total_ligne = Sheets("Smp99_Donnees").Cells(Rows.Count, 2).End(xlUp).Row

    'tableau dynamique

    Sheets("Smp99_Donnees").Select
    Range(Cells(7, 2), Cells(total_ligne, 40)).Select
    ActiveWorkbook.Names.Add Name:="tcd_tcd", RefersToR1C1:= _
        Range(Cells(7, 2), Cells(total_ligne, 40))
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "tcd_tcd").CreatePivotTable TableDestination:="Feuil2!R5C1", TableName:= _
        "Tableau croisé dynamique", DefaultVersion:=xlPivotTableVersion10
    Sheets("Feuil2").Select
    Cells(5, 1).Select
    ActiveSheet.PivotTables("Tableau croisé dynamique").AddDataField ActiveSheet. _
        PivotTables("Tableau croisé dynamique").PivotFields("Durée"), "Somme de Durée" _
        , xlSum
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Type")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Zone")
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields( _
        "Evénement")
        .Orientation = xlRowField
        .Position = 3
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields( _
        "Commentaire")
        .Orientation = xlRowField
        .Position = 4
    End With

    'mise en gras
    Range("C4").Select
    ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Evénement"). _
        Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
        False, False)
    Cells.Select
    Range("A2").Activate
    Selection.Font.Bold = True

    'total sans virgule

    Columns("E:E").Select
    Selection.NumberFormat = "0"

    total_ligne_tcd = Range("E" & Rows.Count).End(xlUp).Row

    'Comptage du nombre d'arrets

    total_ligne = Sheets("Smp99_Donnees (2)").Cells(Rows.Count, 2).End(xlUp).Row

    'tableau dynamique

    Sheets("Smp99_Donnees (2)").Select
    Range(Cells(7, 2), Cells(total_ligne, 40)).Select
    ActiveWorkbook.Names.Add Name:="tcd_tcd", RefersToR1C1:= _
        Range(Cells(7, 2), Cells(total_ligne, 40))
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "tcd_tcd").CreatePivotTable TableDestination:="Feuil2!R5C10", TableName:= _
        "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
    Sheets("Feuil2").Select
    Cells(5, 10).Select
    ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
        PivotTables("Tableau croisé dynamique1").PivotFields("Durée"), "Somme de Durée" _
        , xlSum
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Type")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Horodate")
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Zone")
        .Orientation = xlRowField
        .Position = 3
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "Evénement")
        .Orientation = xlRowField
        .Position = 4
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
        "Commentaire")
        .Orientation = xlRowField
        .Position = 5
    End With

    Columns("K:K").EntireColumn.AutoFit
    'mise en gras
    Range("C4").Select
    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Evénement"). _
        Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
        False, False)
    Cells.Select
    Range("A2").Activate
    Selection.Font.Bold = True

    'total sans virgule

    Columns("O:O").Select
    Selection.NumberFormat = "0"

    total_ligne_tcd2 = Range("O" & Rows.Count).End(xlUp).Row

    For i = 7 To total_ligne_tcd
        With ActiveSheet.Range("G" & i)
            Set Check = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & i, 3)
            Check.Name = "Ch" & S
        End With

        With ActiveSheet.Range("H" & i)
            Set Combo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & i, 3)
            Combo.Name = "CB" & S
            Combo.Visible = False
            Combo.Object.AddItem "Test 1"
            Combo.Object.AddItem "Test 2"

        End With
    Next
    InitCollect

    For j = 7 To total_ligne_tcd2

        With ActiveSheet.Range("Q" & j)
            Set Check = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & j, 3)
            Check.Name = "Ch_" & S
        End With

        With ActiveSheet.Range("R" & j)
            Set Combo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & j, 3)
            Combo.Name = "CB_" & S
            Combo.Visible = False
            Combo.Object.AddItem "Test 1"
            Combo.Object.AddItem "Test 2"

        End With
    Next

InitCollect

End Sub

Public Sub InitCollect()
Dim Obj As OLEObject
Dim Cl As Classe1
Dim S As String
    Set Cl = Nothing
    Set ColectCheck = New Collection
    Set ColectCombo = New Collection
    Set CollectCK = New Collection
    Set CollectCB = New Collection
    'boucle sur les objets de la Feuil2
    For Each Obj In Sheets("feuil2").OLEObjects
        'verifie s'il s'agit d'un CheckBox
        If TypeOf Obj.Object Is MSForms.CheckBox Then
            Set Cl = New Classe1
            Set Cl.GroupCheck = Obj.Object
            ColectCheck.Add Cl
            S = Right(Obj.Name, 3)
            CollectCK.Add Obj, S
            'ou d'un ComboBox
        ElseIf TypeOf Obj.Object Is MSForms.ComboBox Then
            Set Cl = New Classe1
            Set Cl.GroupCombo = Obj.Object
            ColectCombo.Add Cl
            S = Right(Obj.Name, 3)
            CollectCB.Add Obj, S
        End If
    Next Obj
End Sub

ca me met clé déjà utilisée...

le InitCollect

n'est pas a la bonne place.

Il doit être mis juste avant le En Sub

même en mettant le initcollect avant le end sub il me donne le message d'erreur suivant :

"Cette clé est déjà associée à un élément de cette collection "

Ah,

Montre la/ les codes qui crée tes contrôles.

For i = 7 To total_ligne_tcd
        With ActiveSheet.Range("G" & i)
            Set Check = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & i, 3)
            Check.Name = "Ch" & S
        End With

        With ActiveSheet.Range("H" & i)
            Set Combo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & i, 3)
            Combo.Name = "CB" & S
            Combo.Visible = False
            Combo.Object.AddItem "Test 1"
            Combo.Object.AddItem "Test 2"

        End With
    Next

    For j = 7 To total_ligne_tcd2

        With ActiveSheet.Range("Q" & j)
            Set Check = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & j, 3)
            Check.Name = "Ch_" & S
        End With

        With ActiveSheet.Range("R" & j)
            Set Combo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
            S = Right("00" & j, 3)
            Combo.Name = "CB_" & S
            Combo.Visible = False
            Combo.Object.AddItem "Test 1"
            Combo.Object.AddItem "Test 2"

        End With
    Next

D'après ce que tu montre tu veux deux séries de CheckBox et une seule de Combo ?

C'est ça ?

en fait c'est 2 tcd dans la me feuille et en face de chacun d'eux une série de checkbox et de combobox

Rechercher des sujets similaires à "vba checkbox combobox"