2016-09-08 2 views
1

Mon code parcourt tous les OLEObjects existants dans la feuille actuelle d'un classeur Excel. Je veux qu'il trouve un spécifique (basé sur le nom passé au sous) qui est toujours un CheckBox et l'assigner à une variable de type CheckBox.VBA: Attribution d'un OLEObject générique à une variable CheckBox

Remarque: Les autres objets ne sont pas tous des cases à cocher, d'où le type générique OLEObject.

code exemple qui appelle sous, montrant par exemple du nom:

HandleCheckBoxClick("chkAddSummary") 

Sub qui recherche cet objet spécifique:

Sub HandleCheckBoxClick(nm As String) 

    Dim o As OLEObject 
    Dim cb As CheckBox 

    For Each o In Me.OLEObjects 
     If o.name = nm Then 
      Set cb = o 
     End If 
    Next o 

End Sub 

Je trouve à une question similaire: Excel VBA: how to cast a generic control object into a ComboBox object? mais il fait référence pour former des contrôles (pas de contrôles ActiveX). J'ai essayé la méthode donnée dans la réponse pour voir si elle était transférable entre les deux types de contrôle mais sans succès.

La raison pour laquelle je veux faire cela est similaire au demandeur de la question à laquelle je me réfère - Je ne peux pas utiliser des méthodes comme CheckBox.Value avec une variable générique OLEObject.

J'ai également essayé d'utiliser la méthode OLEObject.progID pour m'assurer que o est un objet case à cocher. L'erreur que j'obtiens en essayant de Set cb = o est une incompatibilité de type.

Répondre

1

Lorsque déclarée MSForms.CheckBox il devrait être possible alors d'assigner o.Object.

Sub test() 
    HandleCheckBoxClick "chkAddSummary" 
End Sub 

Sub HandleCheckBoxClick(nm As String) 

    Dim o As OLEObject 
    Dim CB As MSForms.CheckBox 

    For Each o In Me.OLEObjects 
     If o.Name = nm Then 
      Set CB = o.Object 
     End If 
    Next o 

End Sub 
0

Je ne pouvais pas trouver (jusqu'à présent) comment l'attribuer à un CheckBox, j'ai trouvé comment l'assigner à une variable OLEObject (si cela vous aide).

Sub HandleCheckBoxClick(nm As String) 

Dim o   As OLEObject 
Dim CB   As CheckBox 
Dim oleObj  As OLEObject 

' loop though all OLEObjects in "Sheet2" >> modify to your sheet name 
For Each o In Sheets("Sheet2").OLEObjects 
    If TypeName(o.Object) = "CheckBox" Then 
     Debug.Print o.Name 

     ' if you have more then 1 CheckBox 
     If o.Name = nm Then 
      Set oleObj = o 
'   Set CB = o.Select 
     End If 
    End If 
Next o 

' just to test the options with OLEObject variable 
With t 
    t.Top = 100 
    If t.Object.Value = True Then 
     MsgBox "CheckBoX " & nm & " is selected" 
    Else 
     MsgBox "CheckBoX " & nm & " is not selected" 
    End If 
End With 

End Sub