304 Aufrufe
Gefragt in Tabellenkalkulation von vbastler Mitglied (325 Punkte)

Moin allerseits,

unter https://vbasteleien.de/viewtopic.php?t=523 habe ich beschireben, wie ich aus einem Modul heraus eine Userfrom baue und sie mit verschiedenen Controls fülle. Die zu den CTR gehörenden Parameter liegen entweder direkt im Code, oder in einem Arbeitsblatt. Beides klappt erfreulich gut und wird künftig zu bauende USF erheblich vereinfachen.

Was mir ums Mäusemelken nicht gelingen will ist: In ein Frame innerhalb der USF CTRs zu setzen. Für bereits vorhandene USF habe ich eine Lösung mit WithEvents gefunden, die aber eine bereits laufende USF benötigt. Der Versuch, den Aufruf einer solchen Sub in die USF-Initialize einzubauen, ist kläglich gescheitert.

Hat hier jemand eine Idee, wie man so etwas kontruieren könnte? Bin für jeden Hinweis dankbar!

Grüße d'r Bastler von den vbasteleien.de

6 Antworten

+1 Punkt
Beantwortet von
Ich habe so was in der Art mal gemacht
dazu habe ich in einem Model eine "Hilfs"funktion
definiert

Option Explicit
Public Const durch As Integer = 10
Public meine_Parent As Object

Public Function adden(meine_Userform, meine_Form, meine_Top, meine_Left, meine_Height, meine_Width, meine_name, Optional meine_Caption = "", Optional meine_BackColor = "&H80000005", Optional meine_Style = 2, _
Optional meine_Bold = False, Optional meine_Border = False, Optional meine_Enabled = True, Optional meine_Pages = 2, Optional meine_ForeColor = "&H80000012")
Dim temp
Dim modframe As Long
Dim lv As Long

If meine_Parent.Name = meine_Userform.Name Then
    modframe = 0
Else
    modframe = 45
End If
If meine_Form = "Frame" Then
    Set temp = meine_Userform.Controls.Add("Forms." & meine_Form & ".1")
    Set meine_Parent = temp
ElseIf meine_Form = "MultiPage" Then
    Set temp = meine_Userform.Controls.Add("Forms." & meine_Form & ".1")
    If meine_Pages = 1 Then
        temp.Pages.Remove (1)
    ElseIf meine_Pages > 2 Then
        For lv = 1 To meine_Pages - 2
            temp.Pages.Add
        Next
    End If
    Set meine_Parent = temp.Pages(0)
ElseIf meine_Form = "SubFrame" Then
    Set temp = meine_Parent.Controls.Add("Forms." & "Frame" & ".1")
    Set meine_Parent = temp
Else
    Set temp = meine_Parent.Controls.Add("Forms." & meine_Form & ".1")
End If
   With temp
      .Name = meine_name
      .Height = meine_Height / durch
      .Left = meine_Left / durch
      .Top = (meine_Top - modframe) / durch
      .Width = meine_Width / durch
      Select Case meine_Form
        Case "Label", "OptionButton", "CommandButton", "CheckBox", "Frame", "SubFrame", "ToggleButton"
            .Caption = meine_Caption
            If meine_Border = True Then
                .BorderStyle = 1
            End If
            If meine_ForeColor <> "&H80000012" Then
                .ForeColor = meine_ForeColor
            End If
            If meine_Form = "Frame" And meine_BackColor <> "&H80000005" Then
                .BackColor = meine_BackColor
            End If
        Case "TextBox"
            .text = meine_Caption
            .BackColor = meine_BackColor
            If meine_Enabled = False Then
                .Enabled = False
            End If
        Case "ComboBox"
        .Style = meine_Style
       End Select
       If meine_Form <> "SpinButton" Then
        With .Font
           .Size = 10
           .Bold = meine_Bold
        End With
       End If
   End With
  Set adden = temp
  Set temp = Nothing
End Function

und dann so aufgerufen

Option Explicit
 Dim mein_Textbox
 Dim mein_Fr01, mein_Lb01
 Public WithEvents mein_Cmd As MSForms.CommandButton
 Const meinFrame = "&H8000000F"

Private Sub UserForm_Initialize()
Dim Framework As Long

With UserForm1
.Caption = "mein Beispiel"
.Top = 10 / durch
.Left = 10 / durch
.Width = 600 / durch
.Height = 500 / durch
End With
Set meine_Parent = Me

