Excel vba Properties von Shapes & Commandbutton
#1
Photo 
Hallo zusammen,

könntet Ihr mir wieder mal bei einer Aufgabe helfen?

Ich möchte aus allen Tabellenblättern von jeweils allen platzierten Shapes und Commandbuttons  sämtliche Properties auslesen und in ein neu eingefügtes Tabellenblatt schreiben.
Also etwa in der Form:


ShapePropertiesAll
ABCDEFGHI
1Shape NameShape TypeHeightWidthLeftTopMarginLeftMarginRightSheet Name
2Rechtwinkliges Dreieck 1Rechtwinkliges Dreieck 1505025102,834645748138432,83464574813843Contents
3Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Test
4Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Rechnung
5Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Erich
6Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Global
7Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Tabelle5
8Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Hans
9Rounded Rectangle 1_ContentButtonRounded Rectangle 1_ContentButton206020047,199999809265147,19999980926514Tabelle9
10CommandButton1CommandButton138,25169,56038,25

Füllfarben und Muster
Zelle Rot Grün Blau Color Muster Farbe
A1:I1 255255065535
Zellen mit Füllfarbe automatisch werden nicht dargestellt



Code:
  'Add headings for our lists. Expand as needed
  WsNew.Range("A1:I1") = Array("Shape Name", "Shape Type", "Height", "Width", "Left", "Top", "MarginLeft", "MarginRight", "Sheet Name")
  'Loop through all Worksheet
  For Each wsLoop In Worksheets
      'Loop through all shapes on Worksheet
      For Each sShapes In wsLoop.Shapes
        'Increment Variable lLoop for row numbers[img]file:///I:/User/Downloads/Unbenannt.JPG.html[/img]
        lLoop = lLoop + 1
        With sShapes
            'Add shape properties
            WsNew.Cells(lLoop + 1, 1) = .Name
            WsNew.Cells(lLoop + 1, 2) = .OLEFormat.Object.Name
            WsNew.Cells(lLoop + 1, 3) = .Height
            WsNew.Cells(lLoop + 1, 4) = .Width
            WsNew.Cells(lLoop + 1, 5) = .Left
            WsNew.Cells(lLoop + 1, 6) = .Top
            'Follow the same pattern for more
            WsNew.Cells(lLoop + 1, 7) = .TextFrame2.MarginLeft
            WsNew.Cells(lLoop + 1, 8) = .TextFrame2.MarginRight
            WsNew.Cells(lLoop + 1, 9) = wsLoop.Name
        End With
      Next sShapes
  Next wsLoop
  'AutoFit Columns.
  WsNew.Columns.AutoFit

Wenn jetzt ein Commandbutton behandelt wird, werden zwar die Koordinaten ausgelesen aber dann kommt bei "TextFrame2.MarginLeft" usw. natürlich eine Fehlermeldung.
Bei Shapes funktioniert das aber hier nicht.

Wie kann ich a) den Fehler umgehen und b) auslesen welcher Text auf dem Button steht?
Schön wäre auch den Text von den allen Shapes auszulesen zu können.

Habt Ihr mir da ev. einen Lösungsvorschlag?
Top
#2
Hast du da eine Beispieldatei?
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Top
#3
Hallo,

kuckst Du hier die Beispieldatei.


Angehängte Dateien
.xlsm   Test_Properties.xlsm (Größe: 47,12 KB / Downloads: 7)
Top
#4
Hallo Erich, :19:

hier mal deine Beispieldatei zurück: :21:
[attachment=29008]
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • sharky51
Top
#5
Guten morgen Case,

das ist ja cool!

Herzlichen Dank für Deine Mühe!

Jetzt habe ich nur noch eine Frage.
Wie kann ich z.B. die "Rounded Rectangle 10_ContentButton" abhängig von der letzten Spalte, in der irgend etwas Beliebiges in einer Zeile steht, automatisch in der nächstfolgenden Spalte in Zeile "eins" platzieren? So wie z.B. auf der Tabelle "ShapePropertiesAll" zu sehen ist.

Das soll für alle Blätter gelten und die Shapes sollen natürlich in jedem Blatt automatisch platziert werden.

Ich hoffe ich habe das nicht zu umständlich beschrieben?
Top
#6
Hallo Erich, :19:

hier was zum spielen, damit du siehst, wie man Shapes positionieren kann. :21:
[attachment=29011]
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • sharky51
Top
#7
Case,

Mann-o-Mann, das ist ja so was von super!

Vielen Dank! Du, Ihr seid die Besten!!!!! Angel

Wünsche noch einen schönen Sonntag.
Top
#8
Es geht einfach so:


Es geht einfach so:

PHP-Code:
Sub M_snb()
  ReDim sn(10008)
    
  
For Each it In Sheets
    
For Each it1 In it.Shapes
      sn
(y0) = it1.Name
      sn
(y1) = it1.OLEFormat.Object.Name
      sn
(y2) = it1.Height
      sn
(y3) = it1.Width
      sn
(y4) = it1.Left
      sn
(y5) = it1.Top
      sn
(y6) = it1.TextFrame.MarginLeft
      sn
(y7) = it1.TextFrame.MarginRight
      sn
(y8) = it.Name
      y 
1
    Next
  Next
    
  Tabelle22
.Cells(201).Resize(UBound(sn), 9) = sn
End Sub 
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • sharky51
Top
#9
Hallo Case,

Nochmals cool.....das Ganze!

Aber ich habe mal ein wenig herumgespielt.
Wenn ich mehrere Shapes auf einem Blatt habe entsteht etwas Verwirrung.

Als Test habe ich mal diese drei Teile auf ein Blatt eingefügt
Button 1
Herz 1
Rechtwinkliges Dreieck 1

Mit Deinem Code schnappt sich dieser nur den Button 1 und läßt die andern beiden unbehelligt. Warum ausgerechnet den Button 1? Ich nehme an wegen der Bezeichnung, B kommt vor H usw.!
Wie kann man denn alle drei Shapes platzieren, am besten nebeneinander mit ein wenig Abstand, oder mit Angabe einer zusätzlichen Spaltenposition oder einem Offset.

Das erste Shape wird ja in die nächste freie Spalte platziert.

Code:
Sub Main2()
    Dim wksSheet As Worksheet
    For Each wksSheet In ThisWorkbook.Worksheets
        With wksSheet
            .Shapes(1).Top = .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column + 1).Top
            .Shapes(1).Left = .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column + 1).Left
        End With
    Next wksSheet
End Sub
Top
#10
Hallo Erich, :19:

nochmal was zum spielen: :21:
[attachment=29024]
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • sharky51
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste