Maske zur Dateneingabe (2)

Aus dem Formular in die Tabelle

Prinzip­iell kön­nen natür­lich alle Dat­en in Excel direkt in eine Tabelle eingegeben wer­den. Das ist sog­ar das stan­dard­mäßige Vorge­hen. In manchen Fällen aber ist es enorm ver­ein­fachend, wenn eine Eingabe­maske für die Dateneingabe ange­boten wird.

Das Erstellen ein­er solchen Maske, ein­er User­Form ist noch mit etwas Geschick gut zu bewerk­stelligen. Die Grund­la­gen dazu wer­den in einem anderen Beitrag besprochen. Die Frage ist oft, wie die eingegebe­nen Werte in die Tabelle gelan­gen. Und (natür­lich) immer in die erste freie Zeile, die sich ja mit jed­er Über­nahme aus der User­Form ver­schiebt. Die Eingabe­maske und die dazuge­hörige Tabelle kön­nten so ausse­hen:

Beispielhafte Eingabemaske

Beispiel­hafte Eingabe­maske

Die dazugehörige Tabelle

Die dazuge­hörige Tabelle

Dieser Beitrag ist ein nicht unbe­d­ingt ein­er kom­plex­en Anleitung zuzuord­nen 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 dur­chaus wörtlich gemeint ist. Mit Grundle­gende Ken­nt­nis­sen des VBA (der Makrosprache) wer­den Sie aus dem Code einiges an Erken­nt­nis­sen schöpfen kön­nen.

▲ nach oben …

Die kom­plette Datei mit Tabelle und dem Makro soll­ten Sie hier herunter laden. Und dann erst ein­mal in Ruhe aus­pro­bieren. Und anschließend vielle­icht, nein voller Élan nach­voll­zie­hen, was da (warum) läuft. Etwas Unter­stützung gibt es hier auf dieser Seite mit kleinen Kom­mentaren zum Pro­gram­ma­blauf. Manch­es, ja sog­ar sehr vieles kann auch so wie es da ste­ht mit gerin­gen Anpas­sun­gen an Ihre Gegeben­heit­en über­nom­men wer­den. Der Ablauf an sich auf jeden Fall, ob Sie nun die „Radiobut­tons” für die Mehrw­ert­s­teuer brauchen oder das lieber anders real­isieren, das sei dahin gestellt. In diesem Beispiel hat es sich ange­boten, denn es sollen ja schließlich nicht nur TextBox­es aus­gew­ertet wer­den.

Wichtig ist allerd­ings, dass Sie den einen oder anderen Trick erken­nen und auch für sich umset­zen. Und ver­nach­läs­si­gen Sie keines­falls die Sicher­heitsvorkehrun­gen. Die Sicher­heits-Abfrage beispiel­sweise beim Datum ist schon wichtig, denn zu rasch kommt es zur Fehler­mel­dung. – Apro­pos „Fehler­mel­dung”: Ich habe das Ganze mehrfach getestet und immer wieder abgeän­dert. Den­noch ist es denkbar, dass sich in der harten Prax­is etwas anders darstellt, als es eigentlich gedacht ist. In dem Fall bitte ich Sie ein­fach um einen Hin­weis, dass dieses oder jenes falsch läuft.

Es geht bei solchen Hin­weisen nicht darum, dass ich den Code speziell für Sie anpasse. Das läuft so oder so nicht über Excel-ist-sexy, son­dern in solchen Fällen über den Spon­sor GMG-CC, die ver­di­enen schließlich ihr Geld damit.

▲ nach oben …

Der Kopf­bere­ich sollte klar sein. Ich ver­wende aus Grund­satz keine Umlaute in Vari­ablenna­men, obwohl es möglich wäre.

Option Explicit
Dim nRow As Long
Dim bolEingabeMoeglich As Boolean

Die bei­den Vari­ablen sind durch die Platzierung außer­halb der Proze­duren glob­al nutzbar (glob­ale Vari­ablen).

Ganz am Ende der Code­blöcke find­en Sie:

Sub NewRow()
   nRow = Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row + 1 'Das ist 1 Zeile!
End Sub

„nRow” ste­ht für NewRow, also die erste freie Zeile. Eigentlich wäre es sin­nvoll, statt ein­er Proze­dur (Sub) das Ganze in eine UDF (Func­tion) zu pack­en. Der Ein­heitlichkeit wegen habe ich das hier nicht gemacht, Sie soll­ten es aber tun und natür­lich den Aufruf entsprechend gestal­ten.

… 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 option­al, ich ver­wende es grund­sät­zlich, weil dadurch klar wird, dass hier eine Proze­dur aufgerufen wird. – bolEingabe­Moeglich muss auf True geset­zt wer­den, weil nach dem über­tra­gen der Dat­en in die Tabelle die geleerte Form die Eingabe­möglichkeit ges­per­rt 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

Ein­er­seits sind die 10 Jahre natür­lich willkür­lich gewählt und kön­nen beliebig angepasst wer­den. Ander­er­seits ist es enorm wichtig, dass über­haupt eine Prü­fung durchge­führt wird. Denn wenn ein­fach eine Zahl eingegeben wird, dann kommt es mit ziem­lich­er Sicher­heit zum Abbruch des Makros mit ein­er kaum ver­ständlichen Fehler­mel­dung.

▲ nach oben …

Die fol­gen­den Zeilen sollte Sie sich ein­mal genau zu Gemüte führen. Das Inter­net oder auch die Hil­fe (F1) kön­nen dabei sehr auf­schlussre­ich sein. Eine Alter­na­tive wäre natür­lich, dass jedes einzelne Objekt mit dem Namen txt_… ange­sprochen 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 erken­nen Sie, wie Sie per Hand ein­er Com­boBox (Drop­Down) Ele­mente hinzufü­gen. Der erste, obere Ein­trag ist bewusst leer gelassen, damit auch ein Leer­String aus­gewählt wer­den kann. Darunter wird den RadioBut­tons der Stan­dard­w­ert (19%) zugewiesen. Zugegeben, es hätte auch die erste Zeile gere­icht, denn es ist ja das Wesen der Option­But­tons, dass inner­halb der Gruppe nur 1 „Knopf” aktiv sein kann.

Das war’s auch schon. Viel Erfolg mit dem Code bei der Umset­zung!

[NachOben­Let­zte Verweis=„ML: Maske zu Tabelle”]
Dieser Beitrag wurde unter Coding / Programmieren, Mit VBA/Makro, Musterlösungen, Tabelle und Zelle abgelegt und mit , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.