..... Butter an den Fisch ;-)
Shapes erzeugen nach Liste
Option Explicit
Rem zeichne fehlende nach Vorgabe in Liste
Rem Mindestanforderung 1 Objekt vom Typ
Sub ZeichneNachListe()
Dim shShapes As Worksheet, shLists As Worksheet
Dim rngList As Range, rngCell As Range
Dim objShpe As Shape 'Testobjekte sind vom Typ 5 (msoShapeRoundedRectangle) !!!
Dim sngSTop As Single, sngLeft As Single
'die Tabellenobjekte
Set shShapes = Sheets("Checklist Structure")
Set shLists = Sheets("Lists")
'der Listenbereich
Set rngList = shLists.Cells(Rows.Count, "D").End(xlUp)
Set rngList = shLists.Range("D3:G" & rngList.Row)
rngList.Interior.ColorIndex = xlColorIndexNone 'rücksetzen
'im Listenbereich durch die Zellen
For Each rngCell In rngList
'prüfe jedes Zeichnungsobjekt in der Tabelle wo
For Each objShpe In shShapes.Shapes
If objShpe.TextFrame2.TextRange.Text = rngCell.Value Then _
rngCell.Interior.ColorIndex = 4 'Grün ist die Farbe der Hoffnung
Next objShpe
Next rngCell
'Treffer vertauschen
For Each rngCell In rngList
If rngCell.Interior.ColorIndex = xlColorIndexNone And _
rngCell.Value <> "" Then _
rngCell.Interior.ColorIndex = 3
Next rngCell
'jetzt die fehlenden ergänzen
'unter "richtigem" Einsatz von With.....End With
With shShapes
For Each rngCell In rngList
If rngCell.Interior.ColorIndex = 3 Then 'A Vog'l singt im Gart'n
sngSTop = .Shapes(.Shapes.Count).Top
sngSTop = sngSTop + .Shapes(.Shapes.Count).Height + 10 'Annahme
sngLeft = .Shapes(.Shapes.Count).Left 'schön untereinander
Set objShpe = .Shapes(.Shapes.Count).Duplicate 'und de Blumen blüh'n.
With objShpe
.TextFrame2.TextRange.Characters.Text = rngCell.Value 'Text ändern
'die Eigenschaften .Left und .Top usw. setzen
.Top = sngSTop 'Und wanns'd ned boid zu mir kummst
.Left = sngLeft 'is ollas aus fia mi.
End With
End If
Next rngCell
End With
End Sub
und aus den gleichen Bausteinen brät´s du dir eine Löschroutine
Option Explicit
Rem lösche fehlende nach Vorgabe in Liste
Rem Mindestanforderung Objekte vom Typ
Sub LöscheNachListe()
Dim shShapes As Worksheet, shLists As Worksheet
Dim rngList As Range, rngCell As Range
Dim objShpe As Shape 'Testobjekte sind vom Typ 5 (msoShapeRoundedRectangle) !!!
Dim sngy As Single, sngx As Single
Dim lngCnt As Long
'die Tabellenobjekte
Set shShapes = Sheets("Checklist Structure")
Set shLists = Sheets("Lists")
'der Listenbereich
Set rngList = shLists.Cells(Rows.Count, "D").End(xlUp)
Set rngList = shLists.Range("D3:G" & rngList.Row)
'Position 1. Shape
sngx = shShapes.Shapes(1).Left
sngy = shShapes.Shapes(1).Top
'in der Shapes Auflistung durch die Objekte
For Each objShpe In shShapes.Shapes
If rngList.Find( _
What:=objShpe.TextFrame2.TextRange.Characters.Text, _
LookAt:=xlWhole, _
MatchCase:=True) Is Nothing Then
objShpe.Delete
ActiveWorkbook.Save
Exit For
End If
Next objShpe
'jetzt aufrücken durch zählen
lngCnt = 1
For Each objShpe In shShapes.Shapes
If lngCnt = 1 Then
shShapes.Shapes(lngCnt).Top = sngy
shShapes.Shapes(lngCnt).Left = sngx
Else
shShapes.Shapes(lngCnt).Top = shShapes.Shapes(lngCnt - 1).Top + _
shShapes.Shapes(lngCnt - 1).Height + 10 'Annahme
shShapes.Shapes(lngCnt).Left = shShapes.Shapes(lngCnt - 1).Left
End If
lngCnt = lngCnt + 1
Next objShpe
End Sub
jetzt komponierst du dir noch eine feine Marinade,
vom Geschmack "Private Sub Worksheet_Change(ByVal Target As Range)"
und fertig ist das :O Fleischgericht :O
|