Steuerelemente mit VBA erstellen
#1
Hallo Leute,

ich möchte mittels eines Makros Steuerelemente (konkret: eine DropDown-Liste und eine ScrollBar) in einer bestimmten Formatierung einfügen. Ich scheitere jedoch schon beim einfachen Einfügen der Elemente. Da ich mich nicht besonders gut mit Makros auskenne, habe ich die Aufzeichnungsfunktion genutzt. Diese ergab für die ScrollBar folgenden Code:

ActiveSheet.ScrollBars.Add(139.5, 67.5, 56.25, 18.75).Select
    Range("D6").Select
    ActiveSheet.Shapes.Range(Array("Scroll Bar 1")).Select
    With Selection
        .Value = 0
        .Min = 80
        .Max = 120
        .SmallChange = 1
        .LargeChange = 10
        .LinkedCell = "$F$6"
        .Display3DShading = True
    End With
    Range("D6").Select
    ActiveSheet.Shapes.Range(Array("Scroll Bar 1")).Select
    ActiveSheet.Shapes("Scroll Bar 1").ScaleWidth 1.1333333333, msoFalse, _
        msoScaleFromBottomRight
    ActiveSheet.Shapes("Scroll Bar 1").ScaleHeight 1.4, msoFalse, _
        msoScaleFromBottomRight
    ActiveSheet.Shapes("Scroll Bar 1").ScaleWidth 1.0352941176, msoFalse, _
        msoScaleFromTopLeft
    ActiveSheet.Shapes("Scroll Bar 1").ScaleHeight 0.5714285714, msoFalse, _
        msoScaleFromTopLeft
    Range("D6").Select

So wie ich es verstehe, passiert nun folgendes:
1. ScrollBar wird erstellt (ich weiß nicht was die nummern in der Klammer bedeuten)
2. Die ScrollBar mit dem Namen "Scroll Bar 1" wird editiert
3. Die Größe und Position wird angepasst (das habe ich gemacht, indem ich die ScrollBar ausgewählt habe und sie mit gedrückter Alt-Taste einer Zelle angepasst habe)

Mein Problem ist jetzt aber, wenn ich die ScrollBar lösche und das Makro erneut ausführe, hängt es bei der Editierung. Meine Vermutung ist, dass die neu erstellte ScrollBar nicht den Namen "Scroll Bar 1" hat und somit auch nicht zum Bearbeiten ausgewählt werden kann.

Deshalb habe ich folgende Fragen:
Wie funktioniert die Syntax bei der Erzeugung von Steuerelementen?
Wie erstelle ich Steuerelemente mit von mir festgelegten Namen?
Wie kann man Steuerelemente mittels Makro an die Größe einer Zelle anpassen und auf dem Blatt anordenen (z.B. genau auf einer Zelle)?


Vielen Dank für Eure Antworten
Gruß Max
Top
#2
Hat niemand eine Idee? Ich wäre für alle Vorschläge dankbar
Top
#3
Hallo Max,

am Einfachsten ist es mit einer With-Anweisung, weil dann der Name des neuen Objektes egal ist.
Sub BildlaufleisteEinfuegen()
 Dim rngZ As Range
 Set rngZ = Range("D6")
 With ActiveSheet.ScrollBars.Add(rngZ.Left, rngZ.Top, rngZ.Width, rngZ.Height)
   .Value = 0
   .Min = 80
   .Max = 120
   .SmallChange = 1
   .LargeChange = 10
   .LinkedCell = "$F$6"
   .Display3DShading = True
   .Name = "MeineBildlaufleiste"
 End With
End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Maxm
Top
#4
(25.10.2016, 09:21)Kuwer schrieb: Hallo Max,

am Einfachsten ist es mit einer With-Anweisung, weil dann der Name des neuen Objektes egal ist.
Sub BildlaufleisteEinfuegen()
 Dim rngZ As Range
 Set rngZ = Range("D6")
 With ActiveSheet.ScrollBars.Add(rngZ.Left, rngZ.Top, rngZ.Width, rngZ.Height)
   .Value = 0
   .Min = 80
   .Max = 120
   .SmallChange = 1
   .LargeChange = 10
   .LinkedCell = "$F$6"
   .Display3DShading = True
   .Name = "MeineBildlaufleiste"
 End With
End Sub
Gruß Uwe


Hi Uwe,

danke für deine Hilfe. Der Code klappt super :)

Nur zum Verständnis:
Du führst eine Objektvariable "rngZ" ein und sie bekommt D6 zugewiesen. Dadurch sind die Maße und Position von Zelle D6 in der Obejektvariable gespeichert. Dann erzeugst du die ScrollBar und nutzt die gespeicherten Maße für die richtige Positionierung. Die With-Anweisung nutzt du weiter, um die Eigenschaften (u.a. Name) des Objekts zu verändern.
Wenn ich jetzt wieder auf das Objekt zugreifen will, dann würde ich einen Array auf den Namen nutzen oder? Also zum Beispiel so:
Sub loeschen()
    ActiveSheet.Shapes.Range(Array("MeineBildlaufleiste")).Delete
End Sub

Ist das so richtig? Ich habe noch nicht so viel Erfahrung mit dem Schreiben von Makros. Deshalb würde ich es gerne genau verstehen.

Gruß Max
Top
#5
Zitat:Ich habe noch nicht so viel Erfahrung mit dem Schreiben von Makros.


Dann wäre es besser nicht an zu fangen mit das erstellen von ActiveX controls in VBA.
Benütze Developer/design mode um ActiveX-controls zu erstellen.
Top
#6
Hallo Max,

(25.10.2016, 11:03)Maxm schrieb: Wenn ich jetzt wieder auf das Objekt zugreifen will, dann würde ich einen Array auf den Namen nutzen oder?

ich würde es direkt ansprechen. Im Beispiel wird das Teil im Wechsel ein- und ausgeblendet:
  With ActiveSheet.ScrollBars("MeineBildlaufleiste")
   .Visible = Not .Visible
 End With

@snb
Es geht nicht um ActiveX-Controls!

Gruß Uwe
Top
#7
Dafür (form controls) gillt dasselbe: nicht für VBA Anfänger.
Top
#8
(25.10.2016, 14:23)Kuwer schrieb: Hallo Max,


ich würde es direkt ansprechen. Im Beispiel wird das Teil im Wechsel ein- und ausgeblendet:
  With ActiveSheet.ScrollBars("MeineBildlaufleiste")
   .Visible = Not .Visible
 End With

Gruß Uwe

Hi Uwe,

nochmal danke für die Hilfe. Ich hätte es mit einem Array gemacht, da dieser in der Makroaufzeichnung genutzt wurde. Direkt ansprechen ist aber in der Tat einfacher.

Gruß Max
Top


Gehe zu:


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