Excel VBA, Variable ein- und auslesen

Moin!

Ich möchte in einer Userform unter
„Private Sub UserForm_Activate()“
mehrere Variable mit Text füllen und in anderen Prozeduren in der Userform auslesen können.
Wie kann ich das realisieren?

Für Deine Hilfe im voraus vielen Dank!
Tschüs, Frank

Ich möchte in einer Userform unter
„Private Sub UserForm_Activate()“
mehrere Variable mit Text füllen und in anderen Prozeduren in
der Userform auslesen können.

Hallo Frank,

du kannst globale Variablen definieren, die Texte in Zellen auf einem ausgeblendeten Blatt speichern oder die Texte in Variablen so in Excel speichern, sodaß sie auch beim nächsten Start von Excel da sind.

globale variablen: In einem Standardmodul oben:
Public Text1 as String

dauerhafte Excelvariablen: schau in der Hilfe nach CustomDocumentProperties

Kommst du damit klar?

Gruß
Reinhard

Hallo Reinhard,

du kannst globale Variablen definieren, die Texte in Zellen
auf einem ausgeblendeten Blatt speichern

Ja, verstehe und so habe ich mir bisher auch immer geholfen oder besser gesagt beholfen.

globale variablen: In einem Standardmodul oben:
Public Text1 as String

Habe ich eben getestet, in einer Prozedur Text1 = „Hallo“ geschrieben und in einer anderen Prozedur im selben Modul mit x = Text1 war x Tatsächlich „Hallo“, super!

Leider funktioniert es nicht in meiner Userform von einer zur anderen Prozedur, x ist dann in der anderen Prozedur leer.

dauerhafte Excelvariablen: schau in der Hilfe nach
CustomDocumentProperties

Da schaue ich gleich mal rein.

Kommst du damit klar?

Dank Deiner Hilfe bin ich schon ein ganzes Stück weiter!

Gruß, Frank

Hallo frank,

Habe ich eben getestet, in einer Prozedur Text1 = „Hallo“
geschrieben und in einer anderen Prozedur im selben Modul mit
x = Text1 war x Tatsächlich „Hallo“, super!

Leider funktioniert es nicht in meiner Userform von einer zur
anderen Prozedur, x ist dann in der anderen Prozedur leer.

kann ich jetzt nix zu sagen. An sich sollte das nicht passieren aber ist mir auch schon passiert und ich weiß leider nicht warum.

Wenn du es nicht lösen kannst, zeige den Code oder besser eine Mappe mit dem Code, hochladen mit http://npshare.de/ dann versuche ich mich daran.

dauerhafte Excelvariablen: schau in der Hilfe nach
CustomDocumentProperties

Da schaue ich gleich mal rein.

Zumindest im Gegensatz zu globalen Variablen sind die Variablen dort nicht auf einmal warum auch immer leer. Nur du bestimmst was drin steht und das bleibt bis du es wieder änderst.

Gruß
Reinhard

Hallo Reinhard,

habe ein Muster erstellt aber nun kommt`s
Jetzt funktioniert Dein Code plötzlich, da muss ich wohl vorher etwas falsch gemacht haben.
Ich habe die Mappe trotzdem hoch geladen,
http://npshare.de/files/5671c59b/Muster_Frank.xls
wäre nett, wenn Du nochmal schaust, ob ich es so wie von Dir gedacht gemacht habe und mir eine Rückinfo gibst.

Mit Gruß und vielen Dank!
Frank

Hallo Frank.

Ich habe die Mappe trotzdem hoch geladen,
http://npshare.de/files/5671c59b/Muster_Frank.xls

Ich habe mir Deine Datei 'mal angesehen und möchte gerne zwei Dinge dazu loswerden.

Den Aufruf der UserForm1 solltest Du so gestalten:

Sub Userform\_aufrufen()

 Dim UF As New UserForm1 'Deklariert eine Variable vom Typ UserForm1

 On Error GoTo ErrHandler 'Deklariert eine Sprungmarke bei Auftreten eines Fehlers
 UF.Show 'vbModal

Ende:

 Exit Sub

ErrHandler:

 MsgBox "Beim Aufruf des Formulars ist ein Fehler aufgetreten.", vbOKOnly + vbCritical
 Resume Ende

End Sub

Der Aufruf einer neuen Instanz von UserForm1 hat einige Vorteile.

Deine Anweisung „Me.Hide“ zum Ausblenden von UserForm1 blendet die UserForm lediglich aus, sie ist aber immer noch geladen und alle, in der UserForm deklarierten Variablen (Text1) behalten ihre Werte.
Zum Entladen der UserForm solltest Du daher besser die Anweisung „Unload Me“ verwenden.

VG
Carsten

http://npshare.de/files/5671c59b/Muster_Frank.xls
wäre nett, wenn Du nochmal schaust, ob ich es so wie von Dir
gedacht gemacht habe und mir eine Rückinfo gibst.

Hallo Frank,

du definierst/deklarierst „Text1“ nicht global.
Die Variable ist nur im Modul der Userform bekannt.
Lösche dort
Public Text1 As String
und schreib das oben in ein Standardmodul wie Modul1.

Ich kann dir nur dringenst empfehlen zuoberst in jedes Modul
Option Excplicit
aufzunehmen.

Extras—Optionen—Editor:
[X] Variablendeklaration erforderlich

Danach schreibt der Editor das automatisch in jedes neue Modul.

Damit sind dann Schreibfehler in Variablen viel schwieriger hinzukriegen.
Und dir steht für die Variablen IntelliSense zur Verfügung.

Angenommen du hast so deklariert:

Dim MeineLetzteZelleInSpalteA As Range

und brauchst jetzt diese Variable irgendwo im Code, dann gib nur
mei
ein und drücke Strg+Leertaste…

Gruß
Reinhard

Moin Reinhard,

du definierst/deklarierst „Text1“ nicht global. Die Variable ist nur im Modul der Userform
bekannt. Lösche dort Public Text1 As String und schreib das oben in ein Standardmodul wie Modul1.

Danke das Du Die meine Mappe zur Brust genommen hast, dachte mir schon, das noch nicht alles sauber ist, mit Variablen hatte ich bisher noch nichts am Hut.

Ich kann dir nur dringenst empfehlen zuoberst in jedes Modul Option Excplicit
aufzunehmen. Damit sind dann Schreibfehler in Variablen viel schwieriger
hinzukriegen.
…Und dir steht für die Variablen IntelliSense zur Verfügung.
Angenommen du hast so deklariert:
Dim MeineLetzteZelleInSpalteA As Range
und brauchst jetzt diese Variable irgendwo im Code, dann gib nur mei ein und drücke Strg+Leertaste…

Na das ist doch mal ein Wort!
Ich habe bisher „Option Excplicit“ als überflüssig betrachtet weil mir keiner plausibel erklären konnte wozu das gut sein soll. Von anderen Experten bekam ich nur die Antwort: „Das macht man so!“ Uund das ist für mich überhaupt kein Argument!

Letzte Frage, wie-womit-wodurch bist Du Profi geworden?
Nochmals verschärften Dank!
Frank

Hallo Carsten,

Ich habe mir Deine Datei mal angesehen und möchte gerne zwei
Dinge dazu loswerden.

Das finde ich sehr nett, noch ein Hilfsbereiter!

Den Aufruf der UserForm1 solltest Du so gestalten: …
Dim UF As New UserForm1

Interessanter Code, kannte ich noch nicht.

On Error GoTo ErrHandler 'Deklariert eine Sprungmarke bei Auftreten eines Fehlers

Das meinst Du bestimmt im allgemeinen für größere Prozeduren, oder?
Leider bezieht sich ja das Abfangen eines Fehlers „nur“ auf diese kleine Prozedur und nicht auf den Inhalt des Codes in der Userform.

UF.Show 'vbModal

vbModal habe ich in der Hilfe nachgeschaut, hoch interessant, wie kann ich hier vbModal bzw. vbModeless anwenden? Leider steht da in der Hilfe kein Beispiel.

Deine Anweisung „Me.Hide“ zum Ausblenden von UserForm1 blendet
die UserForm lediglich aus, sie ist aber immer noch geladen
und alle, in der UserForm deklarierten Variablen (Text1)
behalten ihre Werte.
Zum Entladen der UserForm solltest Du daher besser die
Anweisung „Unload Me“ verwenden.

Wie klar und lehrreich für mich, vielen Dank!
Gruß, Frank

Hallo Frank.

On Error GoTo ErrHandler 'Deklariert eine Sprungmarke bei Auftreten eines Fehlers

Das meinst Du bestimmt im allgemeinen für größere Prozeduren,
oder?
Leider bezieht sich ja das Abfangen eines Fehlers „nur“ auf
diese kleine Prozedur und nicht auf den Inhalt des Codes in
der Userform.

Ja, für den Aufruf der Userform kann man bestimmt auf eine Fehlerbehandlung verzichten. Grundsätzlich würde ich aber nicht sagen, dass man die Anwendung einer Fehlerbehandlung von der Größe der Prozedur abhängig machen sollte.

UF.Show 'vbModal

vbModal habe ich in der Hilfe nachgeschaut, hoch interessant,
wie kann ich hier vbModal bzw. vbModeless anwenden? Leider
steht da in der Hilfe kein Beispiel.

Kein Beispiel in der Hilfe? Also, Du kannst in meinem Beispiel einfach das Hochkomma vor vbModal wegnehmen, dann wird die UserForm modal angezeigt und muß erst geschlossen werden, bevor man in Excel weiterarbeiten kann. In der Hilfe steht aber, dass „vbModal“ der Standardwert ist (wusste ich gar nicht), daher müßte man das eigentlich auch weglassen können und stattdessen mit „vbModeless“ arbeiten, wenn man zwischen den Tabellenblättern und der UserForm wechseln will.

VG
Carsten

Hallo Carsten!

Ja, für den Aufruf der Userform kann man bestimmt auf eine
Fehlerbehandlung verzichten. Grundsätzlich würde ich aber
nicht sagen, dass man die Anwendung einer Fehlerbehandlung von
der Größe der Prozedur abhängig machen sollte.

Dem kann ich jetzt folgen, somit kann man auch bei kleinen Prozeduren mit nur ein paar Zeilen gezielt in der MsgBox angeben wo der Fehler aufgetreten ist.

UF.Show 'vbModal

In der Hilfe steht aber, dass „vbModal“ der Standardwert ist (wusste ich gar nicht)
…daher müßte man das eigentlich auch weglassen können
und stattdessen mit „vbModeless“ arbeiten, wenn man zwischen
den Tabellenblättern und der UserForm wechseln will.

Alles kapiert! In meinem Fall möchte ich tatsächlich gerne in den Tabellenblättern arbeiten können und die Userform geöffnet lassen.
Also lautet mein Aufruf jetzt „UserForm1.Show vbModeless“ bzw. nach Deiner Empfehlung „UF.Show vbModeless“

Nochmals vielen Dank
und viele Grüße aus Lübeck!
Frank

Alles kapiert! In meinem Fall möchte ich tatsächlich gerne in
den Tabellenblättern arbeiten können und die Userform geöffnet
lassen.
Also lautet mein Aufruf jetzt „UserForm1.Show vbModeless“ bzw.
nach Deiner Empfehlung „UF.Show vbModeless“

Hallo Frank,

Vbaler sind schreibfaule Säcke :smile: Wenn die also z.B. wegen Option Explicit anfangs sehr bewußt erhöhten Schreibaufwand auf sich nehmen so hat das Gründe.
Du mußt dabei an längere Codes denken und keine 10-Zeiler.
So, dann hast du eine Variable „Letzte“ im Code.
Und (der lange ) Code klappt und klappt nicht, du suchst dich blöde bis du nach langer Zeit, 2 Stunden ist da kein Problem, den Fehler findest weil du irgendwo in einer Codezeile verstckt „Letze“ stehen hast.

Sowas verhindert Option Explicit zuverlässig.

Jetzt zu
Userform1.show

Userform1.show
und
Userform1.show 1
und
Userform1.show vbmodal

ist gleichwertig.

Genauso wie
Userform1.show 0
und
Userform1.show vbmodeless

Startest du z.B. eine UF durch F5 im Modul der UF so ist das immer eine „gebundene“ Userform. Also Userform1.show, Userform1.show 1, Userform1.show vbmodal

Konkrete Folgen des Unterschiedes wie man eine UF startet ist z.B. ob die User während die UF angezeigt wird in ihren Tabellen noch weiterarbeiten können oder nicht.
Bei 0 können sie, bei 1 muß erst die UF weg bevor sie weiterarbeiten können.

Manchmal ist das Eine erwünscht, manchmal das Andere.

Zurück zum Schreibfaulen.
Userform1.show vbmodeless
siehste vielleicht in lehrbüchern oder sonstigem Mist.
In der praxis steht da
Userform1.show 0
oder
Userform1.show 1

Denn so Basics weiß jeder Vbakundige auswendig, deshalb steht da auch bei z.B. SVerweis in Excel als vierter Paramter kein Wahr oder falsch.
Da steht 0,1, nix)
Denn das kennt auch jeder.

Das betrifft aber NUR SEHR bekannte Funktionen.
Für ALLES ANDERE gilt, es so zu schreiben
Userform1.show vbmodeless
oder
Userform1.show vbmodal

Das hilft anderen deinen Code flüssig zu lesen und auch dir wenn du ihn nach 2 Wochen wieder mal siehst.
Dann hast du bestimmt vergessen was denn genau sortiert wird nach welchen Regeln bei sowas (Pseudocode):

„irgendwas“.Sort(0,3,0,1,2,0)

Just my 2 Cents

PS: Du hast du doch gefragt wie ich Profi wurde? Erstens bin ich keiner denn ich verkehre noch in einem anderen Forum und daher weiß ich genau wo der Hammer hängt :smile:

Mein Wissen habe ich durch Mitlesen in Foren. Anfangs mehr als Frager, dann versucht die gebotenen Lösungen zu verstehen in Zusammenarbeit mit F1.
Zug um Zug (eher kleine Tippselschritte) wurde ich besser und habe dann probiert andere Anfragen die dort auftauchten zu lösen.
Ging sehr oft schief aber ich las die Antworten anderer und versuchte die zu verstehen und umzusetzen.

Dieser „learning by doing“ Weg ist hart und anfangs nicht durch Fortschritte geprägt aber dann…

Angenommen, ein Kumpel von dir hat das gleiche Wissen über Excel und Excel-Vba wie du.
Er kauft sich Bücher, macht Kurse ein jahr lang, du machst es o wie ich.
Im ersten jahr ist er dir klar über. Kann schon dolle Sachen.
Sein Problem ist, er kann nur die. Du kannst schon viel mehr aus allen möglichen Gebieten bei Excelanfragen.
Und je länger das läuft umso chancenloser wird er dir gegenüber.

Gruß
Reinhard

Gruß
Reinhard

Hallo Reinhard ,

Das muss ich erst mal verdauen!
Hochinteressant auch Deine Lernhinweise.

Du hast mir sehr geholfen, dafür nochmals vielen Dank
und viele Grüße aus Lübeck! Frank