VBA Datenbank Daten erfassen und ablegen
#21
Hallo André,

danke für Dein Feedback.
Zum 2x "Daten übernehmen" klicken.
Die Logik, die ich mir überlegt hatte ist, dass man beim Verlassen der letzten TextBox,
durch Tab oder Enter die Meldung "Weitere Zeile Ja/Nein" erhält. Das dahinter hängende
Ereignis ist " After Update". Alle anderen getestet Ereignisse waren hier nicht zielführende.
Bei "Ja" wird eine weitere Zeile eingeblendet. Entsprechend den Vorgaben von Frank,
sind dann die ersten drei TextBoxen mit den Werten aus Zeile 1 vorbelegt. Auf den Einsatz
von weiteren ComboBoxen habe ich ab Zeile 2 verzichtet, da nur Eingaben für den gleichen Zeitraum und den gleichen Verkäufer erfolgen sollen.
Bei "Nein" wird die Button "Daten übernehmen" fokussiert.
Das mit der Prüfung "Welche Warengruppe wurde bereits verwendet", finde ich gut. Hatte da während der Programmierung auch schon drüber seniert, da ich aber erst einmal ein funktionierendes Gerüst bauen wollte, habe ich das zunächst hinten angestellt.
Man könnte beispielsweise über den ListIndex arbeiten, das setzt dann allerdings voraus, das alle Eingaben in den ComboBoxen auch tatsächlich über das Dropdown und nicht händisch erfolgen. Andernfalls funktioniert ListIndex nicht. Über MatchRequiered könnte man die händischen Eingaben natürlich unterbinden, das macht dann aber die Erfassung u.U. langsamer.
Zu der Meldung "Daten übertragen" denke ich, dass das nicht wirklich erforderlich ist,
da die Daten anschließend aus den Boxen entfernt werden. Hinzu kommt das die UF Modeless geöffnet ist und man im Zweifelsfall immer noch im Hintergrund in der Tabelle arbeiten könnte.
Eine Fehlermeldung hatte ich beim heutigen kurzen Test nicht.
Aber wie gesagt, es ist nur ein erstes Gerüst mit reichlich Verbesserungspotential.

Gruß
Max
Top
#22
Hallo Max,
danke für den Zwischenstand. Die Ideen klingen vielversprechend! Bin auf den nächsten Wurf gespannt.

Viele Grüße
Frank
Top
#23
Hallo Max,

meine letzte Antwort hatte ich auf einer Dienstreise von meinem iphone aus geschrieben. Dabei hatte ich gar nicht gesehen, dass Du schon eine neue Testdatei hochgeladen hattest. Ich habe diese Version jetzt getestet. Bei der Eingabe von ein oder zwei Datensätzen funktioniert die Datei sehr gut. Sobald ich zu einem dritten Datensatz "springe" und diesen eingeben möchte, gibt Excel eine Laufzeitfehler Meldung aus und stürzt anschließend ab. Ich kann mir den Grund nicht erklären.

Ich möchte Dir natürlich auch nicht zu viel Mühe machen. Vielleicht lässt sich mein Wunsch vereinfacht darstellen. Die Form der von Dir gewählten Datenablage hat mich bereits begeistert. Die soll auf jeden Fall so bleiben.

Ich habe die Anforderung verschlankt als Datei beigefügt. Vielleicht lässt sich dadurch der Aufwand begrenzen.
Die Datenmaske kann wie in der Beispieldatei fixiert werden, d.h. ich kann den Verkäufer, den Monat und das Jahr auswählen und pro vorhandener Warengruppe die Wertre eintragen. Vielleicht ist es sinnvoll Monat und Jahr in einem Auswahlfeld zusammenzuführen - also in einem Dropdown "März 2015" statt ein Dropdown für "März" und ein Dropdown für "2015".

Nach Auswahl von Monat/Jahr und Verkäufer wird in der Datenbank geprüft, ob schon Einträge vorhanden sind. Wenn ja => vorhandene Daten werden in die Maske übernommen, können geändert und wieder gespeichert werden. Wenn nein => neue Daten werden in der von Dir entwickelten Ablageform in der Datenbank gespeichert. Die Eingabe kann über eine Userform muss aber nicht über eine Userform erfolgen.

Viele Grüße
Frank


