Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1840to1844
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

per Userform ins Codemodule schreiben

per Userform ins Codemodule schreiben
10.08.2021 09:51:24
Der
Hi liebes Forum,
ich habe folgendes Problem:
In einer Userform A soll eine Auswahl getroffen werden.
Nach Klick auf einen Command-Button dieser Userform A soll aufgrund der Auswahl eine zweite Userform B erstellt werden.
Diese Userform B beinhaltet eine dynamische Anzahl an Checkboxen.
Für diese Check-Boxen soll folgender Code in das Modul der Userform B eingetragen werden:

Private Sub Check1_Click()
If Me.ActiveControl.Value = True Then
Call NextControls(Int(Right(Me.ActiveControl.Name, 1)))
Else
Call EndControls(Int(Right(Me.ActiveControl.Name, 1)))
End If
End Sub
Um zu vermeiden, dass von einem vorherigen Durchlauf noch schon Code im Modul der Userform B steht, wird dieser zuerst wie folgt aus dem Modul von Userform A aus gelöscht:

With ThisWorkbook.VBProject.VBComponents("WhatToDoWithObligo").CodeModule
.DeleteLines 1, .CountOfLines
End With

In der Zeile mit

.DeleteLines

erhalte ich bereits die erste Fehlermeldung:
Laufzeitfehler 5:
ungültiger Prozeduraufruf oder ungültiges Argument

Dies ist mir schon sehr rätselhaft, da ich in den Zeilen kein Fehler ausmachen kann...
Wenn ich diese Zeilen jedoch auskommentiere und direkt zu der Stelle springe, an welcher der Code für die Checkboxen eingetragen werden soll, wird es noch unverständlicher.
Der Code sieht hierbei wie folgt aus:

Call GenerateCheckCode(Counti)
GenerateCheckCode(Counti As Integer) ist eine Funktion.
Diese sieht wie folgt aus:

Public Function GenerateCheckCode(Counti As Integer)
Dim ctrlName As String
ctrlName = Replace("Check" & Str(Counti), " ", "")
On Err GoTo Fehler
With ThisWorkbook
Set Codi = .VBProject.VBComponents("WhatToDoWithObligo").CodeModule
With Codi
.insertLines 1, _
"Private Sub " & ctrlName & "_Click()"
.insertLines 2, _
"If Me.ActiveControl.Value = True Then"
.insertLines 3, _
"Call NextControls(Int(Right(Me.ActiveControl.Name, 1)))"
.insertLines 4, _
"Else"
.insertLines 5, _
"Call EndControls(Int(Right(Me.ActiveControl.Name, 1)))"
.insertLines 6, _
"End If"
.insertLines 7, _
"End Sub"
End With
End With
Fehler:
With Err
.Raise .Number, _
.Source & "; " & Modulname & "; " & MySub, _
.Description, .HelpFile, .HelpContext
End With
End Function
Bei Aufruf der Funktion GenerateCheckCode(Counti As Integer) kommt in der Zeile

.insertLines 1, _"Private Sub " & ctrlName & "_Click()"

entweder die Fehlermeldung von oben (Laufzeitfehler 5) oder es erscheint die Meldung
Laufzeitfehler '-2147417848 (80010108)':
Automatisierungsfehler
Das aufgerufene Objekt wurde von den Clients getrennt

Woraufhin sich Excel selbst beendet.
Alternativ beendet sich Excel auch ab und zu ohne diese Meldung.
Ich bin völlig ratlos, da ich in meinem Code keine direkten Fehler finden kann und mir das Verhalten von Excel auch sehr rätselhaft vorkommt.
Für eine schnell Hilfe wäre ich sehr dankbar.
LG
Bernd

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 10:09:46
Daniel
HI
meines Wissens nach kannst du in Code, der gerade ausgeführt wird, keine Änderungen vornehmen.
VBA holt sich ja den Quelltext ab und compiliert diesen, und wenn das passiert ist, können Änderungen am Quelltext nicht mehr berücksichtigt werden.
die Frage ist, ob es nicht möglich wäre, die dynamischen Checkboxen durch eine Multi-Select-Listbox zu ersetzen.
der Listbox können ja beliebig Elemente hinzugefügt werden, aber die Anzahl der möglichen Eventmakros ändert sich nicht, denn es bleibt ja immer nur ein Steuerelement, egal wieviele Einträge die Liste hat, so dass die Programmierung ohne das hinzufügen von Code auskommt.
Gruß Daniel
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 10:30:07
Der
Hi Daniel,
danke für deine schnelle Hilfe.
Zu deinem ersten Punkt:
Bist du dir sicher, dass das in der geschilderten Art und Weise nicht funktioniert?
Ich schreibe ja Code in eine Userform (Userform B), welche ich erst später aufrufe.
Meiner Meinung nach ändere ich hier keinen Code, welcher aktuell ausgeführt wird.
Fragmente des Codes werden seltsamerweise auch eingetragen, wie ich nach Abbruch im Modul der Userform B sehen kann.
Das mit der Multi-Select-Listbox ist, glaube ich, keine echte Alternative.
Bei Userform B handelt es sich um eine Checkliste für Prozesse.
Der Anwender kann durch einen Haken angeben, dass er diesen Prozessschritt ausgeführt hat.
Anschließend erscheint der nächste Prozessschritt, wieder mit entsprechender Checkbox, welche dann bei Aktivierung den nächsten Prozessschritt anzeigt usw.
Ich mache das um zu vermeiden, dass der Anwender eine riesengroße Liste aufgezeigt bekommt, in welcher er ewig nach seinem Stand suchen muss.
Meines Wissens ist das mit einer Multi-Select-Listbox nicht möglich.
Ich lasse mich allerdings gerne eines Besseren belehren.
Vielen Dank schon mal.
LG
Bernd
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 11:09:22
Daniel
Hi
da kommt darauf an.
wenn alle dynamsich erzeugten Checkboxen gleichzeitig angezeigt werden sollen, ist die Multiselekt-Listbox schon eine gute Methode, um zur per Laufzeit erzeugten Code oder Klassenprogrammierung zu vermeiden.
Nachteilig ist halt die nicht änderbare Darstellungsform als Liste.
wenn immer nur eine Checkbox angezeigt wird, würde ich in der Userform immer auch nur eine Checkbox verwenden.
wenn diese dann für mehrere Prozessschritte verwendet werden muss, würde ich die jeweiligen zum Prozesschritt gehörenden Checkboxzustände im Hintergrund speichern und die Checkbox dann immer für den gerade angezeigten Prozesschritt anpassen.
Gruß Daniel
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 11:32:56
Der
Hi Daniel,
genau das sind die beiden Probleme.
Weder möchte ich von vorneherein alle Checkboxen anzeigen lassen (daher keine Multi-Select-Listbox), noch möchte ich nur eine springende Checkbox.
Die Anzahl der sichtbaren Checkboxen soll der Anzahl der bestätigten Prozessschritte + den aktuellen Prozessschritt entsprechen.
Unsichtbar sind natürlich alle Checkboxen und dazugehörige Labels schon vorhanden.
Die Frage ist also:
Warum kann ich aus einer Userform heraus keinen Code in eine zweite Userform schreiben, welche zu dieser Laufzeit noch nicht aktiv ist?
Und weshalb reagiert Excel so seltsam und inkonsistent?
Danke für deine Antworten.
LG
Bernd
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 11:37:17
Rudi
Hallo,

Unsichtbar sind natürlich alle Checkboxen und dazugehörige Labels schon vorhanden.
warum schreibst du dann nicht schon den Code für alle Checkboxen?
Gruß
Rudi
AW: per Userform ins Codemodule schreiben
10.08.2021 11:41:07
Der
Hallo Rudi,
genau das mache ich.
Ich erzeuge die Checkboxen über eine Do-While-Schleife und möchte dabei mit jedem Schleifendurchlauf den entsprechenden Code in die Userform reinschreiben.
Und genau hier brennt es dann...
Danke für deine Antwort.
LG
Bern
was denn jetzt?
10.08.2021 11:45:51
Rudi
erst schreibt du, dass alle Checkboxen und Label bereits vorhanden sind und jetzt erzeugst du sie?
Anzeige
AW: was denn jetzt?
10.08.2021 11:53:37
Der
Hi Rudi,
beides stimmt gewissermaßen.
Während Userform A aktiv ist erzeuge ich in der besagten Schleife alle Checkboxen und Labels mit dazugehörigem Code (letzteres funzt ja leider nicht) in Userform B.
Danach wird die Userform B aktiviert.
Der Anwender sieht hier nun jedoch nur die erste Checkbox mit den dazugehörigen Labels.
Durch Aktivierung der ersten Checkbox wird dann die zweite Checkbox + Labels sichtbar gemacht (Inhalt des Codes) usw.
Nach der Erzeugung der Checkboxen, sind diese auf der Userform B also schon alle vorhanden nur noch nicht alle sichtbar.
Ich hoffe ich konnte es jetzt klar machen.
LG
Bernd
Anzeige
AW: was denn jetzt?
10.08.2021 12:02:30
Rudi
warum legst du nicht alle im Voraus an und blendest sie aus?
AW: per Userform ins Codemodule schreiben
10.08.2021 12:22:12
Daniel
Ich würde hier alle Prozessschritte in einer SingleSelect-Listbox mit zwei Spalten auflisten.
Eine Spalte für die Bezeichnung und einen für dir Kennzeichnung, ob der Schritt erledigt wurde oder nicht.
Den Listindex setzt du auf den aktuellen Prozessschritt.
Damit hast du eine schöne Übersicht, wo man im Prozess steht und was noch zu erledigen ist.
Wenn die nicht erledigten Schritte nicht angezeigt werden sollen, dann geht das auch, dan fügst du immer nur den aktuellen Schritt zur Listbox hinzu.
Das "Prozessschritt erledigt" würde ich pet Button machen, und zwar mit einem einzigen Button, der immer für den aktuellen Prozessschritt gilt.
Gruß Daniel
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 13:09:19
Der
Hallo zusammen,
@Rudi:
Ich erzeuge doch alle Checkboxen bevor ich Userform B aktiviere und mache sie auch unsichtbar, also blende sie aus.
@Daniel:
Das klingt nach einer echt guten Alternative.
Aber ist es hier nicht auch wieder notwendig, Code von Userform A aus in Userform B zu schreiben?
Denn die Art des Prozesses und damit auch die Anzahl und Art der Prozessschritte hängt von der Auswahl in Userform A ab.
Sonst wäre es ja auch mit den Checkboxen kein Problem den Code im Voraus einfach festzulegen.
Vielen Dank für eure Antworten und euer Engagement.
Ein echt tolles Forum hier!
LG
Bernd
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 13:22:07
Daniel
Hi
nö, sollte eigentlich alles vorab programmierbar sein.
du musst in B halt schon vorab alle Codevariante für die möglichen Auswahlvarianten von A programmieren und über eine Abfrage der Auswahl in A entscheiden, was ausgeführt werden muss.
Da schon vor Ausführung des Codes alle Steuerelemente vorhanden sind, sollte das problemlos funktionieren.
Gruß Daniel
AW: per Userform ins Codemodule schreiben
10.08.2021 16:24:42
Der
Hi Daniel,
vielen Dank für deinen Lösungsvorschlag.
Auch wenn ich jetzt einiges umschreiben muss, werde ich es vermutlich so machen.
Mich würde dennoch wirklich interessieren, was genau an meiner Lösung nicht funktioniert hat bzw. was Excel dazu veranleitet mir unterschiedliche Fehlermeldungen zu präsentieren oder gleich ganz abzustürzen.
Ich kann mir nämlich nicht vorstellen, dass es prinzipiell ein Sakrileg ist, einer Userform automatisiert Code hinzuzufügen und diese dann anschließend zu aktivieren.
Vielen lieben Dank.
LG
Bernd
Anzeige
AW: per Userform ins Codemodule schreiben
10.08.2021 17:38:26
Daniel
Der Knackpunkt könnte das Initialisieren der Userform sein.
Das liegt noch vor dem Aktivieren und Anzeigen.
Es gibt zwar den Befehl Userform.Initialize, jedoch macht Excel das automatisch, sobald du mit der Userform was machst.
Gruß Daniel
AW: per Userform ins Codemodule schreiben
10.08.2021 18:00:55
Der
Hi Daniel,
das klingt nach einer guten Spur für mich.
Werde mich mal schlau machen.
Vielen Dank für alles.
LG
Bernd
AW: per Userform ins Codemodule schreiben
10.08.2021 18:15:38
Daniel
Versuch mal, obs klappt wenn du als erstes den Code zur Userform hinzufügst und die Steuerelemente erst danach.
Gruß Daniel
AW: per Userform ins Codemodule schreiben
10.08.2021 17:36:30
onur
Abgesehen davon, dass ich es hirnlos und völlig überflüssig finde, Code durch Code zu manipulieren:
Hast du denn "Microsoft Visual Basic for Applications Extensibility 5.3" aktiviert/eingebunden?
AW: per Userform ins Codemodule schreiben
10.08.2021 18:10:08
Der
Hallo onur,
bin auch kein Fan von Code durch Code manipulieren.
In diesem konkreten Fall ist mir jedoch keine andere Möglichkeit eingefallen um mein Vorhaben zu verwirklichen.
Und bevor ich akzeptiere, dass mein Vorhaben in VBA nicht realisierbar ist, wollte ich noch die Expertise anderer Entwickler einholen.
Da mir diese bis jetzt zu alternativen Ansätzen rieten, drängt sich mir ersterer Verdacht jedoch langsam auf.
Die Einbindung der Microsoft Visual Basic for Applications Extensibility 5.3 library hat nichts bewirkt.
Ich erhalte sogar die beiden angegebenen Fehlermeldungen direkt nacheinander + Absturz am Ende.
Wenn dir noch andere Ansätze einfallen, bin ich dafür sehr aufgeschlossen.
Für Anmaßungen à la hirnlos bzw. völlig überflüssig dagegen nicht.
LG
Bernd
AW: per Userform ins Codemodule schreiben
10.08.2021 18:12:34
onur
Dann poste doch mal deine (Beispiels-) Datei, sonst kann ich nix testen.
AW: per Userform ins Codemodule schreiben
10.08.2021 18:23:26
Der
Hi onur,
das kann ich gerne machen.
Allerdings muss ich die Datei davor länger bearbeiten, damit keine Interna mit übergeben werden.
Da ich jetzt Feierabend mache und bis nächsten Montag nicht im Geschäft bin, kann ich dir die Datei erst nächsten Montag zur Verfügung stellen.
Trotzdem vielen Dank für deine Bereitschaft und ich würde mich freuen, wenn ich dir die Datei nächste Woche zukommen lassen dürfte.
LG
Bernd
AW: per Userform ins Codemodule schreiben
10.08.2021 18:27:04
onur
Eine kleine Version, wo das Problem auftaucht, reicht schon - wahrscheinlich wäre es einfacher, eine neue Datei mit einer Userform und deinem Problem-Code usw. zu erstellen, als deine Originaldatei zu "schrumpfen".
AW: per Userform ins Codemodule schreiben
10.08.2021 19:06:34
Oberschlumpf
Hi Bernd,
und noch ein (anderer) Hinweis:
Auch wenn du deine Idee mit Hinzufügen von Checkboxen + Code - während der Laufzeit - doch noch irgendwann erfolgreich umsetzen kannst....wirst du dein eigentliches Ziel: "Ich mache das um zu vermeiden, dass der Anwender eine riesengroße Liste aufgezeigt bekommt..." trotzdem - nicht - so ohne Weiteres erreichen.
Damit es überhaupt möglich ist, mit Code Controls + weiteren Code a la Private Sub CheckBoxClick() usw hinzuzufügen, MUSS die Option

Zugriff auf das VBA-Projektopjektmodell vertrauen
aktiviert sein!
Diese Option MUSS auf JEDEM Computer aktiv sein, auf dem dein Code laufen soll!
Diese Option MUSS von jedem Anwender per Hand aktiviert werden - zwar nur 1x (die Einstellung ist dann gespeichert), aber erklär den Weg zur Einstellung mal jemandem, der von IT nicht so die Ahnung hat...hast du denn zu jedem der Anwender, die deine Datei nutzen sollen, Kontakt?
Diese Option, wenn sie aktiviert ist, stellt ein Sicherheitsrisiko da.
Alternative: es wurden dir schon mehrere gezeigt
eine weitere: Klassenprogrammierung - da kann ich aber nicht helfen, da ich in VBA dafür nicht gut genug bin
Hilfts?
Ciao
Thorsten

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige