Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Listenbox: Daten aus der Tabelle in Formular laden nach Auswahl in der Listenbox
#1
Hallo,



ich wäre Euch sehr dankbar, wenn Ihr mir bei folgender Herausforderung helfen könntet:




Ausgangssituation:


Ein Formular besteht aus einem Listenfeld und unter nderem etlichen Textfeldern.


In der Listenbox des Formulars werden die Daten aus einer Tabelle eingelesen.


Es werden nur die Spalten: Name, Vorname, Geburtsdatum angezeigt.


Die ID-Nummer wird zwar auch eingelesen, aber nicht angezeigt.


Sie soll später dazu dienen, den entsprechenden Datensatz schneller zu finden.


(Möglicherweise überflüssig?)


Den Schritt bis hierhin habe ich bei meinen ersten Gehversuchen in Excel VBA mit viel Versuch und Irrtum leidlich geschafft.




Die Herausforderung:


Ich möchte, dass wenn eine Zeile in der Listenbox ausgewählt wurde, dass


a) der entsprechende Datensatz in der Tabelle gefunden wird,


b) die im Formular vorhanden Textfelder entsprechend gefüllt werden, (z. Z. in Beispieldatei noch funktionslos)


c) bei Änderung im Formular sollen die Daten in der Tabelle entsprechend ebenfalls geändert werden.


Momentan habe ich nicht den leisesten Schimmer, wie ich das machen soll.


Für Hinweise wäre ich Euch daher sehr dankbar.



Da Anfänger, der von Excel nur 3%, von VBA kaum mehr versteht als eine Kuh vom Klavierspielen, möchte ich Euch bitten das so zu erklären, dass es auch für ein Greenhorn wie mich nachvollziehen ist.

Für jede Beispieldatei bin ich dankbar.



Nicht ganz so wichtig!


Es gibt noch andere Herausforderungen, die ich gerne lösen würde, sind aber momentan zweitrangig ist.


1.


In dem Formblatt gibt es ein Textfeld: „text_Suchbegriff“.


Wird ein Buchstabe eingetippt, wird die Liste entsprechend auf den Anfangsbuchstaben des Namens verkürzt.


Bei zwei Buchstaben z. B. „Ba“ wird die Liste weiter verkürzt, statt Bauer bis Braun, werden nur Namen aufgeführt, die mit Ba anfangen.


Wermutstropfen:


Wenn ich einen oder mehrere Kleinbuchstaben eintippe, z. B. „b“ werden mir in der Liste alle Namen angezeigt, die den Buchstaben „b“ enthalten;

nicht der Hit.




Was muss geändert werden, damit auch bei Eingabe von Kleinbuchstaben nur die Anfangsbuchstaben des Nachnamens berücksichtigt werden?



2. Eine Besonderheit, die hier vor Ort – Lateinamerika - wichtig ist:


In der Beispielliste tauchen die Name Peña und Pena auf.


Wenn ich als Suchkriterium „Pe“ eingebe, werden beide Namen auch in der Liste aufgeführt.


Wenn ich allerdings statt Peñ, Pen eingebe, wird der Name Peña nicht gefunden, entsprechend auch nicht in der Liste gezeigt, sondern in der Name „Pena“.


Das gleiche würde passieren, wenn ich statt einem á nur ein a eingebe.

Hinweis: selbstredend gibt es auf einer Tastatur für Lateinamerika sowohl den Buchstaben ñ als auch n.
Aber es wäre schön, dass sowohl Buchstaben wie á, Á usw "gleichwertig" bei der Suche berücksichtigt würden.



Wie kann ich das lösen?



3. Wenn ich eine Buchstaben in „text_Suchbegriff“ eingebe, wird zwar die „gefilterte“ Liste gezeigt,


der Header der Liste ist dann aber leer; nicht so schön!


Wenn ich das Eingabefeld „text_Suchbegriff“ leere wird wieder die ungefilterte Liste gezeigt, aber der Header ist trotzdem „leer“.



Was muss ich tun, damit auch der Header wieder angezeigt wird?



4. Wenn ich im Designemodus unter VBA im Formular / Listbox eine Zeile auswähle, wird die im "run-modus" ebenfalls als ausgewählt angezeigt


Was muss ich tun, damit beim Aufrufen des Formulars keine Zeile in der Listbox bereits vorab ausgewählt wurde?


Listenindex auf 0 (?) setzen? Wenn ja, wie?



5. Die zu filternden Datensätze für die Listbox werden über eine "Schleife"

For lngZeile = 1 To lngZeileMax   etc

eingelesen.

Ich bin ziemlich davon überzeugt, dass es eine elegantere Lösung gibt,

irgendetwas mit
Me.lbo_Daten.RowSource +
Filter

Habe aber keine Ahnung wie!



6. (ich weiß, ganz schön viele Fragen auf einmal).



Am liebsten würde ich auf die Listenbox verzichten und lieber eine Dropdownliste verwenden.

(Unter anderem auch aus Platzgründen im Formular.)


Ich habe aber die spaltenmäßige Formatierung in der Listbox nicht hinbekommen.



Falls es auch dafür eine Lösung gibt, die Listenbox durch eine Dropdownliste zu erstezen - entsprechende spaltenmäßige Formatierung vorausgesetzt -

wäre ich für Beispiele dankbar.



Danke Peter, El Salvador




PS.:


a) die im Anhang angefügte Beispiel-Datei enthält nur Dummy-Namen usw.


b) die Textboxen in dem Formular – bis auf die Textbox "Text-Suchbegriff" - haben noch keine Funktion, das gleiche gilt für die Command-Button mit Ausnahme "Abbrechen"


c) die Berechnung „Alter" in der Tabelle ist ungenau. Die Funktion „dateDiff“ funktioniert mal ja, mal nein.



Ich nutze Offfice 365 unter Wind 10 Prof


Angehängte Dateien
.xlsm   Listbox 02.xlsm (Größe: 43,13 KB / Downloads: 14)
Antworten Top
#2
Hallo,

zunächst eine Frage: du hast im UserForm 12 Textboxen in der Liste Stammdaten aber nur 7 Spalten. Was ist mit den 5 fehlenden? Werden die nicht gebraucht?

Hallo,

bei mir funktioniert Datedif einwandfrei. (Excel 365)
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • peschiber
Antworten Top
#3
zwei Sachen auf die Schnelle weggemacht. Die Überschriften sollte man besser in Textfelder drüber setzen. Da du wohl auf die Spaltenüberschriften in der Listbox setzen willst, habe ich es mal auf die rabiate gemacht.
Filter wahr nur auf die falsche Startzeile gesetzt. Für mehr fehlt mir leider im Moment die Zeit.


Angehängte Dateien
.xlsm   Listbox 02.xlsm (Größe: 37,81 KB / Downloads: 8)
Antworten Top
#4
Mehrere Dinge habe ich geändert.

• ListBox Kopfspalte getrennt angelegt, wobei ich immer noch der Meinung bin - ordentliche Textfelder sind besser.
• Markierter Datensatz in ListBox werden in TextBoxen ausgegeben.
• Die Formel zur Altersberechnung habe ich geändert, damit das Alter in der TextBox ohne Nachkommastellen erscheint.

Ergänze deine Tabelle und trage im Modul die noch nicht vorhanden Spaltenzuordnung der TextBoxen selbst nach und lade deine Datei wieder hoch. So wie ich etwas Zeit habe, helfe ich Dir für den Rest weiter.


Angehängte Dateien
.xlsm   Listbox 02.xlsm (Größe: 43,47 KB / Downloads: 10)
Antworten Top
#5
Hallo Egon12,

danke für deine große Hilfe und die Modifizierung meiner Beispieldatei.

Und Danke auch an all die Anderen, die mir als Einsteiger so tatkräftig versuchen unter die Arme greifen.

Deinen Hinweis, bezüglich "0" bei der Altersfunktion, super! woher soll unsereins das wissen?

Auch für deinen Hinweis:
• Markierter Datensatz in ListBox werden in TextBoxen ausgegebe.
Danke!
(Ich habe die Werte noch nicht in die Textfelder übertragen, weil das für mich momentan bei den ersten Trockenübungen zweitrangig war.)

Meine Herausforderung ist momentan sind zwei andere!
1.
Die Listbox enthält z. Z. nur ID, Name, Vorname, Geburtsdatum.
Sobald eine Zeile in der Listenbox ausgewählt wurde, sollen alle anderen Daten, wie Straße usw aus der Tabelle in die Textfelder eingelesen werden.

Die momentante Quelle "Stammdaten" enrhält nur 7 Spalten, wird aber letztendlich sicher auf 30 Spalten mit Werten erweitert.

Du hast ja schon den indirekten Hinweis geliefert, wie ich die Daten einlesen kann"
Private Sub lbo_Daten_Click()
    Dim iSpalte As Integer ' Zahl letzte Spalte
    Dim X As Worksheet
    Dim i As Integer
    Dim z As Integer

    Set X = Sheets("Stammdaten")
    iSpalte = X.Cells(3, Columns.Count).End(xlToLeft).Column 'Letzte Spalte ermitteln

    For z = 1 To iSpalte ' Textboxen 1 bis letzte
        i = X.Cells.Find(lbo_Daten).Row
        If lbo_Daten <> "" Then
          Text_Nachname = X.Cells(i, 1).Offset(0, 1)
          Text_Vorname = X.Cells(i, 1).Offset(0, 2)
          Text_Geb = X.Cells(i, 1).Offset(0, 3)
          Text_Alter = X.Cells(i, 1).Offset(0, 4)
          Text_volljaerig = X.Cells(i, 1).Offset(0, 5)
        End If
    Next z
End Sub

Für einen Einsteiger, 70 + x, der normalerweise wenig mit computern am Hut hat, ganz schöner Tabak.
Beispiel "Offset": noch nichts davon gelesen.
Was ich mich frage:
Kann frau / man das nicht mit einem Rutsch machen, statt über eine "For ... Next" Schleife?
Bei eventuell 30 Spalten ganz schön viele "Schleifen".

Warum ich das frage?
Ich war völlig baff, dass im Editmodus des Formulars bei der Definition der Eigenschafften für die Listbox es ausreichte,
für Rowsource die Quelle "Tabelle1" anzugeben, und schon wurden mir selbst im Editmodus alle Werte in der Listbox angezeigt.
Meine naive Vorstellung:
warum kann ich, keine Ahnung wie, den Begriff "Rowsource" nicht auch im VBA Code für die Füllung aller Textflelder verwenden?
Egal! Das ist für mich momentan gar nicht wichtig! hätte mich nur interesseirt.
Hauptsache ich bekomme Hinweise, wie die im Formular geänderten Einträge in die Tabelle zurückgeschrieben werden!

Herausforderung Nr. 2:
Wenn ich auf den Button "Änderunge vornehmen" (besser: "Änderungen übernehmen") klicke,
sollen die vorgenommenen Änderungen im Formular in die Tabelle "Stammdaten" übernommen werden.

Momentan habe ich nicht den blassesten Schimmer, wie ich Nr. 2 bewerkstelligen soll.

Dafür suche ich eine Lösung, Beispieldatei(en).

Dañke im voraus an alle die Helfenden für entsprechende Vorschläge, Beispieldateien oder Links.

-----------

Ein anderes geschildertes Teilproblem habe ich inzwischen selber gelöst.
Worum ging es in meiner Anfrage?
Die Filterfunktion für die Listenbox "versagte" dann, wenn der erste Buchstabe kleinstatt groß geschrieben wird.
Dann wurden alle Nachnamen aufgelistet, die zum Beispiel den Buchstaben "e" enthielten.
Das habe ich inzwischen wie folgt gelöst:

intgLenText = Len(txt_Suchbegriff.Value)      'länge des Stings berechnen

Select Case intgLenText
  Case Is = Empty
   
    Case Is = 1
    Me.txt_Suchbegriff.Value = UCase(Me.txt_Suchbegriff.Value)
   
    Case Is > 1
    Me.txt_Suchbegriff.Value = UCase(Left(Me.txt_Suchbegriff.Value, 1)) _
        & LCase(Right(Me.txt_Suchbegriff.Value, Len(Me.txt_Suchbegriff.Value) - 1))

End Select

Ich bin sicher, es gibt elegantere Lösungen, aber als Einsteiger in VBA bin ich froh, dass es funktioniert.
(Datei liefere ich nach, sobald ich Eure Vorschläge eingearbeit habe.)
Natürlich bin ich auch für diesenTeilbereich für Verbesserungsvorschläge dankbar.

Noch nicht gelöst!
Hier vor Ort wichtig!
Wie müsste zum einem
die Case Funktion erweitert werden, damit der Filter sowohl die Schreibweise "Pen" als auch "Peñ" berücksichtigt.
Konkret:
egal ob ich "Pen" oder "Peñ" eintippe, beide Namen, hier im Beispiel "Pena" und "Peña" sollten anschließend gelistet werden.
Hinweis: auf der Tastatur für Lateinamerika gibt es sowohl "n" als auch "ñ"
Gleiches würde für "á", "Á" usw. gelten.
zum anderen:
wie muss die "Suchfunktion" entsprechend geändert werden?

Für Lösungsvorschläge / Links / Beispieldatei noch besser, bin ich dankbar.

Liebe Grüße aus El Salvador, Peter


Armut durch Bildung bekämpfen!

Hallo Dieter,

danke für deinem Hinweis.
Sei doch bitte so lieb und ändere das in meiner Beispieldatei.

Danke Peter
Antworten Top
#6
Hallo Egon 12,

in Ergänzung zu meiner Antwort vom 26. 01. 2021, 05:01 Deutscher Ortszeit

Ich habe deine modifizierte Datei, Listbox2 getestet.
Klick in die Liste und die Textfelder werden mit den entsprechenden Datensätzen aus "Tabelle1" gefüllt.
Eigentlich super! Leider nur eigentlich.
Warum?

Beim Testen ist mir aufgefallen, dass bei beim Klick ab einem bestimmten Listenindex in der Listbox, die Textfelder mit "falschen" Daten gefüllt werden.
In der Beispieldatei funktioniert ab Eintrag "Becker" die korrekte Zuweisung nicht mehr.
"Becker" geklickt: angezeigt wird "Adamek" usw.
Nur wenn ich die letzte Zeile in der Listbox anklicke, erscheint dann wieder der richte Nachname: "Valocina" in im Textfeld.

Leider funktioniert auch der Filter nur bedingt - scheinbar nach dem gleichen Prinzip.

Bei Vorauswahl Buchstabe "A", funktioniert es perfecto.
Bei "B" dann nur bis "Baumeister de Rivera".
Danach, egal welchen Eintrag ich aus der "gefilterten Listbox wähle, ob Becker oder Belleso: angezeigt wird mir im Textfeld der Nachname: "Adamek"

Das ganze Spiel setzt sich fort, nur beim letzten Eintrag in der Listenbox "Vacilona" werden anschließend die Textfelder korrekt gefüllt.

Sorry, trotz vieler Versuche mit dem Debuger, kenn mich noch nicht damit wirklich aud, komme nicht darauf, woran es liegt.
Auf keinen Fall kann es am Arbeitsblatt "Stammdaten" liegen.
Ich habe alle Einträge der Nachnamen überprüft, es gibt keine "versteckten" Leer- / Sonderzeichen.

Ich bin sicher, dass du als Erfahrener den programmiertechnischen Bug finden wirst.

Wenn, bitte lass es mich wissen, danke, Peter

Hallo Klaus Dieter,

danke für deinen Hinweis.

Die "12 Textboxen" im Formular sollen später gefüllt werden.
(Viel später noch viel mehr Testboxen.)

Da ich dabei bin, die ersten Gehversuche in VBA zu unternehmen, waren die zunächst nur als Dummies platziert.

Um das Warum "12" nachzuvollziehen, sei doch so lieb und ließ dir meine Antworten an Egon12 durch.

Liebe Grüße aus El Salvador, Peter

PS.:

Sei doch so lieb und ändere meine Datei "Listbox2" dahingehend, damit Datedif funktioniert.
Danke
Zusatzfrage:
heißt das "Textbox" oder "Textfeld" ?
Antworten Top
#7
Hallo Peter,


Zitat:Zusatzfrage: heißt das "Textbox" oder "Textfeld" ?


beides ist richtig. Da ich aber ein Problem mit den vielen Anglizismen in der deutschen Sprache habe, bevorzuge ich den Begriff Textfeld.

Da du mit Egon bereits einen engagierten Helfer gefunden hast, werde ich mich hier nicht weiter einbringen.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#8
Es müßte zu viel umgebaut werden, da fehlt mir leider die Zeit. Es gibt dafür im Netz brauchbare Beispiele zum runterladen.
An bei einen Link, den ich gefunden habe:

https://www.ms-office-forum.net/forum/sh...?p=2011458&postcount=5

Das hat eigentlich alles was du brauchst an Board auf Basis einer intelligenten Tabelle. Entsprechend umbauen solltest du hinbekommen.
Antworten Top
#9
Hallo Peter,

da sich Egon nicht weiter einbringen möchte, habe ich für dich schon mal eine Teillösung erstellt. Dafür habe ich die Textfelder und die Beschriftungsfelder umbenannt, damit man leichter mit Schleifen arbeiten kann. Damit wird es auch erleichtert, die Liste "Stammdaten" mit neuen Spalten zu versehen. Das Makro passt sich darauf an, es müssen nur die entsprechenden Objekte im UserForm eingebaut werden.
Das Problem mit der Eingabe von Kleinbuchstaben habe ich dahingehend gelöst, dass der erste Buchstabe automatisch auf Großschreibung geändert wird.

Bitte um Rückmeldung, ob das in die richtige Richtung geht.


Angehängte Dateien
.xlsm   Listbox 02 (2)-26012021.xlsm (Größe: 47,66 KB / Downloads: 9)
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#10
Hallo Peter,

anbei der neue Stand.


Angehängte Dateien
.xlsm   Listbox 02 (2)-26012021-2.xlsm (Größe: 43,87 KB / Downloads: 12)
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • peschiber
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste