VBA: Schaltflächen im Sheet via VBA dimensionieren
#1
Hallo Ihr Wissenden,

folgende Situation
  • in einer Mappe habe ich auf diversen Blättern jeweils Schaltflächen, die Makros auslösen
  • wenn das/die Makro/s abläuft/ablaufen, verändern sich (ohne, dass ich das will!) die Schaltflächen
    • sie werden größer oder kleiner
    • sie werden breiter oder schmaler
    • die Schriftarten der Flächen werden größer oder unleserlich klein
Schon früher erfuhr ich, dass das bei VBA-Makros passieren könne. Pragmatischerweise wollte ich nun einfach im Makro dafür sorgen, dass den Schaltflächen ihre Dimensionen einfach immer wieder zugewiesen werden. Dazu wollte ich bei Aktivierung eines Blattes den aktuellen (Ausgangs-)Zustand auslesen und abspeichern und im Makro dann immer wieder den Schaltflächen die gespeicherten Eigenschaften neu zuweisen.
Damit ergibt sich für mich das Problem, dass ich die Schaltflächen ansprechen muss. Zunächst habe ich mir mal einen benutzerdefinierten Typ 'ButtonDim' erstellt, in dem ich sowas wie Höhe, Breite, Font-Name, etc. speichern kann. Nun:
  • dimensioniere ich die Flächen als 'CommandButton' (will heißen, ich erstelle jeweils eine Objektvariable dieses Typs, der ich nacheinander die div. Buttons zuweise) dann
    • werden mir von Intellisync verschiedene Eigenschaften wie z.B. 'width' und 'height' nicht angeboten
    • aber ich kann sie auslesen (und die jeweiligen Werte speichern)
    • wenn ich später der Fläche wieder genau diese Werte zuweise, erscheint diese aber erheblich kleiner
  • dimensioniere ich die Flächen dagegen als 'Shapes("[Name der Fläche]")', dann
    • weiß ich nicht so genau, wie ich den Font-Namen und ~größe auslese
    • bzw. wieder zuweise
Warum dieses Verhalten, wie kann ich das sinnvoll lösen (und wie kann ich dieses 'eigenmächtige' Verhalten von VBA in der Veränderung der Schaltflächen vielleicht generell verhindern)

Danke für Eure Hinweise,
RaiSta
 Man(n) ist nie zu alt für die Erkenntnis, dass das bisher Gelernte doch nur bedingt gültig oder auch nur brauchbar ist. 27
Antworten Top
#2
Hallo,
warum das so passiert, weiß vielleicht der Geier, ich nicht.
In einem Projekt hatte ich das gtleiche Problem, die Buttons wurden immer kleiner.
Die je Blatt von 1 bis x durchnummerierten Buttons wurden in der Schleife
Code:
    Namen = [{"Geschäftsdatenbank", 0; "Kundendatenbank", 13;"Kasse",19;"Anbieter-Abrechnung",25;"Mitarbeiter",28;"Mitarbeiter-Abrechnung",32}]
  For Each sh In ThisWorkbook.Sheets
    For i = 1 To 6
      If sh.Name = Namen(i, 1) Then
        For Each but In sh.Shapes
          If Left(but.Name, 7) = "Command" Then
            k = Val(Mid(but.Name, 14)) + Namen(i, 2)
            but.Top = Daten(k, 1)
            but.Left = Daten(k, 2)
            but.Height = Daten(k, 3)
            but.Width = Daten(k, 4)
          End If
        Next but
      End If
    Next i
  Next sh
wiederr auf ihr Normalmaß gesetzt. Im Feld Namen waren die Namen der Sheets und ein Korrekturglied, um aus der Buttonnummer das richtige Daten-Element zu finden. Daten enthielt die richtigen Top...Width-Werte der Buttons.
Es funktionierte, ausgeführt habe ich es in Workbook_Open und bei Worksheet_Activate.
Die Variable but hat auch Eigenschaften but.DrawingObject.Object.Font oder ...FontSize.
Gruß der AlteDresdner (Win11, Off2021)
[-] Folgende(r) 1 Nutzer sagt Danke an AlterDresdner für diesen Beitrag:
  • RaiSta
Antworten Top
#3
Moinsen,

über die .OLEFormat.Object-Eigenschaft kannst du auf das Control- Objekt zugreifen. Wenn du aber zufällig nur das Click-Event benutzt, kannst du auch darüber nachdenken auf Shapeobjekte als Klickempfänger zurückzugreifen. Oder du verwendest Zellobjekte als Steuerelement.

Viele Grüße
derHöpp
Antworten Top


Gehe zu:


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