Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1328to1332
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Shapes in VBA ansprechen
21.09.2013 11:28:58
Felix
Guten Morgen Excelfreunde,
ich habe ein kleines Problem und möchte das gerne hier fix schildern.
Und zwar habe ich ein wenig mit VBA experimentiert um eine Prozesskette zu veranschaulichen. Durch anklicken der grauen Symbole werden Makros ausgelöst, die wiederum die blauen Symbole erstellen, wo sie gerade gebraucht werden. Dass Excel vielleicht nicht die Beste Wahl dafür ist und es auch bereits gute Programme dafür gibt ist da erst einmal nebensächlich.
Nun möchte ich gerne die erstellten Shapes anwählen, um einmal alle zu kopieren und einmal das letzte zu löschen.
Auf meiner Suche im Netz bin ich bereits auf einen Ansatz gestoßen, so ganz funktioniert es jedoch leider noch nicht.
Sub ShapesAnsprechen()
counter = 0
For Each bilder In ActiveSheet.Shapes
If bilder.Type = 17 Then
ReDim Preserve alle_bilder(0 To counter)
alle_bilder(counter) = bilder.Name
counter = counter + 1
End If
Next bilder
ActiveSheet.Shapes.Range(alle_bilder).Select
End Sub
Dieser Code spricht alle Felder mit der Nummerierung im rechten unteren Bereich der Flächenelemente an.
Wenn ich nun die If und die End If Zeilen auskommentiere, dann sind plötzlich alle "Bilder" markiert, also sowohl die alles was blau ist (so solls sein) als auch die grauen Elemente, welche ich gerne unmarkiert lassen würde. Ich habe mir überlegt, eventuell den Shapes namen zuordnen zu können, welche einer fortlaufenden Nummerierung entsprechen um sie gezielt anwählen zu können, indem ich einmal sage "höchste Zahl anwählen" und einmal eben "ab höchster zahl bis 1". Das Problem ist, dass With .name = die Schriftart des Textes im Shape ändert und ich daher nicht weiß, welcher Befehl einen "Namen" zuweist.
Nachdem ich an mehrere Ansätzen bereits gescheitert bin, sehe ich hiermit bereits Licht am Ende des Tunnels und wäre total dankbar und froh, wenn mir jemand den entscheidenden Hinweis geben könnte.
In diesem Sinne, vielen Dank und Viele Grüße
Felix
Userbild

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Mit 'bilder.Type = 17' triffst du ja eine ...
21.09.2013 12:52:42
Luc:-?
…Auswahl, Felix;
lässt du die weg, wdn eben alle Bilder, d.h.Shapes angesprochen. Mit eigenen Namen kann man sie schon ansprechen, wenn sie tatsächlich einzeln vorliegen (nicht in Gruppierungen, dann muss man über die Gruppe indizieren), genauso wie mit Indizes, also zB Shapes("Bild1").
Gruß Luc :-?

AW: Shapes in VBA ansprechen, umbenennen
21.09.2013 15:40:28
fcs
Hallo Felix,
du kannst die Shapes über den Namen ansprechen. Es geht aber auch über die Zelle in der sich die linke obere Ecke des Shapes befindet. In deinem Fall könntest du alle Shapes selektieren, die sich links von einer bestimmten Spalte befinden.

Sub ShapesAnsprechen()
Dim objShape As Shape
Dim alle_bilder(), counter As Integer
counter = 0
For Each objShape In ActiveSheet.Shapes
'        If Left(objShape.Name, 3)  "LX_" Then
If objShape.TopLeftCell.Column  0 Then
ActiveSheet.Shapes.Range(alle_bilder).Select
End If
End Sub

Das letzte eingefügte Shape kann man über die Index-Nummer ansprechen.
Sub ShapesAnsprechenLetztes()
Dim objShape As Shape
With ActiveSheet
Set objShape = .Shapes(.Shapes.Count)
End With
objShape.Select
End Sub

Falls du die nicht zu selektierenden Shapes über den Namen ausschliessen möchtest, dann solltest du eine "ungewöhnliche" Prefix verwenden. Auch für das Umbenennen hier ein makro.

Sub ShapesUmbenennen()
Dim objShape As Shape, strNeuername As String, Spalte As Long, PreFix As String
Spalte = 7 'Spalte G - Shapes rechts von dieser Spalte erhalten die PreFix
PreFix = "LX_" 'Zeichenfolge, die den Namen vorangestellt wird
For Each objShape In ActiveSheet.Shapes
With objShape
If .TopLeftCell.Column > Spalte Then
.Select
ActiveWindow.ScrollRow = .TopLeftCell.Row
ActiveWindow.ScrollColumn = .TopLeftCell.Column
strNeuername = InputBox("TopLeftcell: " & .TopLeftCell.Address & vbLf _
& "ID: " & .ID & vbLf & vbLf & "Neuer Name:", "Name: " & .Name, PreFix & .Name)
If strNeuername  "" Then
.Name = strNeuername
End If
End If
End With
Next
End Sub

Gruß
Franz

Anzeige
AW: Shapes in VBA ansprechen, umbenennen
22.09.2013 17:25:09
Felix
Hallo Franz,
du siehst mich über alle Maßen begeistert.
Darauf aufbauend würde ich gerne noch eine letzte Frage stellen.
Und zwar würde ich die markierten shapes gerne in eine Worddatei an die Stelle eines definierten Bookmarks setzen. Der dafür bisher verwendete Code öffnet zwar diese Datei, fügt jedoch nichts ein, obwohl die Shapes anschließend in Excel alle markiert sind.
Welchen Schritt habe ich vergessen?
Sub Fertigstellen()
Dim objShape As Shape
Dim alle_bilder(), counter As Integer
counter = 0
For Each objShape In ActiveSheet.Shapes
If objShape.TopLeftCell.Column  0 Then
ActiveSheet.Shapes.Range(alle_bilder).Select
End If
Selection.Copy
Set doc = app.Documents.Add("C:\Users\Felix\Desktop\Prozesskette.docm")
docname = ("Prozesskette.docm")
app.Visible = True
On Error Resume Next
doc.Bookmarks("Hier").Select
If Err.Number = 0 Then
app.Selection.InsertAfter Selection
End If
Err.Clear
End Sub
Viele Grüße
Felix

Anzeige
AW: Shapes in VBA ansprechen, umbenennen
23.09.2013 11:33:46
fcs
Hallo Felix,
du musst hier mit der PasteSpecial-Methode von Word arbeiten, um die Grafikelemente aus Excel in Word einzufügen. Für die korrekte Einfüge-Option ggf. in Word mit dem Makro-Recorder das Einfügen der in Excel kopierten Elemente aufzeichnen.
Grundvoraussetzung ist natürlich auch, dass du die app-Objektvariable schon mit Leben (Word-Application) gefüllt hast.
Gruß
Franz
Sub Fertigstellen()
Dim objShape As Shape
Dim alle_bilder(), counter As Integer
counter = 0
For Each objShape In ActiveSheet.Shapes
If objShape.TopLeftCell.Column  0 Then
ActiveSheet.Shapes.Range(alle_bilder).Select
End If
Selection.Copy
Set doc = app.Documents.Add("C:\Users\Felix\Desktop\Prozesskette.docm")
docname = ("Prozesskette.docm")
app.Visible = True
doc.Bookmarks("Hier").Select
On Error Resume Next
If Err.Number = 0 Then
doc.Bookmarks("Hier").Range.PasteSpecial Link:=False, DataType:=23, Placement:=0, _
DisplayAsIcon:=False '  Placement:= 0 = wdInLine _
DataType:=23 = Microdsoft Grafik-Objekt - Einzelobjekte wie in Excel _
9 = Bild wdPasteEnhancedMetafile _
14 = einfügen als Bild _
15 = einfügen als JPG-Bild
End If
Err.Clear
End Sub

Anzeige
Vielen Dank Franz und Luc
23.09.2013 13:34:14
Felix
Es ist immer wieder schön zu sehen, dass Menschen über so ein Wissen verfügen und es gerne mit Anderen teilen.
Schöne Sache das!

11 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige