2017-05-16 7 views
0

Ich erstelle ein VBA-Makro, um alle Kontrollkästchen in einem Blatt auszuwählen, und es funktioniert gut, aber jetzt möchte ich meinen Code zu aktivieren und deaktivieren Sie nur die Kontrollkästchen in einem bestimmten Bereich .Aktivieren/Deaktivieren aller CheckBoxen in einem Bereich EXCEL VBA Makro

Hier ist mein Code.

Sub Select_all() 

Dim Cbox As CheckBox 
Dim Rng As Range 

Set Rng = ActiveWorkbook.Sheets("Sheet4").Range("B7, B104") 

For Each Cbox In ActiveSheet.CheckBoxes 

If Not Intersect(Cbox.TopLeftCell, Rng) Is Nothing Then 
    If Cbox.name <> ActiveSheet.CheckBoxes("Check Box 104").name Then 
    Cbox.Value = ActiveSheet.CheckBoxes("Check Box 104").Value 
    End If 
End If 

Next Cbox 

End Sub 

Ich habe

If Not Intersect (Cbox.TopLeftCell, RNG) ist nichts

aber es ändert nichts, und wenn ich diesen Teil entfernen, dann wählt alle Checkboxen im Blatt und ich brauche nur für den Bereich ("B7: B104")

Irgendwelche Vorschläge bitte? Vielen Dank.

+3

Warum haben Sie den Bereich definiert als 'Range (" B7, B104 ")'? Das heißt, es sind nur zwei Zellen, B7 und B104, nicht der Bereich der Zellen B7: B104. Und dann, genau unter deinem Code legst du die richtige Definition von 'Range (" B7: B104 ")' fest, also wechsle einfach dazu. – tigeravatar

+0

Sind sie ActiveX-Kontrollkästchen oder Formularkontrollfelder? –

+0

@tigeravatar Ich habe das gleiche getan wie du, ich habe den Code einfach aus Versehen eingefügt. – JuniorDev

Antwort

1

Das funktioniert für mich. Aber ich habe die cb # zu "1" geändert, weil ich 104 von ihnen auf meinem Testblatt nicht habe. Alle cb's im Bereich B7: B104 werden in den Wert von cb1 geändert, den Sie in Ihrem Skript in cb104 ändern können.

Sub Link_Checkboxes_To_Cells() 

    Dim cBox As CheckBox 

     For Each cBox In Sheet1.CheckBoxes 
      If Not Intersect(cBox.TopLeftCell, Range("B7:B104")) Is Nothing Then 
       If cBox.Name <> ActiveSheet.CheckBoxes("Check Box 1").Name Then 
        cBox.Value = ActiveSheet.CheckBoxes("Check Box 1").Value 
       End If 
      End If 
     Next cBox 

    End Sub 
+0

Danke für Ihre Antwort. aber seltsam, warum es nicht funktioniert. Ich habe ein neues Arbeitsbuch ausprobiert und es ist dasselbe. Muss ich eine Referenz hinzufügen? oder einige Konfigurationen? – JuniorDev

+0

Dieser Code funktionierte für mich. –

1

@JuniorDev

Es gibt ein paar Gründe, warum der obige Code nicht für Sie arbeiten. Ich werde versuchen, sie aufzulisten.

Der obige Code funktioniert für "Form Control" Checkboxen - Nicht ActiveX Typ Checkboxen. Sie benötigen einen anderen Code für ActiveX-Kontrollkästchen. Oder Sie haben kein Formularkästchen mit dem Namen "Check Box 1". Aber ich denke, das würde dir einen Fehler geben. Oder Ihre anderen Kontrollkästchen befinden sich möglicherweise nicht im Bereich ("B7: B104"). Sie können versuchen, das in Range ("A1: Z10000") zu ändern, um sicherzustellen, dass sich Ihre Checkboxen im Bereich befinden.

Wenn Sie nicht sicher sind, welche Art von Kontrollkästchen Sie haben, können Sie den folgenden Code ausführen, um ihre Namen zu finden und welche Art von Steuerelement sie sind, entweder Formular oder Activex. Es wird die Informationen in Ihrem unmittelbaren Fenster des VB-Editors drucken.

Sub CheckboxLoop() 
'PARTIAL SOURCE: www.TheSpreadsheetGuru.com/the-code-vault 
Dim cb As Shape 

'Loop through Form Checkboxes 
    For Each cb In ActiveSheet.Shapes 
    If cb.Type = msoFormControl Then 
     If cb.FormControlType = xlCheckBox Then 
      Debug.Print "Form Control: " & cb.Name 
     End If 
    End If 
    Next cb 

'Loop through ActiveX Checkboxes 
Dim ChkBx As OLEObject 
For Each ChkBx In ActiveSheet.OLEObjects 
    If TypeName(ChkBx.Object) = "CheckBox" Then 
     Debug.Print "ActiveX Control: " & ChkBx.Name 
    End If 
Next ChkBx 
End Sub