Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
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
Inhaltsverzeichnis

Picture Größe in Commandbutton variabel per Code

Picture Größe in Commandbutton variabel per Code
25.07.2019 11:39:04
Dieter(Drummer)
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

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
..Vorsatz hat nicht lange gehalten.......
25.07.2019 12:02:24
robert
Eine Auflistung...
25.07.2019 12:44:25
Beverly
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"...


AW: Eine Auflistung...
25.07.2019 12:56:38
Dieter(Drummer)
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)
Anzeige
AW: Eine Auflistung...
25.07.2019 14:26:23
Beverly
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.


AW: Eine Auflistung...
25.07.2019 15:54:28
Dieter(Drummer)
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)
AW: Eine Auflistung...
25.07.2019 17:29:37
Nepumuk
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
Anzeige
AW: Herzlichen Dank, Nepumuk ...
25.07.2019 17:37:08
Dieter(Drummer)
... damit kann ich schon prima weiter machen.
Gruß, Dieter(Drummer)
AW: Eine Auflistung...
26.07.2019 09:14:37
Dieter(Drummer)
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  0 Then
If lngID CommandButton1.PicturePosition = 2 'Mx
Else
Call MsgBox("Es gibt nur " & CStr(mlngMax) & " Icons.", vbExclamation, "Hinweis")
End If
End If
End Sub

Anzeige
AW: Eine Auflistung...
26.07.2019 10:04:40
Nepumuk
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.
Userbild
Gruß
Nepumuk
AW: Grundsätzlich gebe ich Dir Recht, aber ...
26.07.2019 12:05:42
Dieter(Drummer)
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)
Anzeige
AW: Sorry neue Datei anbei ...
26.07.2019 14:22:46
Nepumuk
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
Anzeige
AW: Herzlichen Dank Nepumuk, für ...
26.07.2019 15:01:54
Dieter(Drummer)
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)
AW: Danke Nepumuk ...
26.07.2019 17:17:34
Dieter(Drummer)
... 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)
AW: Picture Größe in Commandbutton variabel per Code
25.07.2019 15:00:40
Nepumuk
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
Anzeige
AW: Picture Größe in Commandbutton variabel per Code
25.07.2019 16:16:49
Dieter(Drummer)
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
AW: Picture Größe in Commandbutton variabel per Code
25.07.2019 16:30:41
Nepumuk
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
Anzeige
AW: Danke für Info, Nepumuk ...
25.07.2019 16:36:04
Dieter(Drummer)
... werde mich mit Karin's Variante beschäftigen.
Gruß, Dieter(Drummer)
AW: Picture Größe in Commandbutton variabel per Code
25.07.2019 16:25:35
Dieter(Drummer)
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)

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige