Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema InputBox
BildScreenshot zu InputBox InputBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Image
BildScreenshot zu Image Image-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema OptionButton
BildScreenshot zu OptionButton OptionButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ToggleButton
BildScreenshot zu ToggleButton ToggleButton-Seite mit Beispielarbeitsmappe aufrufen

Picture Größe in Commandbutton variabel per Code


Betrifft: Picture Größe in Commandbutton variabel per Code von: Dieter(Drummer)
Geschrieben am: 25.07.2019 11:39:04

Guten Tag VBA Spezialisten/innen.

... auch auf die Gefahr hin, zu nerven ...

... im Code(1) wird das Picture per Inputbox und ID in den Commandbutton eingefügt.
Leider kann ich die Größe des Pictures, im Code, nicht variabel halten.

Im Code(2) kann die Größe variabel im Code festgelegt werden, z.B. ", 20, 20".
Nachteil in diesem Code (2) ist, ich nicht per ID das Picture wählen kann, sondern es muss per engl. Namen angegeben werden. Eine Liste engl. Namen der Picture habe ich im Netz auch nicht gefunden.

Den Code (1) bevorzuge ich und möchte die Pícture Größe eben auch im Code, frei definieren können.

Hier eine Beispieldatei: https://www.herber.de/bbs/user/131067.xlsm

Mit der Bitte um Hilfe und nochmaligem Dank den bisherigen Helfern/innen.

Gruß, Dieter(Drummer)

Code(1)
Bisheriger Code, OHNE Größenänderung des Pictures:
'Herber: von Regina Resch-Jansen am 14.07.2019 15:43:21
'Mit Abbruch Ergänzung von: Herber: von Beverly am 16.07.2019 10:12:29

Private Sub CommandButton1_Click()
Dim lng_id As Long
lng_id = Application.InputBox("ID?", , , , , , , 1)
If lng_id = 0 Then
Else
   Set CommandButton1.Picture = Application.CommandBars.FindControl(ID:=lng_id).Picture
    CommandButton1.PicturePosition = fmPicturePositionLeftCenter 'Picture Ausrichtung links vom  _
_
Buttontext
End If
End Sub
Code(2)- Nicht bevorzugt.
Private Sub CommandButton1_Click()
  Set CommandButton1.Picture = _
        Application.CommandBars.GetImageMso("FileSave", 20, 20)
  CommandButton1.PicturePosition = 2
End Sub

  

Betrifft: ..Vorsatz hat nicht lange gehalten....... von: robert
Geschrieben am: 25.07.2019 12:02:24




  

Betrifft: Eine Auflistung... von: Beverly
Geschrieben am: 25.07.2019 12:44:25

Hi Dieter,

der englischen Namen findest du hier: https://docs.microsoft.com/en-us/openspecs/office_standards/ms-customui/bb5bb594-ec8c-45f6-8424-f98e8308b25a - gefunden ohne großen Aufwand mit dem Suchbegriff "idmso excel"...


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: Eine Auflistung... von: Dieter(Drummer)
Geschrieben am: 25.07.2019 12:56:38

Danke liebe Karin,

für den Hinweis und Link. Der Code(1) wäre mir lieber, da ich per ID den Button wählen kann.
Die Möglichkeit in diesem Code die Picture Größe anzugeben, wäre das Ziel.

Evtl. gibt es ja eine Lösung dafür. Meine Versuche haben nichts gebracht.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Eine Auflistung... von: Beverly
Geschrieben am: 25.07.2019 14:26:23

Hi Dieter,

kombiniere einfach beide Codes: übernimm dazu alle Namen aus der Auflistung im Internet in ein Tabellenblatt (kann man ausblenden) - dann kannst du die ID-Auswahl auf diese Tabelle beziehen, erhältst somit den Icon-Namen und kannst den zweiten Code für das Einfügen des Icons verwenden.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: Eine Auflistung... von: Dieter(Drummer)
Geschrieben am: 25.07.2019 15:54:28

Danke liebe Karin,

ich werde das in Ruhe Testen und es ist wohl auch eine Lösung.

Gruß und einen erträglichen Tag bei der Hitze,
Dieter(Drummer)


  

Betrifft: AW: Eine Auflistung... von: Nepumuk
Geschrieben am: 25.07.2019 17:29:37

Hallo Dieter,

ich habe es dir mal auf die schnelle eingebaut. Ist nur ein Muster zum basteln, wie z.B. die Abfrage der Icongröße.

https://www.herber.de/bbs/user/131081.xlsm

Gruß
Nepumuk


  

Betrifft: AW: Herzlichen Dank, Nepumuk ... von: Dieter(Drummer)
Geschrieben am: 25.07.2019 17:37:08

... damit kann ich schon prima weiter machen.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Eine Auflistung... von: Dieter(Drummer)
Geschrieben am: 26.07.2019 09:14:37

Guten Morgen Nepumuk,

Danke nochmal für deine prima Muster Datei.

Ich habe dem Code noch eine Zeile eingefügt, damit das Picture links und der Text im Button zentriert steht.

Wünsche noch einen schönen Tag.
Gruß, Dieter(Drummer)

'Herber: von Nepumuk am 25.07.2019 17:29:37

Private mlngMax As Long

Private Sub CommandButton1_Click()
    Dim lngID As Long
    lngID = Val(Application.InputBox(Prompt:="ID ?", Type:=1))
    If lngID > 0 Then
        If lngID <= mlngMax Then
            CommandButton1.Picture = Application.CommandBars.GetImageMso(Tabelle2.Cells(lngID,  _
1).Text, 21, 21)
              CommandButton1.PicturePosition = 2 'Mx
        Else
            Call MsgBox("Es gibt nur " & CStr(mlngMax) & " Icons.", vbExclamation, "Hinweis")
        End If
    End If
End Sub
'Herber: von Nepumuk am 25.07.2019 17:29:37
Private mlngMax As Long

Private Sub CommandButton1_Click()
    Dim lngID As Long
    lngID = Val(Application.InputBox(Prompt:="ID ?", Type:=1))
    If lngID > 0 Then
        If lngID <= mlngMax Then
            CommandButton1.Picture = Application.CommandBars.GetImageMso(Tabelle2.Cells(lngID,  _
1).Text, 21, 21)
              CommandButton1.PicturePosition = 2 'Mx
        Else
            Call MsgBox("Es gibt nur " & CStr(mlngMax) & " Icons.", vbExclamation, "Hinweis")
        End If
    End If
End Sub



  

Betrifft: AW: Eine Auflistung... von: Nepumuk
Geschrieben am: 26.07.2019 10:04:40

Hallo Dieter,

solche Eigenschaften, die sich im Verlauf eines Makros nicht ändern, solltest du fest über das Eigenschaftsfenster einstellen. Denn es ergibt keinen Sinn die selbe Eigenschaft mehrfach per Makro zu setzen.



Gruß
Nepumuk


  

Betrifft: AW: Grundsätzlich gebe ich Dir Recht, aber ... von: Dieter(Drummer)
Geschrieben am: 26.07.2019 12:05:42

Hallo Nepumuk,

... die Codezeile mit Postion 2, ergibt aber auch, dass Picture UND Text zentriert mittig ist. Wenn ich in den Eigenschaften NUR Center benutze, wird nur das Picture zentriert dargestellt.

Da mich dieses Thema auch schon einige Zeit beschäftigte, habe ich mal eie Userform mit diversen Commandbuttons erstellt, mit allen verschiedenen Variante. Z.B. wo soll im Button das Picture erscheinen und wo der Button Text. Hier meine Datei dazu: https://www.herber.de/bbs/user/131095.xlsm

Ich denke die Code Zeile macht dennoch Sinn, zumindest bei mehreren Buttons. Ich fand das sehr intressant.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Sorry neue Datei anbei ... von: Dieter(Drummer)
Geschrieben am: 26.07.2019 12:09:57

... war kleiner Fehler im Aufruf der Userform: https://www.herber.de/bbs/user/131096.xlsm

Gruß, Dieter(Drummer)


  

Betrifft: AW: Sorry neue Datei anbei ... von: Nepumuk
Geschrieben am: 26.07.2019 14:22:46

Hallo Dieter,

1. Auch in der neuen Userform hast du die Bildpositionen hart im Code verdrahtet. Sprich du änderst sie im Code nie und könntest sie also auch im Entwurfsmodus in den Eigenschaften festlegen. Zudem benutzt du an Stelle der vorgesehenen Konstanten deren numerisches Äquivalent. Das hat zwei Nachteile. 1. muss ich nachschauen was sich z.B. hinter der 8 verbirgt, und 2. ist es so dass der Compiler für jede Nummer erst mal einen Speicherplatz reservieren muss um mit ihr arbeiten zu können. Die Konstante (für die 8 = fmPicturePositionAboveRight) ist dagegen schon im Arbeitsspeicher vorhanden da alle Konstanten der benutzen Verweise beim Starten der Mappe schon geladen sind. Die Namen der Konstanten findest du im Objektkatalog wenn du als Suchbegriff (in die Combobox links vom Fernglas) "PicturePosition" eingibst. Wenn du darin z.B. auf fmPicturePositionAboveRight klickst, dann siehst du in der "Statusleiste" des Objektkataloges deren numerischen Wert und welcher Klasse es angehört. Und wenn du dann da auf den Klassennamen fmPicturePosition klickst siehst du dass es sich um eine Auflistung (Enumeration) handelt. Sprich du kannst diese als Variablentyp benutzen. Füge mal in dem Modul des Userform folgende Prozedur ein:

Private Sub Test(ByVal pvenmPosition As fmPicturePosition)
    MsgBox pvenmPosition
End Sub

Wenn du jetzt in irgendeiner anderen Prozedur des UserForms schreibst: Call Test und sobald du die Klammer öffnest werden dir alle möglichen Werte der Enumeration angezeigt.


2. Dabei: UserForm1.CommandButton15.Caption = "... weg" ist die Angabe des Userforms redundant, da die Anweisung sich ja im Klassenmodul des UserForm1 befindet und das kennt auch ohne Angabe seine Controls. Es macht den Code auch nicht besser leserlich denn ich denke, wenn ich eine "unnötige" Objektangabe sehe, du willst in einem anderen Userform was machen. Genauso verhält es sich in anderen Klassenmodulen. Z.B. im Modul einer Tabelle. Wenn du darin z.B. den Schutz dieser Tabelle aufheben willst, dann musst du nicht ActiveSheet.Unprotect oder Worksheets("Tabellex").Unprotect oder Me.Unprotect schreiben sondern einfach nur Unprotect. Denn das ist eine Methode der Klasse und die kennt ihre Methoden.


3. Das:

Dim ctrl As Control
For Each ctrl In Me.Controls
    If LCase(TypeName(ctrl)) = "label" Then
        ctrl.Visible = False
    End If
Next ctrl

Ist unproduktiv denn da gibt es eine bessere Methode ohne 2 zusätzliche Funktionen (LCase und TypeName) zu bemühen. Nämlich so:

Dim ctrl As Control
For Each ctrl In Me.Controls
    If TypeOf ctrl Is MSForms.Label Then ctrl.Visible = False
Next ctrl

Das ist wesentlich schneller. Das darfst du aber bei OptionButtons, CheckBoxes und ToggleButton nicht verwenden da diese nur Ableitungen einer Familie sind und daher alle wahr zurückgeben würden.


4. Und wenn ich schon dabei bin. Von fast allen String-Funktionen gibt es 2 Varianten. Z.B. gibt es: LCase und LCase$. Die machen im Prinzip das selbe nur der Datentyp den sie zurückgeben unterscheidet sich. Ohne $-Zeichen wird ein Variant-Untertyp String zurückgegeben mit $-Zeichen ein direkter String. Ein Variant ist der langsamste Datentyp in VBA. Da du von diesen Funktionen sowieso immer einen String erwartest solltest du dir angewöhnen das $-Zeichen immer zu benutzen. Welche Funktionen davon betroffen sind findest du im Objektkatalog wenn du als Suchbegriff "Strings" eingibst.

So, genug der Lehrstunde auf geht's zum Üben.

Gruß
Nepumuk


  

Betrifft: AW: Herzlichen Dank Nepumuk, für ... von: Dieter(Drummer)
Geschrieben am: 26.07.2019 15:01:54

Hallo Nepumuk,

... die umfassende und ausführlchen Erklärungen. Damit bin ich ja einige Zeit genug beschäftigt um das zu verstehen und umzusetzen.

Danke und einen erfreulichen Tag.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Danke Nepumuk ... von: Dieter(Drummer)
Geschrieben am: 26.07.2019 17:17:34

... Deine Hinweise zu 1, 2 und 3, konnte ich schon umsetzen. das waren gute Hinweise, die auch prima funktionieren.

