Prüfungen sind deshalb so scheußlich, weil der größte Trottel mehr fragen kann, als der klügste Mensch zu beantworten vermag.

Ein HALLO und DANKESCHÖN für deinen Support über die Alpen,

bei uns bläst der Wind bei ca. 19 Grad und im WWW finde ich nicht die korrekte Lösung,
wie man in einem Listenfeld eines Formulars die Spaltenkopfinformationen setzt.

Also unter:

Private Sub UserForm_Initialize()

findest du schon Mal den VBA, auch die Zeile ColumnHeads = True

aber das i-Tüpfelchen nicht, wie man die Daten aus dem Bereich A1:D1 des Tabellenblattes „Material Data“ übernimmt, fehlt mir noch.
Die Lösungen des WWW führten leider nicht zum Erfolg.
Dankeschön & Gruß
Jürgen

Hallo Jürgen,

so geht es:

du musst einen Bereich definieren (mit Überschrift).

Und die Adresse (also $A$1:$D$14) an die RowSource übergeben.

Leider verlangt VBA die Adresse vom aktiven Blatt. Also muss man wechseln – möglicherweise am Ende wieder zurück:

    With Me.LB_Entries

        .ColumnHeads = True

        Worksheets(„Material Data“).Activate

        .RowSource = xlBereich.Address

    End With

Den kompletten Code in deinem Beispiel findest du in der zweiten Userform:

    Set xlBereich = Worksheets("Material Data").Range("A1").CurrentRegion
    Set xlBereich = xlBereich.Offset(1, 0).Resize(xlBereich.Rows.Count - 1, xlBereich.Columns.Count)
    
    With Me.LB_Entries
        .ColumnHeads = True
        Worksheets("Material Data").Activate
        .RowSource = xlBereich.Address
    End With

Liebe Grüße

Rene


Wer schlanker wirken möchte, sollte sich in der Nähe von Elefanten aufhalten.

Einfach nicht aufgepasst.

Access

Ich erstelle ein Endlosformular mit einem Textfeld, das natürlich mehrmals angezeigt wird:

Das Feld, oder genauer: der Detailbereich soll so groß werden wie der Text es vorgibt. Ein paar Zeilen Code sind nötig:

         If intZeilen > 6 Then
            
            Me.Detailbereich.Height = (1701 / 6) * intZeilen
            Me.txtAktueller_Stand.Height = (1701 / 6) * intZeilen
            
         Else
            
            Me.Detailbereich.Height = 1701
            Me.txtAktueller_Stand.Height = 1701
            
         End If

Der Detailbereich wird größer, wenn längerer Text eingegeben wurde und der Cursor in das Textfeld gesetzt wird:

Allerdings: der Bereich wird nicht wieder kleiner:

Die Lösung:

ich darf nicht zuerst den Detailbereich verkleinern und anschließend das Textfeld, sondern umgekehrt: zuerst das Textfeld und DANN den Detailbereich:

            Me.txtAktueller_Stand.Height = (1701 / 6) * intZeilen
            Me.Detailbereich.Height = (1701 / 6) * intZeilen

DANN klappt es auch:

Hat jemand die Nummer von der Stiefmutter von Schneewittchen. Ich bräuchte mal ein paar Äpfel.

Kennt ihr das? Eigentlich sollte es nicht so sein. Aber einer der Kunden bestellt unbedingt darauf. Hat auch einen guten Grund dafür.

Der Kunde ist König!

Nun – gut – soll er seinen Willen haben!

In einem sehr umfangreichen Projekt, das mit VBA realisiert wurde, soll eine Auswahl über eine Auswahlliste getroffen werden. Aber eben ein Kunde möchte Freitext haben. Eigentlich widerspricht dies dem Workflow.

Also füge ich unter der Liste ein Textfeld (!) ein und formatiere es so, dass es aussieht als wäre es ein Bezeichnungsfeld. Man muss einige der Eigenschaften ändern:

Das verraten wir natürlich nur einem Kunden. Damit DER Freitext eingeben kann. Weil er es will. Weil er es braucht. Eben: weil der Kunde König ist:

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