Category Archives: Userforms

Dringend gesucht! Du bist ein Mann? Kletterst gerne? Hast keine Angst vor Wasser? Dann melde dich schnell – ich suche jemanden zum Fensterputzen.

Amüsiert. Ich erstelle in Excel mit VBA eine Eingabemaske, in der verschiedene Begriffe stehen:

Wenn aus allen drei Listenfeldern etwas ausgewählt wird, werden die drei Begriffe in die entsprechenden Spalten eingetragen.

Klappt.

Danach wird die Auswahl entfernt

ListIndex = -1

Klappt nicht. Der Grund: das Ereignis Click deselektiert die drei Listen und DANN wird der Klick durchgeführt; das heißt: NUN ist ein Eintrag markiert.

Doof!

Ich mache mich auf die Suche, ob eines der Ereignisse ein Parameter Cancel besitzt, mit dessen Hilfe man ihn abbrechen könnte.

Fehlanzeige.

Also noch einmal schauen und probieren. Dann finde ich die Lösung: ich muss Click durch MouseUp ersetzen – DANN funktiert es: zuerst wird der Mausklick durchgeführt und DANACH der Code abgearbeitet (nicht umgekehrt wie beim Ereignis Click:

Private Sub lstRechts_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Heute habe ich gelesen, was auf der Flasche Shampoo steht: Für extra Volumen und mehr Fülle!!! Kein Wunder, dass es mir schwerfällt, mein Gewicht zu kontrollieren! Ich werde ab sofort Geschirrspülmittel benutzen! Da steht drauf: entfernt auch hartnäckiges Fett.

Einfach nicht aufgepasst!

Mit VBA wird eine Userform (eine Maske) erstellt zur bequemen Dateneingabe. Der Wert eines Textfeldes wird als String interpretiert und als solcher bei Dezimalzahlen in eine Excelliste eingetragen. Man erkennt es, weil die Zahlen linksbündig in der Zelle stehen:

Dummerweise wird ein Text immer größer als eine Zahl definiert, so dass eine Formel

=WENN(J2>1000;WAHR;FALSCH)

immer WAHR liefert!

Dieser Wein schmeckt nach Waldboden, Eicheln und einem Hauch von Trüffeln. – Na, dann schütt ihn halt weg!

Hallo Herr Martin,

das sieht erst mal gut aus.
Auch das löschen scheint schneller zu funktionieren.

Werde die Version zum Testen meinem Bekannten schicken.
Wer einer ein Fehler findet dann er.

Habe gesehen, dass man das Konto „NEU“ löschen kann. Habe ich aus Versehen gemacht.

Danach kann man keine Konto mehr hinzufügen, da die Schaltfläche dann ausgegraut ist.
Kann man das noch verbessern?

Hallo Herr L.

den Ändern-Button hatten Sie dynamisch bei „(Neu)“ aktiviert und deaktiviert – den Löschen-Button wohl vergessen. Ist auch drin.

Hallo Herr Martin,

Sie haben vollkommen Recht.

Der Fehler war vorher schon da. Ist mir nie aufgefallen, da ich nie Konten bei mir selbst gelöscht hatte.

#####

Fazit: Wie mein Lorenz: ich solle auch einen Blog aufmachen mit dem Titel kunde-nervt …

Um zu verstehen, warum manche Menschen überall ihren Senf dazu geben, musst du lernen, wie eine Bratwurst zu denken.

Hallo Herr Martin,

mir ist ein Fehler aufgefallen, der vorher nicht vorhanden war.

Die Excel-Tabelle in Excel 365 funktioniert tadellos, soweit ich getestet habe.

Ein Freund von mir hat leider aus der alten Version die Daten nicht in die neue Version reinbekommen und so hat er sich entschlossen, diese neu einzugeben.

Wenn er ein Konto anlegt – das geht noch.

Dann will er Einzahlungen in das Einzahlformular hinzufügen, dies scheint erst mal nicht zu funktionieren. In der Liste zeigt er nichts an!

Wenn ich mir die Tabelle außerhalb des Formulars anschaue, sind die Daten angelegt – Die Paketnummer wird nicht mehr hochgezählt.

Auch ein speichern und erneuter Start der Tabelle bringt keine Abhilfe.

In der alten Version (bei mir 6.11) funktioniert es noch tadellos. Mein Bekannter setzt Excel 2016 (neuste Updates sind installiert) ein. Bei mir geht es, bei ihm nicht, mit der letzten Version.

#####

Hallo Herr L.,

in Ihrem Programm finde ich die Codezeile:

If rngI.Value = Me.cmbAuswahlKontoAlleInvestments.Value Then

Sie prüfen, ob eine Kontonummer ausgewählt wurde. Da Kontonummern Zahlen sein können (4711) vergleichen Sie diese Zahl mit dem TEXT aus der Combobox (alle Steuerelemente liefern immer Texte).

Deshalb kann es nicht funktionieren! Der Fehler war vorher schon vorhanden; ist Ihnen in IHRER Liste nicht aufgefallen, weil dort alle Konten alphanumerisch ist.

Ich habe es korrigiert:

If CStr(rngI.Value) = Me.cmbAuswahlKontoAlleInvestments.Value Then

Sucht ihr morgens eure Unterwäsche auch nach den Chancen auf Sex aus? Ich trage heute einen Jute-Einkaufsbeutel.

In verschiedenen Programmiersprachen gibt es verschiedene Konventionen für die Benennung der Dinge. Beispielsweise die Variablen oder Parameter. Zu den Namenskonventionen gehören beispielsweise die Reddick-Namenskonventionen, in denen eine String oder Long-Variable mit strNachname oder lngZeile benannt wird. Oder die ungarische Notation, in welcher diese variablen stNachname und lZeile genannt würden.

Wer in VBA programmiert stellt schnell fest, dass die Kombinationsfelder, Listenfelder, Register und Multiseiten eine andere Struktur haben als die anderen Steuerelemente auf den Dialogen (Userformen):

Nicht nur, dass sie Null-basiert sind (anders als die übrigen Elemente), die Parameter werden nicht mit „sprechenden“ Namen angezeigt (wie eigentlich üblich), sondern gemäß der dort verwendeten Namenskonvention:

Und so bin ich glatt reingefallen, weil der letzte Parameter nicht IIndex (also mit zwei „ii“) heißt, sondern klein-L-Index … Verwirrend!

Ich habe ein Rezept zum Abnehmen gefunden. Ich laufe im Supermarkt hinter ganz schlanken Leuten her und kaufe genau das Gleiche ein wie sie. Heute gibt es Luftballons bei mir!

Ein Freund von mir erklärt mir häufig, dass er sich nicht bei facebook anmeldet, weil fb ein Zeitfresser sei.
Nun: ich kenne einen anderen Zeitfresser. Er heißt: VBA!
Kennt ihr folgende Anomalie? Ich erstelle ein Userform mit einem Listenfeld. Zu den Einträgen sollen mehrere Einträge ausgewählt werden können. Ich entschließe mich für ein zweites Listenfeld, das ich daneben platziere. Dem Auftraggeber gefällt es nicht, weil die Userform groß und unübersichtlich ist (sehr viele Steuerelemente). Ich entschließe mich zu einer zweiten Userform. Also: Eintrag auf dem Listenfeld wird ausgewählt: Doppelklick, eine zweite Userform wird geöffnet, mit Werten gefüllt, von denen der Anwender mehrere auswählen kann (MultiSelect).

Zirka zwei Stunden lang habe ich über folgendes Problem gestutzt: Während des Doppelklicks öffnet sich die zweite Userform. Das Klickereignis wird schon abgefangen und sorgt dafür, dass auf der zweiten Liste der zweiten Maske auch Einträge selektiert werden. Sämtliche Versuche per VBA alles zu deselektieren (Selecetd(i) = False) scheitern!
Ich habe mich dann entschieden die Userform umzubauen. Das Listenfeld der zweiten Form liegt nicht mehr über dem Listenfeld der ersten. Dann klappt es!

Böses, böses Excel – manchmal nervst du!
Also doch lieber facebook – dort vertrödle ich weniger Zeit!

Wir werden die erste Generation sein, die eine Handyhalterung am Rollator hat.

Ich erstelle ein großes, komplexes Formular (UserForm) in VBA, starte es zum Testen und:

Unerwartetes Dateiende.

Etwas differenziertes dürfte es schon sein. Vor allem dürfte der Debugger starten, der mir die Zeile kennzeichnet, in der der Fehler erzeugt wurde.

PS: Der Fehler kam dadurch zustande, dass ich ein Objekt adressiert hatte, das nicht in einer Sammlung vorhanden war. Ich habe den Fehler im Einzelschrittmodus gefunden.

Von der Veranlagung her bin ich schlank. Ich lebe es aber nicht aus.

Nicht aufgepasst. Da habe ich einfach nicht aufgepasst!

Ich fülle eine Userform mit Daten. In einem Listenfeld werden Informationen angezeigt.

Beim Klicken auf einen Eintrag wird der erste Teil in einem Textfeld angezeigt, der zweite Teil im Kombinationsfeld, dessen Eigenschaft Style auf 2: fmStyleDropDownList gestellt wurde. Das Ergebnis: der Eintrag wurde nicht gefunden …

… und mit der Fehlermeldung „Eigenschaft Value konnte nicht gesetzt werden. Ungültiger Eigenschaftswert“ quittiert.

Also: immer gut aufpassen, was man wo reinschreibt!

Wer zuletzt lacht, denkt zu langsam!

Wir haben heute lange gesucht!

Heute habe ich mit einem Kunden zusammen in VBA einige Dinge programmiert. Er zeigte mir die Sachen, die nicht funktionieren – beispielsweise die Schaltfläche, die per Programmierung ein Formular füllt, das anschließend angezeigt wird. Es wurde aber nicht angezeigt. Wir haben eine Weile gesucht. Wo hat es sich nur versteckt? Bis wir dahinter kamen, dass der Kunde vor Kurzem mit seinem Laptop mit zwei Bildschirmen gearbeitet hatte. Windows hatte den zweiten Bildschirm noch gespeichert – und dort – für uns nicht sichtbar! – wurde das Formular angezeigt. Böses Versteck!

Also: die StartUpPosition der Userform auf „Fenstermitte“ gestellt – und schon klappte es wieder!

Lächle – du kannst sie nicht alle töten!

Liebe VBA-User: Ist euch das schon aufgefallen:

Ich erstelle in Excel 2016 eine UserForm. Auf der UserForm befindet sich eine Befehlsschaltfläche mit folgenden zwei Codezeilen:

Workbooks.Add
Unload Me

In dem Projekt befindet sich ein Makro:

Sub MaskeStart()
UserForm1.Show
End Sub

Dieses Makro wird an eine Schaltfläche auf dem Zeichenblatt gebunden (dabei ist es egal, ob es sich um ein Formularsteuerelement oder ein Active-X-Steuerelement handelt.

Ich „mache das Steuerelement scharf“, klicke darauf, die Maske startet, eine neue Datei wird geöffnet, in der ich allerdings keine Registerkarte aktivieren kann. Das war doch in älteren Excelversionen nicht der Fall, oder irre ich mich?

 

Die Liste wird kleiner – und das kurz vor Weihnachten!

Amüsant. Heute in der VBA-Schulung. Wir basteln eine dynamische UserForm. Bei der Auswahl „ein Verkäufer“ kann ein Verkäufer ausgewählt werden, bei der Auswahl „alle Verkäufer“ wird das Listenfeld inaktiv.

Der Code:

Private Sub optAlleVerkäufer_Click()
Me.lstVerkäufer.BackColor = &H8000000F
Me.lstVerkäufer.Enabled = False
Me.lstVerkäufer.BorderStyle = fmBorderStyleSingle
End Sub

Private Sub optEinVerkäufer_Click()
Me.lstVerkäufer.BackColor = &H8000000E
Me.lstVerkäufer.Enabled = True
Me.lstVerkäufer.BorderStyle = fmBorderStyleNone
End Sub

So sieht es nach der Initialisierung aus:

20161312rand01

Neun Mal wechseln zwischen alle und ein Verkäufer:

20161312rand02

Nach 17 Mal wechseln:

20161312rand03

Nach 22 Mal:

20161312rand04

Amüsant ?!? Das Listenfeld wird immer kleiner. Man muss gar nicht das Listenfeld inaktiv (Enabled = False) setzen. Es genügt die Eigenschaft BorderStyle zu ändern. Ein paar Mal. Nach zehn bis 20 Klicks schrumpft das Listenfeld bedenklich:

Private Sub optAlleVerkäufer_Click()
Me.lstVerkäufer.BorderStyle = fmBorderStyleSingle
End Sub

Private Sub optEinVerkäufer_Click()
Me.lstVerkäufer.BorderStyle = fmBorderStyleNone
End Sub

Eine neue Liebe ist wie ein neues Leben

Ich liebe VBA. Vielleicht weil ich diese Sprache so gut kann und deshalb schnell programmieren kann.

Ich hasse VBA. Manchmal. Vor allem, wenn ich nicht verstehe warum Dinge passieren:

Ein Listenfeld wird mit Werten gefüllt. Per Programmierung selektiere ich einen der Einträge. Dabei ist es gleichgültig, ob ich die Eigenschaft Value verwende oder von der Sammlung Selected den Wert k auf True setze. In der nächsten Zeile zeigt die Überprüfung, dass der Value der Listbox = „“.

 

Value = "" ???

20160526Liste02

 

Dann hasse ich VBA sehr! Vor allem: bei den übrigen Listenfeldern funktioniert es – lediglich bei einem nicht.

Trotzdem: in der Liste ist er ausgewählt. Verstehe ich das? Nein!

Trotzdem: in der Liste ist er ausgewählt. Verstehe ich das? Nein!

Du sollst dir kein Bildnis machen

Hallo zusammen, liebe VBA-Gemeinde,

Ist das schon einmal jemandem aufgefallen? Auf einer UserForm wird dynamisch ein Bild angezeigt:

Me.imgBild.Picture = LoadPicture(strPfad & strBilder(i))

Damit kann man eine kleine Bilderschau erzeugen.

Bild20160210

Jedoch: Klickt man auf das Bild, funktioniert der LoadPicture-Befehl nicht mehr … Okay, okay … DAMIT kann ich leben!

Listenfelder – nicht konsequent

Wenn Sie in VBA programmiert haben und wenn Sie dort Listenfelder und Kombinationsfelder erstellt habe, haben Sie sicherlich schon entdeckt, dass beide über die Sammlung Column und Row verfügen, die Listenfelder auch über die Sammlung Selected. Das erstaunt, weil Sammlungen eigentlich immer ein Plural-s besitzen: Rows, Worksheets, Workbooks, Cells, Charts, …

Ebenso erstaunt, dass die Zählung der Elemente bei 0 beginnt und nicht bei 1 wie bei allen anderen Sammlungen. Auch das Hinzufügen eines neuen Elementes heißt AddItem und nicht Add.

Ich vermute, dass diese beiden Steuerlemente von einem Drittanbieter hinzugekauft wurden, der etwas andere Konventionen verwendet hat.

Ein Kombinatonsfeld

Ein Kombinatonsfeld