Mit 4. muss ich mich noch durch arbeiten, aber den Hinweis im Objektatalog habe ich schon gefunden.
Danke nochmal und ich werde weiter probieren.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Picture Größe in Commandbutton variabel per Code von: Nepumuk
Geschrieben am: 25.07.2019 15:00:40

Hallo Dieter,

teste mal:

Private Sub CommandButton1_Click()
    
    Dim lngID As Long, lngSize As Long
    Dim strPath As String
    Dim objCommandBarControl As CommandBarControl
    Dim objPicture As IPictureDisp
    Dim objImageFile As Object
    Dim objImageProcess As Object
    
    lngID = Val(Application.InputBox(Prompt:="ID?", Type:=1))
    
    If lngID > 0 Then
        
        Set objCommandBarControl = Application.CommandBars.FindControl(ID:=lngID)
        
        If Not objCommandBarControl Is Nothing Then
            
            lngSize = Val(Application.InputBox(Prompt:="SIZE?", Type:=1))
            
            If lngSize > 0 Then
                
                strPath = Environ$("TEMP") & "\Temp.bmp"
                
                Set objPicture = objCommandBarControl.Picture
                
                Call stdole.SavePicture(Picture:=objPicture, Filename:=strPath)
                
                Set objImageFile = CreateObject(Class:="WIA.ImageFile")
                Set objImageProcess = CreateObject(Class:="WIA.ImageProcess")
                
                Call objImageFile.LoadFile(Filename:=strPath)
                
                Call objImageProcess.Filters.Add(FilterID:=objImageProcess.FilterInfos("Scale").FilterID)
                
                With objImageProcess.Filters(1)
                    .Properties("PreserveAspectRatio") = True
                    .Properties("MaximumWidth") = lngSize
                    .Properties("MaximumHeight") = lngSize
                End With
                
                Set objImageFile = objImageProcess.Apply(Source:=objImageFile)
                
                Set CommandButton1.Picture = objImageFile.FileData.Picture
                
                Set objCommandBarControl = Nothing
                Set objPicture = Nothing
                Set objImageFile = Nothing
                Set objImageProcess = Nothing
                
                Call Kill(PathName:=strPath)
                
            End If
        Else
            Call MsgBox("ID nicht gefunden!", vbExclamation, "Hinweis")
        End If
    End If
End Sub

Gruß
Nepumuk


  

Betrifft: AW: Picture Größe in Commandbutton variabel per Code von: Dieter(Drummer)
Geschrieben am: 25.07.2019 16:16:49

Danke Nepumuk,

es funktioniert wie gewünscht.
Es gibt nur einen Unterschied, die Pictures habe immer eine schwarze Fläche. Es werden wohl nicht die Pictures aufgerufen, wie in der Musterdatei anbei: https://www.herber.de/bbs/user/131080.xlsm

Ich kann nicht erkennen, wieso da andere Pictures aufgerufen werden.

Dennoch Dannke für deine funktionierenden Code.

Gruß und einen eträglichen Tag bei der Hitze,
Dieter Drummer


  

Betrifft: AW: Picture Größe in Commandbutton variabel per Code von: Nepumuk
Geschrieben am: 25.07.2019 16:30:41

Hallo Dieter,

das liegt daran, dass ich die Icons als BMP speichern muss. Dabei geht die Transparenz verloren. Ich wollte auch nur zeigen dass es geht. Ich würde es auch so machen wie Karin empfohlen hat. Die Namen in eine ausgeblendeten Tabelle und dann über die ID = Zeilennummer darauf zugreifen.

Gruß
Nepumuk


  

Betrifft: AW: Danke für Info, Nepumuk ... von: Dieter(Drummer)
Geschrieben am: 25.07.2019 16:36:04

... werde mich mit Karin's Variante beschäftigen.

Gruß, Dieter(Drummer)


  

Betrifft: AW: Picture Größe in Commandbutton variabel per Code von: Dieter(Drummer)
Geschrieben am: 25.07.2019 16:25:35

Sorry Nepumuk,

wenn ich die Datei speichere und wieder aufrufe, ist das Piture nicht mehr mit schwarzem Rand.
Wieso das so ist, kann ich nicht feststellen.

Gruß, Dieter(Drummer)


Beiträge aus den Excel-Beispielen zum Thema "Picture Größe in Commandbutton variabel per Code"