Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Steuerelement Eigenschaft setzen

Steuerelement Eigenschaft setzen
03.04.2015 15:39:58
Ewald
Hallo,
mit folgendem Code kann ich die Eigenschaft eines Steuerelements setzen
Set myDesigner = ThisWorkbook.VBProject.VBComponents(mykom).Designer
With myDesigner
.Controls(mycon).Caption = mywert
End With
hier die Eigenschaft Caption diese soll aber nicht starr sondern über eine Variabel flexibel sein.
Bekomme die Variable aber nicht eingefügt.
Gruß Ewald

Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 16:27:45
Nepumuk
Hallo,
warum willst du das über die Designer-Klasse machen? Was heißt du bekommst sie nicht eingefügt?
Mein Test funktioniert ohne Probleme.
Public Sub Test()
    
    Dim strUserform As String
    Dim strCommandbutton As String
    Dim strCaption As String
    
    strUserform = "UserForm1"
    strCommandbutton = "CommandButton1"
    strCaption = "Test123"
    
    ThisWorkbook.VBProject.VBComponents(strUserform). _
        Designer.Controls(strCommandbutton).Caption = strCaption
    
End Sub

Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 16:34:51
Luschi
Hallo Ewald,
bei mir klappt das so:

Sub test1()
Call machMal("Ostern")
End Sub
Sub machMal(meinText As String)
Dim myDesigner As Object
Set myDesigner = ThisWorkbook.VBProject.VBComponents("UserForm1").Designer
With myDesigner
.Controls("CommandButton1").Caption = meinText
End With
Set myDesigner = Nothing
End Sub
Allerdings beachte diesen Hinweis in der Vba-Hilfe:

Mit der Designer-Eigenschaft können Sie auf ein komponentenspezifisches Objekt zugreifen. In bestimmten Fällen,
wie bei Standardmodulen und Klassenmodulen wird kein Designer erstellt, da dieser Typ von VBComponent-Objekt
keine Designer unterstützt.
Bei mir klappt das auch nicht bei ActiveX-Steuerelementen auf einer Arbeitstabelle, denn da hat die Variable 'myDesigner' den Wert 'Nothing'.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 18:02:30
Ewald
Hallo,
da hab ich wohl nicht genau geschildert, der Code funktioniert bei mir ja auch.
Es geht darum die Eigenschaft nicht fest zu schreiben sondern mit einer Variablen. zB myeig = "Caption" und dann die Variable zu benutzen.
Hintergrund ist das ich eine Listbox habe, die alle Eigenschaften des Steuerelements anzeigt.
Wenn ich jetzt eine Eigeenschaft markiere, wird der Wert in einer Textbox angezeigt, hier kann ich jetzt den Wert ändern und dann soll mit obigem Code gesetzt werden.
die Variable ist die markierte Eigenschaft in der Listbox.
Gruß Ewald

Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 18:11:15
Nepumuk
Hallo,
na dann:
Public Sub Test()
    
    Dim strUserform As String
    Dim strCommandbutton As String
    Dim strCaption As String
    Dim strProperty As String
    
    strUserform = "UserForm1"
    strCommandbutton = "CommandButton1"
    strCaption = "Test321"
    strProperty = "Caption"
    
    Call CallByName(ThisWorkbook.VBProject.VBComponents(strUserform). _
        Designer.Controls(strCommandbutton), strProperty, VbLet, strCaption)
    
End Sub

Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 19:02:52
Ewald
Hallo Nepumuk,
das wars, so funktioniert es, danke dir.
habe jetzt noch eine Frage zur Auflistung der Eigenschaften, dort sind jetzt alle enthalten
Eigenschaften die geändert werden können
schreibgeschützte(Parent,Object)
Funktionen (Move,SetFocus)
wenn ich jetzt eine Eigenschaft markiere, wird mir zwar angezeigt welcher Art die Eigenschaft ist, besser wäre es wenn nur die änderbaren Eigenschaften in der Liste wären.
Gibt es da eine Möglichkeit
Mit folgendem Makro lese ich die Eigenschaften ein
    Dim Item As SearchItem
Set mControlObject = myForm.Controls.Item(Me.lstSteuerelemente.Text)
Set mControlInformation = InterfaceInfoFromObject( _
mControlObject).Members.GetFilteredMembers
With Me.lstEigenschaften
.Clear
For Each Item In mControlInformation
.AddItem Item.Name
Next Item
Me.lblEigenschaften.Enabled = True
.Enabled = True
End With
Gruß Ewald

Anzeige
AW: Steuerelement Eigenschaft setzen
03.04.2015 21:20:43
Nepumuk
Hallo Ewald,
ich hole mir die Eigenschaften so:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private lngZeile As Long

