Aus dem Formular in die Tabelle
Prinzipiell können natürlich alle Daten in Excel direkt in eine Tabelle eingegeben werden. Das ist sogar das standardmäßige Vorgehen. In manchen Fällen aber ist es enorm vereinfachend, wenn eine Eingabemaske für die Dateneingabe angeboten wird.
Das Erstellen einer solchen Maske, einer UserForm ist noch mit etwas Geschick gut zu bewerkstelligen. Die Grundlagen dazu werden in einem anderen Beitrag besprochen. Die Frage ist oft, wie die eingegebenen Werte in die Tabelle gelangen. Und (natürlich) immer in die erste freie Zeile, die sich ja mit jeder Übernahme aus der UserForm verschiebt. Die Eingabemaske und die dazugehörige Tabelle könnten so aussehen:
Dieser Beitrag ist ein nicht unbedingt einer komplexen Anleitung zuzuordnen fällt aber auch nicht (nur) unter die Tipps und Tricks. Der eigentliche Sinn dieses Scripts liegt darin, dass Sie den Code analysieren. Und zwar Schritt für Schritt, was durchaus wörtlich gemeint ist. Mit Grundlegende Kenntnissen des VBA (der Makrosprache) werden Sie aus dem Code einiges an Erkenntnissen schöpfen können.
Die komplette Datei mit Tabelle und dem Makro sollten Sie hier herunter laden. Und dann erst einmal in Ruhe ausprobieren. Und anschließend vielleicht, nein voller Élan nachvollziehen, was da (warum) läuft. Etwas Unterstützung gibt es hier auf dieser Seite mit kleinen Kommentaren zum Programmablauf. Manches, ja sogar sehr vieles kann auch so wie es da steht mit geringen Anpassungen an Ihre Gegebenheiten übernommen werden. Der Ablauf an sich auf jeden Fall, ob Sie nun die „Radiobuttons” für die Mehrwertsteuer brauchen oder das lieber anders realisieren, das sei dahin gestellt. In diesem Beispiel hat es sich angeboten, denn es sollen ja schließlich nicht nur TextBoxes ausgewertet werden.
Wichtig ist allerdings, dass Sie den einen oder anderen Trick erkennen und auch für sich umsetzen. Und vernachlässigen Sie keinesfalls die Sicherheitsvorkehrungen. Die Sicherheits-Abfrage beispielsweise beim Datum ist schon wichtig, denn zu rasch kommt es zur Fehlermeldung. – Apropos „Fehlermeldung”: Ich habe das Ganze mehrfach getestet und immer wieder abgeändert. Dennoch ist es denkbar, dass sich in der harten Praxis etwas anders darstellt, als es eigentlich gedacht ist. In dem Fall bitte ich Sie einfach um einen Hinweis, dass dieses oder jenes falsch läuft.
Es geht bei solchen Hinweisen nicht darum, dass ich den Code speziell für Sie anpasse. Das läuft so oder so nicht über Excel-ist-sexy, sondern in solchen Fällen über den Sponsor GMG-CC, die verdienen schließlich ihr Geld damit.
Der Kopfbereich sollte klar sein. Ich verwende aus Grundsatz keine Umlaute in Variablennamen, obwohl es möglich wäre.
Option Explicit Dim nRow As Long Dim bolEingabeMoeglich As Boolean
Die beiden Variablen sind durch die Platzierung außerhalb der Prozeduren global nutzbar (globale Variablen).
Ganz am Ende der Codeblöcke finden Sie:
Sub NewRow() nRow = Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row + 1 'Das ist 1 Zeile! End Sub
„nRow” steht für NewRow, also die erste freie Zeile. Eigentlich wäre es sinnvoll, statt einer Prozedur (Sub) das Ganze in eine UDF (Function) zu packen. Der Einheitlichkeit wegen habe ich das hier nicht gemacht, Sie sollten es aber tun und natürlich den Aufruf entsprechend gestalten.
… Und ganz zu Beginn ist diese Sub:
Sub cmd_NeuerArtikel_Click() 'Alles auf null setzen und Cursor positionieren Call ClearAllTxtFields Call NewRow bolEingabeMoeglich = True txt_lfdNr = nRow - 1 Me.txt_Datum.SetFocus End Sub
Das „Call” ist optional, ich verwende es grundsätzlich, weil dadurch klar wird, dass hier eine Prozedur aufgerufen wird. – bolEingabeMoeglich muss auf True gesetzt werden, weil nach dem übertragen der Daten in die Tabelle die geleerte Form die Eingabemöglichkeit gesperrt wurde.
Sub txt_Datum_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) 'Jahr darf maximal 10 Jahre zurück liegen If Not IsDate(CDate(txt_Datum)) _ Or Year(CDate(txt_Datum)) < Year(Date) - 10 Then 'Or .. -10 entfernen, wenn die 10 Jahre nicht relevant sind
Einerseits sind die 10 Jahre natürlich willkürlich gewählt und können beliebig angepasst werden. Andererseits ist es enorm wichtig, dass überhaupt eine Prüfung durchgeführt wird. Denn wenn einfach eine Zahl eingegeben wird, dann kommt es mit ziemlicher Sicherheit zum Abbruch des Makros mit einer kaum verständlichen Fehlermeldung.
Die folgenden Zeilen sollte Sie sich einmal genau zu Gemüte führen. Das Internet oder auch die Hilfe (F1) können dabei sehr aufschlussreich sein. Eine Alternative wäre natürlich, dass jedes einzelne Objekt mit dem Namen txt_… angesprochen wird.
With Me
.txt_Datum = Null
With .cmb_Einheit
.AddItem ("") 'Leerfeld
.AddItem ("Stück")
' …
End With
'Mehrwertsteuer
.opt_MwStVoll = True 'Standard
.opt_MwStMinder = False
.opt_MwStNull = False
End With
Im oberen Teil erkennen Sie, wie Sie per Hand einer ComboBox (DropDown) Elemente hinzufügen. Der erste, obere Eintrag ist bewusst leer gelassen, damit auch ein LeerString ausgewählt werden kann. Darunter wird den RadioButtons der Standardwert (19%) zugewiesen. Zugegeben, es hätte auch die erste Zeile gereicht, denn es ist ja das Wesen der OptionButtons, dass innerhalb der Gruppe nur 1 „Knopf” aktiv sein kann.
Das war’s auch schon. Viel Erfolg mit dem Code bei der Umsetzung!
[NachObenLetzte Verweis=„ML: Maske zu Tabelle”]