Ok, los gehts mit der Beschreibung für den "With"-Block (zumindest das war er bewirken soll). Für jedes Shape, welches sich im Arbeitsblatt "Checklist Structure" soll geprüft werden, ob das eine Check Box des Typus Form Control ist. Wenn ja, dann soll ihr Name mit den vorhandenen Einträgen der Spalte G im Arbeitsblatt "Risk Category Structure" abgeglichen werden. Wenn der Name der Check Box vorhanden ist, dann soll das Kästchen aktiviert werden, wenn nicht, dann deaktiviert werden. Diese Vorgehensweise soll wiederholt werden, bis keine Checkboxen mehr übrig sind...
Ok. Der fett markierte Teil stimmt nicht mit dem überein was da steht bzw. ist gar nicht vorhanden.
Du willst doch prüfen ob die Bezeichnung (angezeigte Name) dieses Shapes 'shp'in Spalte G vorhanden ist. Also kommt dort eine leicht modifizierte Version von dem unter diesem Link geposteten Code:
Hier ist er noch mal:
Sub RangeFind_Beispiel()
Dim rng As Excel.Range
Dim rngErg As Excel.Range
Set rng = Columns("G") 'bzw. Range("G:G")
'LookIn := xlValues ... in den Zelleninhalt soll geschaut werden
'LookAt := xlWhole ... gesamte Zelleninhalt muss dem gesuchten Wert entsprechen
Set rngErg = rng.Find("Suchwert", LookIn:=xlValues, LookAt:=xlWhole)
'Wenn was gefunden wurde...
If Not rngErg Is Nothing Then
'... dann z.B. Ausgabe der Zelladresse
Call MsgBox(rngErg.Address, vbInformation)
End If
End Sub
Nun ist in dem aktuellen Fall der Suchwert kein konstante konstante Zeichenkette (String) mehr, sondern kommt von der CheckBox (der Bezeichner / angezeigte Name).
also wird daraus:
Set rngErg = rng.Find(shp.OLEFormat.Object.Caption, LookIn:=xlValues, LookAt:=xlWhole)
'>>
If Not rngErg Is Nothing Then
shp.OLEFormat.Object.Value = True
Else
shp.OLEFormat.Object.Value = False
End If
'<< ODER der If-Block kürzer geschrieben >>
shp.OLEFormat.Object.Value = Not rngErg Is Nothing
'<<
Dies kommt jetzt in das innerste der If-Blöcke.
Final also so (Namen auf deine jetzt umgeändert):
Private Sub CompareCheckboxNames()
Dim ws As Worksheet
Dim rng As Excel.Range
Dim rngRes As Excel.Range
Dim shp As Shape
On Error GoTo ErrHandler
Set ws = Worksheets("Risk Category Checklist")
Set rng = ws.Range("G:G")
With Worksheets("Checklist Structure")
For Each shp In .Shapes
If shp.Type = msoFormControl Then
If shp.FormControlType = xlCheckBox Then
Set rngRes = rng.Find(shp.OLEFormat.Object.Caption, LookIn:=xlValues, LookAt:=xlWhole)
'>>
If Not rngRes Is Nothing Then
shp.OLEFormat.Object.Value = True
Else
shp.OLEFormat.Object.Value = False
End If
'<< ODER der gesamte If-Block kürzer geschrieben >>
'shp.OLEFormat.Object.Value = Not rngRes Is Nothing
'<<
' Exit For
End If
End If
Next
End With
Exit Sub
ErrHandler:
Call MsgBox(Err.Description, vbCritical, "Fehler " & Err.number)
End Sub
Warum das Exit-For dort steht weiß ich nicht, es gehört ansich nicht dorthin (daher auskommentiert).
|