Sub ShowTypeLibInfo()
    ' Mit Early Binding Verweis auf Typelib Information, vstlbinf.dll
    ' hier in: C:\Programme\Gemeinsame Dateien\Microsoft Shared\VSA\7.1\VsaEnv
    ' Dim tli As TLIApplication, ti As TypeLibInfo
    Dim tli As Object, ti As Object
    Dim i As Long
    
    lngZeile = 2
    Set tli = CreateObject("TLI.TLIApplication")
    Set ti = tli.TypeLibInfoFromFile(ThisWorkbook.VBProject.References("MSFORMS").FullPath)
    
    For i = 1 To ti.CoClasses.Count
        myPrint 100, "CoClasses:", i, ti.CoClasses(i).Name
        Show_CoClassInfo 100, ti.CoClasses(i)
    Next
    
    For i = 1 To ti.Constants.Count
        myPrint 200, "Constants:", i, ti.Constants(i).Name
        Show_Constants 200, ti.Constants(i)
    Next
    
    For i = 1 To ti.CustomDataCollection.Count
        myPrint 300, "CustomDataCollection:", i, ti.CustomDataCollection(i).GUID, _
            ti.CustomDataCollection(i).Value
    Next
    
    For i = 1 To ti.Declarations.Count
        myPrint 400, "Declarations:", i, ti.Declarations(i).Name
    Next
    
    For i = 1 To ti.Interfaces.Count
        myPrint 500, "Interfaces:", i, ti.Interfaces(i).Name
        Show_Interfaces 500, ti.Interfaces(i)
    Next
    
    For i = 1 To ti.IntrinsicAliases.Count
        myPrint 600, "IntrinsicAliases:", i, ti.IntrinsicAliases(i).Name
    Next
    
    For i = 1 To ti.Records.Count
        myPrint 700, "Records:", i, ti.Records(i).Name
    Next
    
    For i = 1 To ti.TypeInfos.Count
        myPrint 800, "TypeInfos:", i, ti.TypeInfos(i).Name
        Show_TypeInfos 800, ti.TypeInfos(i)
    Next
    
    For i = 1 To ti.Unions.Count
        myPrint 900, "Unions:", i, ti.Unions(i).Name
    Next
    
    Set ti = Nothing
    Set tli = Nothing
End Sub

Public Sub Show_Constants(Offset As Integer, ci As Object) ' ci As ConstantInfo
    Dim j As Long
    
    For j = 1 To ci.Members.Count
        myPrint Offset + 2, "Constants", j, ci.Members(j).Name, ci.Members(j).Value
    Next
End Sub

Public Sub Show_CoClassInfo(Offset As Integer, cci As Object) ' cci as CoClassInfo
    Dim j As Long
    
    For j = 1 To cci.CustomDataCollection.Count
        myPrint Offset + 1, "CustomDataCollection", j, cci.CustomDataCollection(j).GUID, _
            cci.CustomDataCollection(j).Value
    Next
    
    If Not cci.DefaultEventInterface Is Nothing Then
        myPrint Offset + 2, "DefaultEventInterface", 0, cci.DefaultEventInterface.Name
    End If
    For j = 1 To cci.Interfaces.Count
        myPrint Offset + 3, "Interfaces", j, cci.Interfaces(j).Name
        Show_Interfaces Offset, cci.Interfaces(j)
    Next
End Sub

Public Sub Show_Interfaces(Offset As Integer, ifo As Object) ' ifo as InterfaceInfo
    Dim j As Long
    
    For j = 1 To ifo.CustomDataCollection.Count
        myPrint Offset + 1, "CustomDataCollection", j, ifo.CustomDataCollection(j).GUID, _
            ifo.CustomDataCollection(j).Value
    Next
    
    For j = 1 To ifo.ImpliedInterfaces.Count
        myPrint Offset + 2, "ImpliedInterfaces", j, ifo.ImpliedInterfaces(j).Name
    Next
    
    For j = 1 To ifo.Members.Count
        myPrint Offset + 3, "Members", j, ifo.Members(j).Name, _
            getInvokeString(ifo.Members(j).InvokeKind)
    Next
End Sub

Public Function getInvokeString(ByVal invoke As Long)
    Dim s As String
    Select Case invoke
        Case 0: s = "INVOKE_UNKNOWN"
        Case 1: s = "INVOKE_FUNC"
        Case 2: s = "INVOKE_PROPERTYGET"
        Case 4: s = "INVOKE_PROPERTYPUT"
        Case 8: s = "INVOKE_PROPERTYPUTREF"
        Case 16: s = "INVOKE_EVENTFUNC"
        Case 32: s = "INVOKE_CONST"
        Case Else: s = "? PANIC"
    End Select
    getInvokeString = s
