Herbers Excel-Forum - das Archiv

Formen in UserForm Namen zuweisen per Makro

Informationen und Beispiele zu den hier genannten Dialog-Elementen:


Betrifft: Formen in UserForm Namen zuweisen per Makro
von: kultnoob

Geschrieben am: 11.09.2019 16:09:14
Erst mal Grüße an alle und ich hoffe, es geht hier allen gut.
Habe eine Frage zu einem Problem.
Habe eine Exceldatei mit verschiedenen Sheets. In jedem Sheet sind verschiedene E-Mailadressen.
Über eine bereits bestehende UserForm wird eine andere UserForm angesteuert die auf Basis Anzahl der Sheets in der Excel-Datei Frames (Rahmen) und im Frame eine Checkbox (Kontrollkästchen) erstellt. Am Ende werden zwei CommandButtons eingefügt. Sollten weitere Sheets in der Excel-Datei hinzukommen, passt sich die UserForm automatisch an.
Soweit so gut.
Da manchmal nicht alle E-Mailadressen benötigt werden, soll der User die Checkboxen auswählen können, um zu bestimmen, welche E-Mails in den Sheets gewählt werden sollen. Später wird damit eine Outlook-Einladung erstellt (funktioniert bereits).
Nun meine Frage. Wenn die "Formen" auf der UserForm erstellt werden, möchte ich Ihnen gleich einen eindeutigen Namen zuweisen, damit ich dies später abfragen kann ob ein Hacken gesetzt ist oder nicht. Und genau da hängt es. Wie vergebe ich den Formen einen Namen. Der Sub hört ja irgendwann auf und durch Betätigung des ersten CommandButtons kann ich dann die Abfrage starten sofern jede Checkbox einen eindeutigen Namen bekommen hat. Aktuell befindet sich alles noch in der UserForm mit jeweils 2 CALL-Befehlen auf ein Modul um die Anzahl Sheets und die Bezeichnung der Sheets von einer Prozedur zur anderen zu übergeben.
Da ich sowas noch nie gemacht hatte, musste ich mich ein wenig durchtesten und anbei das, was ich bisher umgesetzt habe. Für Hilfe bedanke ich mich im Voraus.

