2017-08-25 5 views
3

J'ai le code suivant qui est censé ajouter une case à cocher pour chaque ligne dans un objet de liste à côté de lui. Je veux développer un outil d'approbation, qui charge des données à partir d'une base de données et les charge dans l'objet de liste. Après cela, je peux approuver ou désapprouver les données avec la case à cocher et enregistrer les modifications. Comme l'objet listobject aura une longueur variable, les cases à cocher devront être ajoutées et supprimées par le code.Quel type a une case à cocher de feuille de calcul dans vba?

alors voici le code:

Sub Approval() 
Dim i As Integer 
Dim tbl As ListObject 
Dim CBcollection As Collection 
Dim CB As msforms.CheckBox ' THIS IS WRONG 
Dim sht As Worksheet 
Dim L As Double, T As Double, H As Double, W As Double 
Dim rng As Range 

Set sht = Tabelle1 
Set tbl = sht.ListObjects("ApprovalTBL") 
Set rng = tbl.Range(2, 1).Offset(0, -1) 
     W = 10 
     H = 10 
     L = rng.Left + rng.Width/2 - W/2 
     T = rng.Top + rng.Height/2 - H/2 

For i = 1 To tbl.ListRows.Count 
     Set CB = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 
'the line before will give me an error 13 type missmatch 
     CBcollection.Add (CB) 
     Set rng = rng.Offset(-1, 0) 
     T = rng.Top + rng.Height/2 - H/2 
Next i 

End Sub 

Maintenant la question:

Quel type a une feuille de calcul dans Checkbox normal?

Je toujours utilise "Option Explicit" et je vais toujours dim mes variables au bon type et je ne veux pas utiliser les types de variantes.

+1

Contrôles de formulaire ou des contrôles ActiveX? –

Répondre

3

Un contrôle de formulaire case serait être un Shape, mais ce n'est pas ce que vous avez ici.

L'ajout d'une case à cocher ActiveX sur une feuille de calcul ajoute une référence à la bibliothèque de type MSForms (tout comme l'ajout d'un UserForm à votre projet VBA).

La case à cocher est en effet une instance MSForms.Checkbox, mais de vivre sur une feuille de calcul, il est intégré dans un OLEObject, un type qui vit dans la bibliothèque de type Excel.

Donc, pour obtenir le MSForms.Checkbox vous devez récupérer la référence OLEObject.Object:

Dim ctrl As Excel.OLEObject 
Set ctrl = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 

Dim chkBox As MSForms.CheckBox 
Set chkBox = ctrl.Object 
+0

Votre solution fonctionne, je viens d'avoir un autre problème :: erreur 91 objet ou avec une variable non définie, lorsque vous essayez d'ajouter le CheckBox à ma collection. Une idée de ce qui pourrait être mauvais là-bas? –

+0

@LucasRaphaelPianegonda en regardant votre appel 'CBcollection.Add', vous avez des parenthèses externes autour de la référence de l'objet, ce qui signifie" évaluer cette expression comme une valeur, * et passer le résultat 'ByVal' *" - ce qui n'est pas un bon idée lorsqu'il s'agit d'une référence d'objet (l'évaluer en tant que valeur n'est pas susceptible de bien se terminer). Supprimez les parenthèses inutiles, vous réglerez le problème. –

0

C'est juste Checkbox - vous n'avez pas besoin de le qualifier avec quoi que ce soit.

Si c'est sur votre tho feuille de calcul, qui est probablement une case à cocher ActiveX qui est définie comme Object

+1

Ce n'est pas ... le contrôle incorporé est un 'OLEObject', et' Checkbox' * est * défini dans la bibliothèque de type 'MSForms', qualifié ou non. –

0

OLEObjects.Add retours OLEObject, déclareraient votre variable comme ceci:

Dim CB As OLEObject 
+0

si j'utilise OLEObject il ne me donnera pas l'erreur 13 type missmatch mais me donne l'erreur 438: l'objet ne supporte pas la propriété ou la méthode .. aucune idée comment résoudre ce problème? –

+0

@LucasRaphaelPianegonda voir ma réponse –

+0

Ah, battez-moi! –