End Function

Public Sub Show_TypeInfos(Offset As Integer, obj As Object)
    Select Case TypeName(obj)
        Case "InterfaceInfo"
            Show_Interfaces Offset, obj
            
        Case "CoClassInfo":
            Show_CoClassInfo Offset, obj
            
        Case "ConstantInfo":
            Show_Constants Offset, obj
            
        Case "IntrinsicAliasInfo"
            myPrint Offset + 9, "IntrinsicAliasInfo", 0, obj.Name
            
        Case Else:
            myPrint Offset + 99, "?", 0, obj.Name, TypeName(obj)
    End Select
End Sub

Private Sub myPrint(Offset As Long, strName As String, _
        iCount As Long, var1 As Variant, Optional var2 As Variant)

    Cells(lngZeile, 1).Value = Offset
    Cells(lngZeile, 2).Value = strName
    Cells(lngZeile, 3).Value = iCount
    Cells(lngZeile, 4).Value = var1
    Cells(lngZeile, 5).Value = var2
    lngZeile = lngZeile + 1
End Sub

wenn es eine PUT-Property gibt (INVOKE_PROPERTYPUT), dann ist sie per Designer änderbar.
Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
04.04.2015 00:19:22
Ewald
Hallo Nepumuk,
kann es sein das es da verschiedene dll gibt.
Habe auch unter Verweise den Verweis gesetzt auf Typelib Information ist aber die TLBINF 32 dll und befindet sich im Windows/System 32 Ordner.
Auch bekomme ich beim Auslesen nur die Eigenschaften angezeigt die zum Steuerelement gehören.
Dies sind aber erheblich weniger wie bei dir.
den Code zum Auslesen steht ja schon oben, wenn ich eine Eigenschaft markiere, wird mir mit folgendem Code die Art und der Wert angezeigt.
Private Sub lstEigenschaften_Click()
mProperty = Me.lstEigenschaften.Text
With mControlInformation
With .Item(.Locate(mProperty))
If .InvokeKinds And INVOKE_FUNC Then
Me.lblArt.Caption = "Funktion"
Me.lblWert.Enabled = False
Me.txtWert.Enabled = False
Me.txtWert.Text = vbNullString
Me.cmdÄndern.Enabled = False
ElseIf .InvokeKinds And INVOKE_PROPERTYGET Then
Me.lblWert.Enabled = True
Me.txtWert.Enabled = True
On Error GoTo PropertyReadError
Me.txtWert.Text = CStr(CallByName(mControlObject, mProperty, _
VbGet))
On Error GoTo 0
If CBool(.InvokeKinds And INVOKE_PROPERTYPUT) Or CBool( _
.InvokeKinds And INVOKE_PROPERTYPUTREF) Then
Me.lblArt.Caption = "Eigenschaft"
Me.txtWert.Locked = False
Me.cmdÄndern.Enabled = True
Else
Me.lblArt.Caption = "Schreibgeschützte Eigenschaft"
Me.txtWert.Locked = True
Me.cmdÄndern.Enabled = False
End If
End If
End With
End With
Exit Sub
PropertyReadError:
Me.txtWert.Text = "Fehler"
Resume Next
End Sub
Jetzt wäre beim Schreiben der Liste sinnvoll nur die Eigenschaften einzutragen bei denen INVOKE_PROPERTYPUT oder INVOKE_PROPERTYPUTREF zutreffen.
Gruß Ewald

Anzeige
AW: Steuerelement Eigenschaft setzen
04.04.2015 11:04:08
Nepumuk
Hallo,
so kann ich es auf die im Objektkatalog sichtbaren Elemente reduzieren.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private lngZeile As Long

Sub ShowTypeLibInfo()
    ' Mit Early Binding Verweis auf Typelib Information, vstlbinf.dll
    ' hier in: C:\Programme\Gemeinsame Dateien\Microsoft Shared\VSA\7.1\VsaEnv
    ' Dim tli As TLIApplication, ti As TypeLibInfo
    Dim tli As Object, ti As Object
    Dim i As Long
    
    lngZeile = 1
    Set tli = CreateObject("TLI.TLIApplication")
    Set ti = tli.TypeLibInfoFromFile(ThisWorkbook.VBProject.References("MSFORMS").FullPath)
    
    For i = 1 To ti.CoClasses.Count
        If ti.CoClasses(i).AttributeMask = 32 Or ti.CoClasses(i).AttributeMask = 2 Then
            myPrint 100, "CoClasses:", i, ti.CoClasses(i).Name
            Show_CoClassInfo 100, ti.CoClasses(i)
        End If
    Next
    
    Set ti = Nothing
    Set tli = Nothing