Framework = 50
Call Modul1.adden(Me, "Frame", Framework, 10, 200, 500, mein_Fr01, meine_Caption:="Hallo Welt", meine_Bold:=True, meine_BackColor:=meinFrame)
Framework = Framework + 200
Call Modul1.adden(Me, "Label", 60, 20, 20, 80, "mein_Lb01", meine_Caption:="ich bins")
Set mein_Textbox = Modul1.adden(Me, "TextBox", 60, 120, 20, 300, "Txt_Firmenname", meine_Caption:="", meine_BackColor:=&H8000000D, meine_Enabled:=True)
Set mein_Cmd = Modul1.adden(Me, "CommandButton", 120, 30, 20, 100, "mein_Cmd", meine_Caption:="Starte", meine_Bold:=True)
Set meine_Parent = meine_Parent.Parent

End Sub

Set xxx = für alle Events oder noch anzusteuernde Formen

Call bei rein optischen Elementen (Frame, label)
0 Punkte
Beantwortet von vbastler Mitglied (325 Punkte)

Ooops! Na, da habe ich ja was zum Lesen und Verstehen ...laugh

Ganz herzlichen Dank und das Versprechen einer qualifizierten Rückmeldung.

Grüße

0 Punkte
Beantwortet von xlking Experte (1.7k Punkte)

Hi, ihr

ohne jetzt alles durchgelesen zu haben hier mal ein etwas einfacheres Beispiel:

Ein leeres Userform1 muss existieren.

In ein Standardmodul kommt dieser Code

Dim meinLabel As New Klasse1
Sub Form()
  
  With UserForm1.Controls.Add("Forms.Frame.1", "Rahmen")
    .Top = 50
    .Left = 50
    .Height = 100
    .Width = 100
    With .Object.Controls.Add("Forms.Label.1", "Test1")
      .Height = 50
      .Width = 50
      .Caption = "Hallo"
    End With
    Set meinLabel.lbl = .Object.Controls("Test1")
  End With
  
  UserForm1.Show
  
End Sub

In ein Klassenmodul namens Klasse1 kommt dieser Code.

Public WithEvents lbl As MSForms.Label

Private Sub lbl_Click()
  If lbl.Name = "Test1" Then lbl.Caption = "Ich wurde angeklickt"
End Sub

Den Klassennamen kannst du natürlich umbenennen, sofern du auch den entsprechenden Part im Code umbenennest.

Bei Fragen einfach melden.

Gruß Mr. K.

+1 Punkt
Beantwortet von xlking Experte (1.7k Punkte)

Jetzt habe ich mir doch mal dein Anliegen durchgelesen. So wie du macht man das eigentlich nicht. Normalerweise erstellt man Die Steuerelemente erst zur Laufzeit. Aber gut, du willst ein Userformmodul erstellen und im Designmode bleiben.

Dein Problem war, dass du an einer stelle frm.Designer verwendest. Aber nur das Userform hat einen Designmode. Ersetze die Zeile

Set cmd = frm.Designer.Controls.Add("Forms.CommandButton.1")

also durch

Set cmd = usf.Designer.Controls(frm.Name).Controls.Add("Forms.CommandButton.1")

Dann klappts auch mit dem Button.

Gruß Mr. K.

0 Punkte
Beantwortet von vbastler Mitglied (325 Punkte)
Moin xlking,

interessante Variante! Werde ich morgen sorgfältig beäugen!

Vielen lieben Dank!

d'r Bastler von den vbasteleien.de
0 Punkte
Beantwortet von vbastler Mitglied (325 Punkte)
Bearbeitet von mickey

Moin allerseits!

Dieses kleine Detail Set cmd = usf.Designer.Controls(frm.Name).Controls.Add("Forms.CommandButton.1") war es, das meine Bastelei endlich zum Erfolg geführt. Ansonsten war ich da schon ganz dicht dran. 

Noch zur Erläuterung, warum ich die ganze Geschichte vor der Existenz der Userform haben möchte: Ziel ist es alle Parameter der Controls aus einem Arbeitsblatt zu holen um dort die Formeln nutzen zu können. Benötige ich für ein USF z.B. ein halbes Dutzend Buttons in einer Reihe, kann ich deren Position Left einmal fix und Top jeweils + x definieren. Auch bei den Größen muss nicht per Werkzeugsammlung eingefügte Buttons korrigieren und benennen. Das geht bei größeren USF erheblich schneller.

Mein Modul arbeitet dann einfach eine Tabelle ab und die USF steht da wie eine Eins.

Mr.K. ganz herzlichen Dank!! und selbstverständlich auch Dir LET= für Deine Idee.

Vielen lieben Dank!

d'r Bastler

...