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).rowEt 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 SubA 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
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 Objsi 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 Subca 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
NextD'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