Angehängte Dateien
.xlsx   Testdatei2.xlsx (Größe: 11,53 KB / Downloads: 7)
Top
#24
Hallo Frank,

ich habe mir heute einen excelfreien Tag genommen.
Hier eine kurze Info ohne Datei vom iPad auf der Couch.

Meinen "ersten Wurf" habe ich, mehr oder weniger, komplett verworfen.
Das hätte ich wahrscheinlich nur mit seeehr viel Zeit und noch mehr "Try and Error"
hinbekommen.

Mein jetziger Aufbau macht im Prinzip schon das, was Du hier beschrieben hast.
Es wird also nach Eingabe von Jahr, Monat und Verkäufer geprüftt, ob schon Daten
vorliegen und diese werden angezeigt.

Im Hinblick auf eine evtl. spätere Auswertung würde ich dabei bleiben, Jahr und Monat
zu trennen. Das ist von meinem Standpunkt auch etwas sauberer was die Ablage
der Daten angeht. Wie gesagt, ich setze am iPad und kann mir Deine Datei nur bedingt
anschauen. Das hole ich morgen nach. Dann werde ich auch die neue Version hier einstellen.

Also bis dahin
Max
Top
#25
Hi Frank,

so hier nun die neue Version.


.xlsm   Testdatei_V03.xlsm (Größe: 54,55 KB / Downloads: 12)

Ich habe versucht, den Code so ausführlich wie möglich zu kommentieren.
Sich wiederholende Codeschnipsel habe ich nur einmal zu Anfang kommentiert.

Ich denke, das Formular tut das, was gefordert war.
Den Vorschlag von André, bereits verwendete Warengruppen aus der Auswahl zu eliminieren,
habe ich noch nicht umgesetzt.

Teste das mal und gib mir ein Feedback.

Bis dann
Max
Top
#26
Hallo Max,

das ist jetzt eine wesentlich bessere Idee.
Es ist übersichtlicher und die kommenden Anforderungen können damit auch umgesetzt werden.

Hier noch einige Anregungen, was Du beachten könntest:
-Datumsangaben würde ich selten in Tage,Monate oder Jahre gesplittet eingeben, in diesen Fall auch nicht. Zum späteren Auswerten sind Datumsangaben als Datum in einer Zelle immer besser geeignet.
Also hier würde ich eine Box nehmen, so wie Frank schon angeregt hat. Die Box zeigt Monat und Jahr an, aber in die Zelle würde ich auch noch den Tag mit übertragen. Dann würde z.B: bei Auswahl von "Januar 2014!" in der Zelle "01.01.2014" stehen.

-Du müsstest Dir noch um Plausibilität-Prüfungen Gedanken machen. In Textboxen mit Zahleneingabe, sollten auch nur Zahlen eingegeben werden können. Vielleicht auch nach Kommata prüfen. Dann die Inhalte beim Schreiben in die Zellen auch als Zahl schreiben mit Vorgabe von Typ. z.B: Cells(1, 1) = CDbl(Textbox1.Text), das auch bei Datumsangaben.

-wenn Du mit Filtern arbeitest, um Daten herauszufiltern, dann sorg immer dafür, dass zu Beginn und am Ende alle Daten ungefiltert stehen. Ich persönlich würde die "Datenbank"-Tabelle nur zum hineinschreiben nutzen. Filtern würde ich in einem separaten Blatt. Dazu ist der Spezialfilter sehr gut geeignet und ist eines der schnellste Instrumente zum Auslesen von Daten.

-Du hast zur Identifizierung die Steuerelemente selber benannt. Vielleicht hast Du ja auch schon selbst festgestellt, dass das Programmieren dann aufwendiger ist. Es gibt unterschiedliche Meinungen darüber. Ich persönlich gebe ihnen keine sprechenden Namen mehr, da ich so viel leichter Steuerelemente in einer Schleife abarbeiten kann. Der User sieht sowieso nicht, wie die heißen. Wenn, dann sollen die Benennungen mir beim Programmieren helfen.

Die Idee nach dem verlassen der Textbox nachzufragen, ob eine neue Zeile benötigt wird könnte verworfen werden. Stattdessen würde ich ohne Nachfrage den letzten Datensatz in die Listbox übertragen.
Beim Übertragen in die Tabelle würde ich dann nicht mehr prüfen, ob Combos oder Textboxen Daten enthalten, sondern ob die Listbox Daten enthält.
Beim Exit der letzten Textbox kann vor Übertrag in die Listbox geprüft werden, ob die nötigen Eingaben in den Boxen gemacht wurden. Wenn nicht würde ich den Focus auf die entsprechende Box setzen und hier eine Meldung einarbeiten.

Wenn man nachträglich feststellt, dass ein Datensatz Fehlerhaft in die Lisbox übertragen wurde, dann würde ich diesen zum Editieren per Doppelklick in die Boxen zurückschreiben.

Zur Identifizierung der Datensätze würde ich, wie schon mal schrieb eine ID generieren. Dazu würde ich eine weiter Spalte in der Datenbank nutzen, in die ich Beispielsweise Datum-Verkäufer und/oder Warengruppe verkettet hineinschreibe. Dann kann der Datensatz leicht zurückgeschrieben werden.


Das sollte fürs erste mal reichen. Ich will euch auch nicht weiter mit einem trivialen Roman langweilen. Wink
Gruß Atilla
Top
#27
(30.11.2014, 22:07)atilla schrieb: Hallo Max,

das ist jetzt eine wesentlich bessere Idee.
Es ist übersichtlicher und die kommenden Anforderungen können damit auch umgesetzt werden.

Hallo Atilla,

Danke für Dein Feedback.
Und Danke das war der Plan.

(30.11.2014, 22:07)atilla schrieb: Hier noch einige Anregungen, was Du beachten könntest:
-Datumsangaben würde ich selten in Tage,Monate oder Jahre gesplittet eingeben, in diesen Fall auch nicht. Zum späteren Auswerten sind Datumsangaben als Datum in einer Zelle immer besser geeignet.
Also hier würde ich eine Box nehmen, so wie Frank schon angeregt hat. Die Box zeigt Monat und Jahr an, aber in die Zelle würde ich auch noch den Tag mit übertragen. Dann würde z.B: bei Auswahl von "Januar 2014!" in der Zelle "01.01.2014" stehen.

Okay. Mal schauen was ich da machen kann :32:

(30.11.2014, 22:07)atilla schrieb: -Du müsstest Dir noch um Plausibilität-Prüfungen Gedanken machen. In Textboxen mit Zahleneingabe, sollten auch nur Zahlen eingegeben werden können. Vielleicht auch nach Kommata prüfen. Dann die Inhalte beim Schreiben in die Zellen auch als Zahl schreiben mit Vorgabe von Typ. z.B: Cells(1, 1) = CDbl(Textbox1.Text), das auch bei Datumsangaben.

Mache ich morgen. Ich habe heute keinen Bock mehr.

(30.11.2014, 22:07)atilla schrieb: -wenn Du mit Filtern arbeitest, um Daten herauszufiltern, dann sorg immer dafür, dass zu Beginn und am Ende alle Daten ungefiltert stehen. Ich persönlich würde die "Datenbank"-Tabelle nur zum hineinschreiben nutzen. Filtern würde ich in einem separaten Blatt. Dazu ist der Spezialfilter sehr gut geeignet und ist eines der schnellste Instrumente zum Auslesen von Daten.

Also ich bin der Meinung, dass ich das getan habe. Wenn Dir etwas aufgefallen ist, oder mir entgangen,
dann sag mir bitte wo und wie.

(30.11.2014, 22:07)atilla schrieb: -Du hast zur Identifizierung die Steuerelemente selber benannt. Vielleicht hast Du ja auch schon selbst festgestellt, dass das Programmieren dann aufwendiger ist. Es gibt unterschiedliche Meinungen darüber. Ich persönlich gebe ihnen keine sprechenden Namen mehr, da ich so viel leichter Steuerelemente in einer Schleife abarbeiten kann. Der User sieht sowieso nicht, wie die heißen. Wenn, dann sollen die Benennungen mir beim Programmieren helfen.

Da gebe ich Dir recht. Allerdings ist dann auch das Einlesen in einen fremden Code, für einen Aussenstehenden mit VBA-Kenntnissen (oder wie bei mir mit rudimentären Kenntnissen), deutlich schwieriger weil man dann zwangsläufig anfängt, zwischen Tabelle oder Formular und Code hin und her zu hüpfen. So ist es mir gegangen als ich versuchte Deinen Code, den Du für Heb01 gebaut hast, nachzuvollziehen. Ich habe dann irgendwann aufgegeben, weil das mir persönlich zu kryptisch war.

(30.11.2014, 22:07)atilla schrieb: Die Idee nach dem verlassen der Textbox nachzufragen, ob eine neue Zeile benötigt wird könnte verworfen werden. Stattdessen würde ich ohne Nachfrage den letzten Datensatz in die Listbox übertragen.
Beim Übertragen in die Tabelle würde ich dann nicht mehr prüfen, ob Combos oder Textboxen Daten enthalten, sondern ob die Listbox Daten enthält.
Beim Exit der letzten Textbox kann vor Übertrag in die Listbox geprüft werden, ob die nötigen Eingaben in den Boxen gemacht wurden. Wenn nicht würde ich den Focus auf die entsprechende Box setzen und hier eine Meldung einarbeiten.

Okay für die Frage nach der neuen Zeile.
Hinsichtlich der Prüfung ist es in meinen Augen doch eigentlich egal, ob ich prüfe wenn ich in die Listbox schreibe, so wie ich es jetzt tue, oder beim Schreiben in die Tabelle.

(30.11.2014, 22:07)atilla schrieb: Wenn man nachträglich feststellt, dass ein Datensatz Fehlerhaft in die Lisbox übertragen wurde, dann würde ich diesen zum Editieren per Doppelklick in die Boxen zurückschreiben.

s.o.

(30.11.2014, 22:07)atilla schrieb: Zur Identifizierung der Datensätze würde ich, wie schon mal schrieb eine ID generieren. Dazu würde ich eine weiter Spalte in der Datenbank nutzen, in die ich Beispielsweise Datum-Verkäufer und/oder Warengruppe verkettet hineinschreibe. Dann kann der Datensatz leicht zurückgeschrieben werden.

Das mache ich über die Zeile der Tabelle bzw. Listbox wenn ich die Daten der Zeile in die Boxen einlese.
Einen Zeitstempel wollte ich trotzdem noch einfügen.
a) Um den Eintragungszeitpunkt der Daten zu dokumentieren und
b) Um ein evtuelles Änderungsdatum zu dokumentieren.

(30.11.2014, 22:07)atilla schrieb: Das sollte fürs erste mal reichen. Ich will euch auch nicht weiter mit einem trivialen Roman langweilen. Wink

Das hast Du gesagt :19:.

Bis dahin
Max
Top
#28
Hallo Max,

vielen Dank für Deine Unterstützung. Die Userform ist vom Aufbau her gut. Allerdings habe ich immer wieder zwei Probleme bei der Nutzung. Die Auswahl der Warengruppe über ein Pulldown erschwert die Eingaben. Gleichzeitig kann ich mir einen weiteren Fehler nicht erklären. Nach Auswahl mehrerer Positionen stürzt mein sonst sehr zuverlässiges Excel einfach ab. Ich befürchte, dass es an der Userform liegt. Könntest Du die Umsetzung ohne Userform probieren?

Ich habe hierzu noch einmal die Musterdatei modifiziert. Wunsch: Es gibt eine Eingabemaske wie im Tabellenblatt "DummyMaske". Dann erfolgt eine Eingabe wie im Tabellenblatt "Erfassung I". Dabei sind die Felder B10-B17 eingeblendet. Verkäufer, Monat und Jahr können über ein Pulldown ausgewählt werden. Die Eingaben erfolgen in C10-E17. Nach Abschluss der Eingaben (nicht alle Eingabefelder müssen gefüllt werden) werden die Daten in der Datenbank abgelegt.

Das Tabellenblatt "Erfassung II" zeigt den Effekt, wenn die Parameter Verkäufer, Monat, Jahr (ich habe es nur für das Jahr programmiert) ausgewählt werden. Bereits erfasste Daten werden in die Eingabemaske übernommen. Sind keine Daten erfasst bleiben die Felder C10-E17 leer. Vorgenommene Korrekturen werden bei Klick auf einen Speicher Button ohne Rückfrage übernommen.

Ich hoffe, dass sind nicht zu viele Wünsche.

Gruß
Frank


Angehängte Dateien
.xlsx   Testdatei3.xlsx (Größe: 18,8 KB / Downloads: 10)
Top
#29
(01.12.2014, 01:37)tnt1968 schrieb: ...
Allerdings habe ich immer wieder zwei Probleme bei der Nutzung. Die Auswahl der Warengruppe über ein Pulldown erschwert die Eingaben. Gleichzeitig kann ich mir einen weiteren Fehler nicht erklären.

Guten Morgen Frank,

nur zur Erklärung, die Verwendung der Dropdowns ist optional. Du kannst auch genauso die Eingaben
in den Feldern über die Tastatur vornehmen. Die Navigation von Feld zu Feld kannst Du mit der Tabulatortaste vornehmen, Du musst nicht jedes Mal mit der Maus klicken.

(01.12.2014, 01:37)tnt1968 schrieb: Nach Auswahl mehrerer Positionen stürzt mein sonst sehr zuverlässiges Excel einfach ab. Ich befürchte, dass es an der Userform liegt. Könntest Du die Umsetzung ohne Userform probieren?

Nach Auswahl mehrerer Positionen?
Wo wählst Du denn mehrere Positionen aus? Und was hast Du genau gemacht?
Nichts desto trotz muss ich noch an der Userform nachbessern.
Ich werde heute oder morgen nochmal eine überarbeitete Version hochladen.

(01.12.2014, 01:37)tnt1968 schrieb: Ich habe hierzu noch einmal die Musterdatei modifiziert. Wunsch: Es gibt eine Eingabemaske wie im Tabellenblatt "DummyMaske". Dann erfolgt eine Eingabe wie im Tabellenblatt "Erfassung I". Dabei sind die Felder B10-B17 eingeblendet. Verkäufer, Monat und Jahr können über ein Pulldown ausgewählt werden. Die Eingaben erfolgen in C10-E17. Nach Abschluss der Eingaben (nicht alle Eingabefelder müssen gefüllt werden) werden die Daten in der Datenbank abgelegt.

Genau das macht auch die Userform. Was stört Dich denn an der Verwendung genau?


(01.12.2014, 01:37)tnt1968 schrieb: Das Tabellenblatt "Erfassung II" zeigt den Effekt, wenn die Parameter Verkäufer, Monat, Jahr (ich habe es nur für das Jahr programmiert) ausgewählt werden. Bereits erfasste Daten werden in die Eingabemaske übernommen. Sind keine Daten erfasst bleiben die Felder C10-E17 leer. Vorgenommene Korrekturen werden bei Klick auf einen Speicher Button ohne Rückfrage übernommen.
...

Habe ich alles verstanden.

Gruß
Max
[-] Folgende(r) 1 Nutzer sagt Danke an Max für diesen Beitrag:
  • tnt1968
Top
#30
Hallo Max,

ich habe die Datei jetzt noch einmal ausgiebig getestet. Die Abstürze bei der Benutzung der Userform sind jetzt ausgeblieben. Ich kann mir zwar nicht erklären warum gleichwohl ist es schön das es jetzt funktioniert.

Die optionale Nutzung der Dropdowns habe ich jetzt ausprobiert. Das war mir nicht benutzt. Vielleicht bin ich so Drop Down fixiert, dass ich einfach die freie Eingabemöglichkeit nicht in Erwägung gezogen habe.

Einen Wunsch hätte ich jedoch: Im Moment werden die Daten für die Eingabe einer Warengruppe in einer Zeile erfasst und dann entweder übernommen oder ein weiterer Datensatz eingegeben. Mein Wunsch die Eingabemaske so aufzubauen, dass alle Warengruppen untereinander stehen (wie in meiner Beispieldatei) und die einzelnen Angaben gefüllt werden können oder auch nicht besteht deshalb, dass Warengruppen bei der Eingabe vergessen werden. Wenn gleich alle Warengruppen eingeblendet sind und nur noch Verkäufer, Monat und Jahr "ausgewählt" und die zutreffenden Werte erfasst werden kann dies nicht passieren. Zusätzlich wird bei der Art wie ich die Daten erfasse ("ich nenne dass im Supermarkt Kassenprinzip") die Erfassung vereinfacht und beschleunigt. Der Weg über die einzelne Eingabe ist für mich sehr zeitaufwendig. Lässt sich da noch etwas optimieren?

Viele Grüße
Frank
Top


Gehe zu:


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