Sub UserForm_Click()
Dim NFrame As MSForms.Frame
Dim NCheckbox As MSForms.Checkbox
Dim NCommand1 As MSForms.CommandButton
Dim NCommand2 As MSForms.CommandButton
Dim a, b As Integer
Dim Anzahl As String
'    'UserForm 2 ausblenden
'    UserForm2.Hide
'    'UserForm 3 einblenden
'    UserForm3.Show
'Verweis auf das Makro Sheets_zaehlen
Call Sheets_zaehlen
'Die Variable b als 0 definieren, da diese dazu dient die Rahmen der Checkboxen innerhalb    _
_
_
der UserForm3 vom Top aus zu verschieben
b = 0
'Schleife für die Anzahl Sheets
For a = 1 To Sheet_Anzahl
'Befehl zur Erstellung des Rahmens in welcher später die Checkbox (Kontrollkästchen)  _
dargestellt werden
Set NFrame = Me.Controls.Add("Forms.Frame.1", "Frame")
'Definition der Position des Rahmens auf Basis der Variable a
With NFrame
.Height = 42
.Left = 42
.Top = 126 + b
.Width = 246
Sheet_Zahl = a
Call Sheet_Namen_uebergeben
With .Add("Forms.Checkbox.1", "Checkbox")
.Caption = " " & Sheet_Namen
.Name = "Checkbox" & a          '''''''''wie kann man einen Namen der  _
erstellten Form geben????
.Font.Name = "Porsche Franklin Gothic"
.Font.Size = 18
.Height = 26
.Left = 6
.Top = 6
.Width = 224
End With
End With
'Höhe der Userform definieren
With UserForm3
'Höhe der Userform auf 265 Pixel definieren - b wird ab dem zweiten Rahmen hochgezä  _
_
_
hlt
.Height = 265 + b
End With
'Die Variable b um 62 Pixel hochzählen, damit der nächste Rahmen 62 Pixel mehr Abstand   _
_
_
hat vom Top als der vorherige Rahmen
b = b + 62
Next a
'Einfügen des Commandbuttons 1
Set NCommand1 = Me.Controls.Add("Forms.CommandButton.1", "CommandButton")
With NCommand1
.Caption = "Einladung erstellen"
.Font.Size = 12
.Font.Name = "Porsche Franklin Gothic"
.Height = 30
.Left = 12
.Top = 125 + b
.Width = 138
End With
'Einfügen des Commandbuttons 2
Set NCommand2 = Me.Controls.Add("Forms.CommandButton.1", "CommandButton")
With NCommand2
.Caption = "Zurück"
.Font.Size = 12
.Font.Name = "Porsche Franklin Gothic"
.Height = 30
.Left = 180
.Top = 125 + b
.Width = 138
End With
'    Prüfen, welche Kontrollkästchen gewählt wurden
End Sub



Option Explicit
Public Sheet_Anzahl As Integer
Public Sheet_Namen As String
Public Sheet_Zahl As String
Public a As Integer
Sub Sheets_zaehlen()
'Anzahl der Sheets zählen
Sheet_Anzahl = ActiveWorkbook.Sheets.Count
End Sub
Sub Sheet_Namen_uebergeben()
a = Sheet_Zahl
'Auf Basis der Variable "Sheetzahl" den Namen des Sheets auslesen und der Variable  _
Sheets_Namen übergeben
Sheet_Namen = ActiveWorkbook.Sheets(a).Name
End Sub


Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712501.html
Geschrieben am: 11.09.2019 16:25:11
Hallo,
im Prinzip, indem Du den Index mit übergibst, allerdings wird der Objektname + Index beim Erstellen über die .Add-Methode automatisch verwendet, wäre also nicht nötig:

Set NFrame = Me.Controls.Add("Forms.Frame.1", "Frame" & a)

Gruß, Mullit

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712578.html

Geschrieben am: 12.09.2019 07:46:38
Hi Mullit,
vielen Dank für die Unterstützung.
Set NFrame = Me.Controls.Add("Forms.Frame.1", "Frame" & a)
Die Idee mit "& a" bei der .add Methode habe ich bereits probiert.
Nur wenn die UserForm3 erstellt ist, gibt es auf dieser ja die Möglichkeit, die Checkboxen auszuwählen, was auch funktioniert. Der nächste Step wäre nun die Betätigung des CommandButtons1 mit der Caption "Einladung erstellen". Doch wie spreche ich diese im Editor an?
Wenn ich einen CommandButton1 händisch in der UserForm3 erstelle, kann ich einen Code folgendermaßen hinterlegen. (Code ohne Sinn und Verstand kurz notiert)

Sub CommandButton1_Click()
If UserForm3.Frame1.CheckBox1 = True Then
Exit Sub
End If
End Sub

Nur wenn ich auf den CommandButton1 klicke, passiert nichts. Das Makro läuft nicht weiter bzw. greift nicht auf die Prozedur zu. Irgendwie stehe ich auf dem Schlauch und sehe den Fehler nicht.
Auf der anderen Seite könnte ich die CommandButtons bereits erstellen und diese verschieben sich einfach mit den Frames und Checkboxen.
Möchte nur verstehen, wo hier mein Logikfehler liegt.
Vielen Dank im Voraus.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712622.html
Geschrieben am: 12.09.2019 09:55:53
Hallo,
einem zur Laufzeit erstellten CommandButton kannst du nur über eine Klasse ein Makro zuweisen. Ich mach dir mal ein Beispiel:
https://www.herber.de/bbs/user/132002.xlsm
Gruß
Nepumuk

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712688.html

Geschrieben am: 12.09.2019 13:56:39
Hi Nepumuk,
vielen Dank für die Hilfe. Habe mir dein Excel-Beispiel mal angeschaut und muss zugeben... ich check es nicht wirklich. Aber ich baue auf Basis Deiner Excel mal meine Excel um und schaue, ob es dann funktioniert. Melde mich und poste dann mal das, was ich zusammengekocht habe.
Vielleicht verstehe ich es dann auch besser.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712692.html

Geschrieben am: 12.09.2019 14:41:21
Hi,
also der Umbau hat geklappt und ich kann nun auch den CommandButton zugreifen aber ich verstehe nicht, wie ich auf die CheckBox zugreifen kann.
        'Befehl zur Erstellung des Rahmens in welcher später die Checkbox (Kontrollkästchen)  _
dargestellt werden
Set NFrame = Me.Controls.Add("Forms.Frame.1", Name:="Frame" & a)
'Definition der Position des Rahmens auf Basis der Variable a
With NFrame
.Height = 42
.Left = 42
.Top = 126 + b
.Width = 246
Sheet_Zahl = a
Call Sheet_Namen_uebergeben
With .Add("Forms.Checkbox.1", Name:="Checkbox" & a)
.Caption = " " & Sheet_Namen
.Font.Name = "Porsche Franklin Gothic"
.Font.Size = 18
.Height = 26
.Left = 6
.Top = 6
.Width = 224
End With
Hier erstelle ich den Rahmen und darin die Checkbox mit Bezug auf die Variable a die mit 1 beginnt. Aber bei der Abfrage, ob die Checkbox aktiviert ist oder nicht, bekomme ich immer eine Fehlermeldung. :(
Egal ob ich Checkbox oder Checkbox1 schreibe. Entweder fehlt ein Objekt oder Methode oder Datenobjekt nicht gefunden.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712696.html
Geschrieben am: 12.09.2019 14:52:34
Hallo,
du musst, wie in meinem Beispiel, die Checkbox einer Objektvariablen zuweisen und diese dann an die Klassen übergeben.
Gruß
Nepumuk

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712938.html

Geschrieben am: 13.09.2019 15:00:52
Hi Nepumuk,
bin mir nicht mal sicher, ob ich verstehe was Du programmiert hast. Somit kann ich dies leider nicht umsetzen. Mit Klassen hatte ich bisher nichts am Hut. Trotzdem danke ich Dir sehr für Deine Zeit und Mühe. Muss mich da richtig einarbeiten aber Stand jetzt verstehe ich es nicht.
Bin zwar den Code mehrfach durchgegangen um die Zusammenhänge zu verstehen und dennoch ist es verwirrend.
Entweder ich komm noch dahinter, oder ich suche mir eine andere Lösung. Bringt ja nichts etwas zu programmieren, was man nicht versteht.
Dennoch danke ich Dir.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712942.html
Geschrieben am: 13.09.2019 15:04:52
Zusatz:
Was ich auch noch nicht ganz verstehe ich folgendes.
Für die CommandButtons ist das glaube ich klar.
Aber wenn ich eine Anzahl Checkboxen habe, die auch noch variieren kann, wie soll ich dann allen eine Objektvariable zuweisen und an die Klassen übergeben?

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712960.html
Geschrieben am: 13.09.2019 15:46:14
Hallo,
du musst nur die Checkbox an die Klasse übergeben die beim Klick auf den Button abgefragt wird. So wie in meinem Beispiel.
Gruß
Nepumuk

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1713252.html

Geschrieben am: 16.09.2019 09:29:52
Hi Nepumuk,
habe jetzt mal versucht, mein Makro in Deine Beispiel-Datei einzubinden. Zum Teil funktioniert es aber es endet mit einer Fehlermeldung.
Wenn ich Dein Makro ausführe und die Checkbox nicht auswähle, dann erhalte ich eine Nachricht "Mach was". Wenn ich in dem von mir geänderten Makro keine Checkbox auswähle, erhalte ich den Fehler Objektvariable oder With-Blockfariable nicht festgelegt. Hier springt er hin, wenn ich auf Debuggen klicke.
Private Sub mobjCommandButton_Click()
If Not CheckBox.Value Then MsgBox "Haben Sie alle Verteiler gewählt?"
End Sub
Wenn ich eine oder mehrere Checkbox(en) auswähle, kommt die gleiche Fehlermeldung.
So wie ich das sehe, hänge ich immer noch an der Vergabe der Namen und die Übergabe an die Klasse.
Anbei die modifizierte Datei.
https://www.herber.de/bbs/user/132050.xlsm
Vielleicht siehst Du, warum das nicht so will...
Vielen Dank im Voraus.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1713259.html
Geschrieben am: 16.09.2019 10:07:53
Hi Nepumuk,
ok, Fehler gefunden. Arbeite und teste weiter... :)
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1713269.html

Geschrieben am: 16.09.2019 10:52:46
Hi Nepumuk,
nein ich bekomme es nicht hin.
Der erstellte Commandbutton wird mit folgenden Sub aufgerufen.
Private Sub mobjCommandButton_Click()
Dim cbox As Control
Dim a, c As Integer
If Not CheckBox.Value Then MsgBox "Bitte wählen Sie mindestens einen Verteiler."
End Sub
Somit müsste ich die Abfrage auch über den oben dargestellten Sub aufrufen. Sofern dies korrekt ist.
Wenn ich jetzt keine Checkbox auswähle kommt die MsgBox. Wähle ich aber eine oder mehrere Checkbox(en) wähle, kommt ebenfalls die MsgBox.
Komme nicht weiter....
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1713303.html
Geschrieben am: 16.09.2019 14:08:03
Hi Nepumuk,
habe es jetzt zu 99% hinbekommen. Muss noch ein paar Kleinigkeiten ändern aber im Grunde läuft es. Den Rest sollte ich jetzt gelöst bekommen... hoffe ich...
Vielen Dank für die Hilfe und sollte es wider erwarten nicht klappen, melde ich mich noch einmal.
Grüße

Betrifft: AW: Formen in UserForm Namen zuweisen per Makro
von: 1712939.html
Geschrieben am: 13.09.2019 15:00:53
Hi Nepumuk,
bin mir nicht mal sicher, ob ich verstehe was Du programmiert hast. Somit kann ich dies leider nicht umsetzen. Mit Klassen hatte ich bisher nichts am Hut. Trotzdem danke ich Dir sehr für Deine Zeit und Mühe. Muss mich da richtig einarbeiten aber Stand jetzt verstehe ich es nicht.
Bin zwar den Code mehrfach durchgegangen um die Zusammenhänge zu verstehen und dennoch ist es verwirrend.
Entweder ich komm noch dahinter, oder ich suche mir eine andere Lösung. Bringt ja nichts etwas zu programmieren, was man nicht versteht.
Dennoch danke ich Dir.
Grüße

Excel-Beispiele zum Thema "Formen in UserForm Namen zuweisen per Makro"
Adressblöcke umformen und in neue Tabelle ausgeben Darstellung der verschiedenen Erscheinungsformen von LixtBoxes
Diagramm in Userform XL-Dateien in UserForm listen
UserForm an Excel-Fenster anpassen Fundstellen in UserForm listen
Module und UserForms austauschen In einer Schleife auf Elemente einer UserForm zugreifen
Werte in eine ComboBox einer UserForm übernehmen Zellinhalt als Label-Aufschrift in UserForm