End Sub

Public Sub Show_CoClassInfo(Offset As Integer, cci As Object) ' cci as CoClassInfo
    Dim j As Long
    
    For j = 1 To cci.Interfaces.Count
        Show_Interfaces Offset, cci.Interfaces(j)
    Next
End Sub

Public Sub Show_Interfaces(Offset As Integer, ifo As Object) ' ifo as InterfaceInfo
    Dim j As Long
    
    For j = 1 To ifo.Members.Count
        If ifo.Members(j).InvokeKind = 4 Or ifo.Members(j).InvokeKind = 8 Then
            myPrint Offset + 3, "Members", j, ifo.Members(j).Name, _
                getInvokeString(ifo.Members(j).InvokeKind)
        End If
    Next
End Sub

Public Function getInvokeString(ByVal invoke As Long)
    Dim s As String
    Select Case invoke
        Case 0: s = "INVOKE_UNKNOWN"
        Case 1: s = "INVOKE_FUNC"
        Case 2: s = "INVOKE_PROPERTYGET"
        Case 4: s = "INVOKE_PROPERTYPUT"
        Case 8: s = "INVOKE_PROPERTYPUTREF"
        Case 16: s = "INVOKE_EVENTFUNC"
        Case 32: s = "INVOKE_CONST"
        Case Else: s = "? PANIC"
    End Select
    getInvokeString = s
End Function

Private Sub myPrint(Offset As Long, strName As String, _
        iCount As Long, var1 As Variant, Optional var2 As Variant)

    Cells(lngZeile, 1).Value = Offset
    Cells(lngZeile, 2).Value = strName
    Cells(lngZeile, 3).Value = iCount
    Cells(lngZeile, 4).Value = var1
    Cells(lngZeile, 5).Value = var2
    lngZeile = lngZeile + 1
End Sub

Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
04.04.2015 19:03:42
Ewald
Hallo Nepumuk,
das sind aber auch noch zuviele, da ja nicht Steuerelement bezogen.
Habe es jetzt aber in meinem Code hinbekommen, zuerst wird nach Steuerelement gefiltert und dann werden nur die änderbaren Eigenschaften in die Liste geschrieben.
Private Sub lstSteuerelemente_Click()
Dim Item As SearchItem
Set mControlObject = myForm.Controls.Item(Me.lstSteuerelemente.Text)
Set mControlInformation = InterfaceInfoFromObject( _
mControlObject).Members.GetFilteredMembers
With Me.lstEigenschaften
.Clear
For Each Item In mControlInformation      'Anpassung nur änderbare Eigenschaften
If CBool(Item.InvokeKinds And INVOKE_PROPERTYPUT) Or CBool( _
Item.InvokeKinds And INVOKE_PROPERTYPUTREF) Then
.AddItem Item.Name
End If
Next Item
Me.lblEigenschaften.Enabled = True
.Enabled = True
End With
Me.lblWert.Enabled = False
Me.txtWert.Enabled = False
Me.cmdÄndern.Enabled = False
End Sub
stehen in der dll auch die möglichen Parameter für eine Eigenschaft zur Verfügung, wenn ich einen Parameter abfrage bekomme ich als Beispiel eine 0,1,2 aber nicht den Text wie er im VBE zur Verfügung steht.Es würde eventuell dann auch reichen, wenn die möglichen Parameter in einer Combobox zur Auswahl stehen.
Gruß Ewald

Anzeige
AW: Steuerelement Eigenschaft setzen
04.04.2015 22:13:54
Nepumuk
Hallo,
da kommst du schon ran. Beispiel für die TextAlign-Property des Labels:
ti.CoClasses(10).Interfaces(1).Members(52).ReturnType.TypeInfo.Members(1).Name = "fmTextAlignLeft"

ti.CoClasses(10).Interfaces(1).Members(52).ReturnType.TypeInfo.Members(1).Value = 1

Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
05.04.2015 10:24:16
Nepumuk
Hallo Ewald,
ich hab's dir mal eingebaut:
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private lngZeile As Long

