PDA

Vollständige Version anzeigen : UserForm mit Listbox und Textboxen bedienen


FrankieReloaded
24.08.2017, 10:44
Hallo Excel-Gurus,

ich bin dabei ein UserForm zu entwickeln um damit Daten in einem Tabellenblatt zu erfassen, editieren oder zu löschen. Später soll auch noch nach Einträgen gesucht werden.
Aber ich will erst mal mit den Basics anfangen, also dem anlegen und editieren eines Datensatzes aus der Listbox.
Ich habe dazu eine Beispielmappe erstellt. Darin befindet sich ein UserForm, welches eine Listbox zwei TextBoxen und zwei Checkboxen enthält.
Wenn ich einen Eintrag in der Listbox anklicke, sollen die TextBoxen mit den zugehörigen Werten gefüllt werden und die Checkboxen den entsprechenden Status annehmen.
Ich möchte gemeinsam mit euch die Lösung erarbeiten und würde mich daher sehr über Denkanstöße freuen. So lernen ich und eventuelle Mitleser ein paar Kniffe im Umgang mit VBA.

R J
24.08.2017, 12:06
Hi Frankie,

natürlich kannst Du hier was lernen, aber die Foren sind eher weniger dazu gedacht. Dafür gibt es gute Tutorials oder Beispielcodes im Web, oder Bücher. Die Foren dienen ja eher der Hilfe zur Selbsthilfe, also wenn man mal auf dem Schlauch steht und nicht weiter weiß, obwohl man es eigentlich wissen müßte.
Denk dran, die, die hier sind, investieren ihre Zeit unentgeldlich. Du kannst nicht erwarten, dass sie Dir hier, bei den Basics beginnend bis hin zur OOP alles beibringen können.

Aber, da Du nun mal hier bist.... anbei ein Lösungsvorschlag. Ansonsten, wie gesagt, oben angesprochene Medien nutzen.

Viel Spaß und Erfolg beim weiteren Lernen!

erpe
24.08.2017, 12:19
Hallo,

ein hehres Ziel: So lernen ich und eventuelle Mitleser ein paar Kniffe im Umgang mit VBA.Nun hast du schon einige Vorbedingungen durch die Userform geschaffen.

Die Listbox lässt sich nicht nur durch RowSource füllen.
Alleine für die Art der Füllung gibt es mehrere Möglichkeiten. Mit/ohne VBA, nur eindeutige Werte, mit Duplikaten, etc.
Wohin soll die Reise gehen? Soll es nur um Notizen gehen oder auch Adressen, Artikel, etc.?

Meiner Meinung nach wäre es besser, ein bestimmtes Thema zu beschreiben und dann die Möglichkeiten mit Vor- und Nachteilen zu diskutieren.

Zudem sind zu dem Thema: "Userform erstellen" tausende Beispiele im Netz verfügbar.

MfG
Rainer

FrankieReloaded
25.08.2017, 13:28
Hallo Rainer,
ich habe deinen Ansatz aufgegriffen und das UF von Ralf (RJ) ein wenig modifiziert.
Das Anwendungsszenario stellt sich eigentlich wie folgt dar. Es soll sich dabei um ein Logbuch handeln, in dem man Gesprächsnotizen und Informationen sammeln kann.

Nun zur Userform. Ich habe sie soweit angepasst, das nach dem laden der UF ein neuer Eintrag angelegt werden kann. Wenn man einen Eintrag aus der Listbox doppeklickt, wird der Eintrag in die Textfelder geladen. Das war eine super Idee von dir und hat die Schaltfläche zum laden des Eintrags obsolet gemacht. Ich habe sie direkt zum Erstellen eines neuen Eintrags zweckentfremdet.
Jetzt habe ich nur das Problem, das der neue Eintrag nicht automatisch in der Listbox erscheint. Wie kann ich die Aktualisierung der Listbox unfallfrei anstoßen? Hast du noch Hinweise, was ich doch anders lösen sollte?

erpe
26.08.2017, 08:29
Hallo Frank,

du musst nach dem Speichern, die Listbox aktualisieren.

Das kann man machen, in dem "UserForm_Initialize" erneut aufgerufen wird.

Private Sub cmdSave_Click()
...
...
Call UserForm_Initialize
End Sub

Die Listbox sollte so heißen, wie sie benannt ist: Listbox!
Wer soll das später auseinanderfriemeln.
Lies mal dazu "Benamsungen VBA".

Dim zeile&, spalte%: Jede Variable muss einzeln deklariert werden.

Case ist in deinem Fall Käse! Du hast keine Auswahl.

Die Ratschläge von R J solltest du dir zu Gemüte führen. (Bücher, Tutorials, Bespielcode)

Gruß
Rainer

FrankieReloaded
29.08.2017, 01:01
Hallo nochmal,
ich möchte die Daten in der Listbox nun noch filtern, damit mir nur Einträge angezeigt werden, die in einer der Spalten 4 oder 5 ein FALSE stehen haben. Wo muss ich beim initialize Änderungen vornehmen?
Da doch eine Menge Daten auflaufen, würde ich der Übersicht halber die aktuellsten Daten in der Listbox oben stehen haben, also die Reihenfolge umkehren.

erpe
29.08.2017, 07:39
Hallo,

1) die in einer der Spalten 4 oder 5 ein FALSE stehen haben. Wo muss ich beim initialize Änderungen vornehmen?

Oder oder Und/Oder? Hast ja beide Möglichkeiten vorgesehen.
Sonst müsstest du das in deinem Code noch berücksichtigen.
Beim Initialize eher nicht!
Lege die Steuerlemente extra an.
Kannst du mit Optionbutton oder mit Checkboxen erreichen.

2) die aktuellsten Daten in der Listbox

Die Daten enthalten Datum und Uhrzeit. Sortieren!

Gruß
Rainer

FrankieReloaded
29.08.2017, 09:27
Hallo,

1) die in einer der Spalten 4 oder 5 ein FALSE stehen haben. Wo muss ich beim initialize Änderungen vornehmen?

Oder oder Und/Oder? Hast ja beide Möglichkeiten vorgesehen.
Sonst müsstest du das in deinem Code noch berücksichtigen.
Beim Initialize eher nicht!
Lege die Steuerlemente extra an.
Kannst du mit Optionbutton oder mit Checkboxen erreichen.

2) die aktuellsten Daten in der Listbox

Die Daten enthalten Datum und Uhrzeit. Sortieren!

Gruß
Rainer
zu 2) ich möchte die Listbox quasi von unten nach oben füllen. Kann man beim initialisieren und updaten den Filter in der ersten Spalte aktualisieren?

zu 1) Das UF habe ich etwas angepasst. Ich habe noch eine Checkbox eingebaut, die die fertigen Datensätze ausblenden soll. Also in den Spalten 4 und 5 WAHR steht.

erpe
29.08.2017, 18:54
Hallo,
toll: Ich habe noch eine Checkbox eingebaut, die die fertigen Datensätze ausblenden soll. Also in den Spalten 4 und 5 WAHR steht.Ohne Code passiert nix!

noch mal toll: beim initialisieren und updaten den Filter in der ersten Spalte aktualisieren kann keinen Filter erkennen.

Sortieren meinst du; das kann man mit dem Rekorder aufzeichnen.

Deine Listbox heißt noch immer lbNotizen ist doch kein Label?!

Der Case existiert auch noch! Du kannst direkt in die Textfelder schreiben.

Dim zeile&, spalte% und das hier auch!

Außer der Chekbox kann ich keine Erweiterungen/Änderungen deinerseits feststellen.
Ich möchte gemeinsam mit euch die Lösung erarbeiten und würde mich daher sehr über Denkanstöße freuen. So lernen ich und eventuelle Mitleser ein paar Kniffe im Umgang mit VBA.
Und wo ist dein Einsatz???????

Gruß
Rainer

R J
29.08.2017, 21:18
@Rainer,#

Deine Listbox heißt noch immer lbNotizen ist doch kein Label?!

Der Case existiert auch noch! Du kannst direkt in die Textfelder schreiben.
Ja klar heißt die Listbox lb. Wäre sie ein Label, hieße sie lbl.
Und wie Du hier ohne das case auskommen willst, ist mir auch ein Rätsel. Die Textboxen sind nun einmal von den Spalten abhängig. Jedenfalls solange das Case im For steht.
Wenn das Case schon weg soll, dann muss auch das 2. For weg. Das Case allein zu entfernen, das klappt nicht.

Und was gibt es hier:
Dim zeile&, spalte%
auszusetzen?

erpe
30.08.2017, 08:51
Hallo Ralf,

grundsätzlich findest du die Antwort zu deinen Fragen in meinen vorherigen Beiträgen.

Du hast dem Fragesteller eine Lösung präsentiert,
ohne auf Besonderheiten in deinem Code einzugehen: Dim zeile&, spalte%
Ist ja mittlerweile sehr ungewöhnlich.

Das Verwenden von Select Case dient zum Entscheiden zwischen mehreren Auswahlmöglichkeiten.
Das ist aber hier gar nicht die Notwendigkeit.
Man kann es so machen, wie du.
Ist es aber sinnvoll einem Anfänger solche "Tricks" ohne Kommentar zu präsentieren?

Und Anfänger ist er nun mal, wie aus der Verwendung der Begrifflichkeiten zu erkennen ist.

Die Datei in deinem 1. Post hatte ich mir gar nicht angesehen.
Aus den Antworten des Fragstellers ist mir dann klar geworden, dass die "Lösung" von #4 nicht aus seiner Feder stammt.

Grundsätzlich kann jeder seine Listboxen benennen wie er will.
Allgemein ist lst üblich; darauf wollte ich hinaus.

In diesem Sinne.
Grüße
Rainer

FrankieReloaded
30.08.2017, 10:44
Grundsätzlich kann jeder seine Listboxen benennen wie er will.
Allgemein ist lst üblich; darauf wollte ich hinaus.

Schön dass du auch erläutern kannst, was du an lb nicht ok findest. Du hättest es mir auch einfach schreiben können anstatt mich runterzuputzen. Wie du erkannt hast, beschäftige ich mich nicht beruflich mit VBA. Ich finde es toll, dass ihr eure Freizeit dafür opfert, anderen zu helfen, dafür meine Anerkennung.
kann keinen Filter erkennen
Der Filter zum Sortieren sitzt übrigens in der Datentabelle.

Private Sub UserForm_Initialize()
lngZeileNotiz = Worksheets("Notizen").Cells(Cells.Rows.Count, 2).End(xlUp).Row
lbNotizen.RowSource = "=Notizen!A1:E" & lngZeileNotiz
cmdUpdate.Visible = False
cmdSave.Default = True
zielzeile = Worksheets("Notizen").Cells(Cells.Rows.Count, 2).End(xlUp).Row + 1

End Sub
Was muss ich anpassen, damit die Einträge mit WAHR in beiden Spalten(D&E) ausgeblendet werden, wenn die cbFilter ein Häkchen hat(Value=true)?
Ich hoffe cb ist für Checkbox korrekt.

erpe
30.08.2017, 11:11
was du an lb nicht ok findest. Du hättest es mir auch einfach schreibenBenamsungen - steht ziemlich am Anfang.
Eigeniniative wird ganz groß geschrieben in Foren.
Der Filter zum Sortieren sitzt übrigens in der Datentabelle.
Das ist Quatsch: Sortieren und Filtern sind verschiedene Dinge!

Zu deinen restlichen Fragen lies die vorherigen Beiträge.

Ansonsten mache ich mal den H.....i, bin empfindlich und raus, weil meine Beiträge von dir nicht gelesen werden.

R J
30.08.2017, 11:31
@Rainer,

[QUOTE][/Ansonsten mache ich mal den H.....i, bin empfindlich und raus, weil meine Beiträge von dir nicht gelesen werden.QUOTE]

...nun ja, da hast Du Dir ja nicht gerade ein leuchtendes Vorbild ausgesucht. Im Übrigen, sorry wenn ich das so sage, fand ich Deine Beiträge auch nicht gerade hilfreich. Das klang eher wie gelangweiltes Nörgeln. Da ist also noch Verbesserungspotential nach oben....;)

@Frank,
momentan hab ich keine Zeit, versuche aber heute Nachmittag mir die Sache mal anzusehen.

R J
30.08.2017, 13:38
Was muss ich anpassen, damit die Einträge mit WAHR in beiden Spalten(D&E) ausgeblendet werden, wenn die cbFilter ein Häkchen hat(Value=true)?


Die Idee mit dem ausblenden finde ich nicht wirklich gut. Du willst sie in der Tabelle filtern aber im Formular damit arbeiten. Das ist nicht optimal. Könnte den Anwender verwirren, weil er sich beim Anblick des Formulars fragt, wie kriege ich jetzt alle wieder angezeigt. Über das Formular jedenfalls nicht mehr. Es sei denn, es gibt noch eine Checkbox "Alle anzeigen" oder sowas in der Art.

FrankieReloaded
30.08.2017, 13:51
Die Idee mit dem ausblenden finde ich nicht wirklich gut. Du willst sie in der Tabelle filtern aber im Formular damit arbeiten. Das ist nicht optimal. Könnte den Anwender verwirren, weil er sich beim Anblick des Formulars fragt, wie kriege ich jetzt alle wieder angezeigt. Über das Formular jedenfalls nicht mehr. Es sei denn, es gibt noch eine Checkbox "Alle anzeigen" oder sowas in der Art.

Ich glaube ich habe mich etwas missverständlich ausgedrückt. Mit dem Tabellenblatt wird nicht gearbeitet,dieses ist ausgeblendet. Im Userform möchte ich die Einträge ausblenden, die in den Spalten 4 und 5 ein WAHR stehen haben. Diese werden erst mal nicht weiter benötigt und sollten nur bei Bedarf über eine Checkbox eingeblendet werden.

R J
30.08.2017, 14:33
...womit wir beim nächsten Problem wären. Wenn die Einträge der Listbox nicht mehr der Reihenfolge der Zeilen in der Tabelle entspricht, woran kann erkannt werden, um welchen Eintrag es sich handelt? Name kann mehrmals vorkommen, Info auch, und die Kombination von allen ebenfalls. Der Zeitstempel wäre eindeutig, aber der wird nicht verwendet....

FrankieReloaded
30.08.2017, 15:04
Da hätte ich eine Idee, ich baue noch ein Label ein, in das der Zeitstempel geladen wird. Somit wäre eine ID vorhanden.
Wäre es der beste Ansatz, die Liste über eine Schleife zu füllen?

R J
30.08.2017, 15:40
...lach... und woher weiß das Label, um welche Zeile es sich handelt?
Der Zeitstempel muss schon mit in die Listbox.... ich bastel Dir da mal was...

R J
30.08.2017, 19:26
...so, hab Dir da mal was zusammengebaut. War etwas tricky, weil Du ja mit Deinem Sonderwunsch (unzusammenhängende Bereiche in die Listbox bringen wegen ausblenden), schon etwas besonderes haben wolltest. Deshalb sage ich jetzt gleich.... noch mehr mach ich hier nicht an dieser Geschichte. Das hat nämlich absolut nichts mehr mit Deinem ursprünglichen Wunsch, etwas lernen zu wollen, zu tun.

Viel Spaß damit...