Sub ShowTypeLibInfo()
    ' Mit Early Binding Verweis auf Typelib Information, vstlbinf.dll
    ' hier in: C:\Programme\Gemeinsame Dateien\Microsoft Shared\VSA\7.1\VsaEnv
    ' Dim tli As TLIApplication, ti As TypeLibInfo
    Dim tli As Object, ti As Object
    Dim i As Long
    
    lngZeile = 1
    Set tli = CreateObject("TLI.TLIApplication")
    Set ti = tli.TypeLibInfoFromFile(ThisWorkbook.VBProject.References("MSFORMS").FullPath)
    
    For i = 1 To ti.CoClasses.Count
        If ti.CoClasses(i).AttributeMask = 32 Or ti.CoClasses(i).AttributeMask = 2 Then
            myPrint 100, "CoClasses:", i, ti.CoClasses(i).Name
            Show_CoClassInfo 100, ti.CoClasses(i)
        End If
    Next
    Columns.AutoFit
    Set ti = Nothing
    Set tli = Nothing
End Sub

Public Sub Show_CoClassInfo(Offset As Integer, cci As Object) ' cci as CoClassInfo
    Dim j As Long
    
    For j = 1 To cci.Interfaces.Count
        Show_Interfaces Offset, cci.Interfaces(j)
    Next
End Sub

Public Sub Show_Interfaces(Offset As Integer, ifo As Object) ' ifo as InterfaceInfo
    Dim j As Long
    Dim s As String
    
    For j = 1 To ifo.Members.Count
        If ifo.Members(j).InvokeKind = 4 Or ifo.Members(j).InvokeKind = 8 Then
            s = getInvokeString(ifo.Members(j).InvokeKind)
            myPrint Offset + 3, "Members", j, ifo.Members(j).Name, s
            If ifo.Members(j).InvokeKind = 4 Then
                Call Show_Values(ifo.Members(j))
            End If
        End If
    Next
End Sub

Public Sub Show_Values(mem As Object) ' mem as members
    Dim j As Long
    On Error Resume Next
    Select Case mem.ReturnType.VarType
        Case 22, 2
            Cells(lngZeile - 1, 6).Value = "Integer"
        Case 11
            Cells(lngZeile - 1, 6).Value = "True / False"
        Case 8
            Cells(lngZeile - 1, 6).Value = "String"
        Case 3
            Cells(lngZeile - 1, 6).Value = "Long"
        Case 4
            Cells(lngZeile - 1, 6).Value = "Single"
        Case 6
            Cells(lngZeile - 1, 6).Value = "Currency"
        Case 0
            For j = 1 To mem.ReturnType.TypeInfo.Members.Count
                Cells(lngZeile - 1, 5 + j).Value = _
                    mem.ReturnType.TypeInfo.Members(j).Name & " / " & _
                    mem.ReturnType.TypeInfo.Members(j).Value
            Next
        Case 12
            Cells(lngZeile - 1, 6).Value = "Variant"
        Case 13
            Cells(lngZeile - 1, 6).Value = "PIROWSET"
        Case Else
            Stop
    End Select
    
End Sub


Public Function getInvokeString(ByVal invoke As Long)
    Dim s As String
    Select Case invoke
        Case 0: s = "INVOKE_UNKNOWN"
        Case 1: s = "INVOKE_FUNC"
        Case 2: s = "INVOKE_PROPERTYGET"
        Case 4: s = "INVOKE_PROPERTYPUT"
        Case 8: s = "INVOKE_PROPERTYPUTREF"
        Case 16: s = "INVOKE_EVENTFUNC"
        Case 32: s = "INVOKE_CONST"
        Case Else: s = "? PANIC"
    End Select
    getInvokeString = s
End Function

Private Sub myPrint(Offset As Long, strName As String, _
        iCount As Long, var1 As Variant, Optional var2 As Variant)

    Cells(lngZeile, 1).Value = Offset
    Cells(lngZeile, 2).Value = strName
    Cells(lngZeile, 3).Value = iCount
    Cells(lngZeile, 4).Value = var1
    Cells(lngZeile, 5).Value = var2
    lngZeile = lngZeile + 1
End Sub

Gruß
Nepumuk

Anzeige
AW: Steuerelement Eigenschaft setzen
05.04.2015 14:39:51
Ewald
Hallo Nepumuk,
wünsche erstmal ein frohes Osterfest.
du hast mir ja ein schönes Ei ins Nest gelegt.
Muß jetzt erst mal sehen wie ich das umgesetzt bekomme, muß ja doch mit verschidenen Eingabemöglichkeiten je nach Type arbeiten. Neben den vorgegebenen gibt es ja auch noch die Farben und die Rangeeingaben.
Zuerst muß ich mir erstmal eine Fehlerbehandlung erstellen, damit Excel nicht abschmiert, wenn was falsches eingegeben wird.
Gruß Ewald
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige