Hallo,
zur Datenmaske unter Excel siehe diesen Beitrag, der sicher einen Teil deiner Fragen beantwortet:
Datenmaske
Die Datenmaske kannst du aber auch per VBA ansteuern, ich habe dazu mal nachstehenden Beitrag geschrieben, der nicht veröffentlich wurde, vielleicht findest du da was für dich Nützliches.
Gruß,
Beate
---------------------------------------------------------------
Datenmaske - VBA
Ergänzend zum Beitrag Datenmaske möchte ich Ihnen hier nützlichen Code vorstellen, der das Arbeiten mit der Datenmaske komfortabler gestaltet oder bestimmte Probleme löst. Die Tabelle, für die diese Beispiele hier entwickelt sind, ist hier zu sehen. Gegebenenfalls müssen Sie Tabellennamen und Zellbezug für Ihren Code anpassen. Manche Codes benötigen den definierten Namen Datenbank. Wie Sie den definieren ist hier erklärt.
Aufruf der Datenmaske
Der Code kann aus jedem Blatt der Tabelle aufgerufen werden, zu Makrobeginn wird das Tabellenblatt, welches die Datenbank enthält sowie eine Zelle der Datenbank selektiert. Das ist ein Muss! Passen Sie Tabellenblattnamen und die Zelle Ihren Bedürfnissen an:
Sub Maskenaufruf()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
CommandBars.FindControl(ID:=860).Execute
End Sub
Dieser Code hat gegenüber dem bekannteren Aufruf mit ShowDataForm den Vorteil, dass er auch in der Maske Daten im europäischen Format darstellt.
Aufruf der Datenmaske für verschiedene Blätter
Private Sub CommandButton1_Click()
Application.Goto Worksheets("Datenbank").Range("A1"), True
ActiveSheet.Range("A1").CurrentRegion.Name = "database"
CommandBars.FindControl(ID:=860).Execute
End Sub
Private Sub CommandButton2_Click()
Application.Goto Worksheets("Kundenkartei").Range("A1"), True
ActiveSheet.Range("A1").CurrentRegion.Name = "database"
CommandBars.FindControl(ID:=860).Execute
End Sub
Es funktioniert also, wenn jedesmal der Name "Database" (=Datenbank) passend definiert wird.
Aufruf der Datenmaske zur Erfassung eines neuen Datensatzes
Um direkt zur Neuerfassung zu gelangen ergänzen Sie obigen Code um eine Zeile - ansonsten gilt das dort Gesagte:
Sub Maskenaufruf_Neuerfassung()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%n"
CommandBars.FindControl(ID:=860).Execute
End Sub
Es sind immer die auf den Buttons unterstrichenen Buchstaben mit Sendkeys zu kombinieren, um die Maske im entsprechenden Modus zu starten.
Aufruf der Datenmaske zum Suchen und Finden
Um die Maske direkt im Suchmodus aufzurufen, ist das der Code - dadurch können umgehend die Suchkriterien in die Felder eingegeben werden:
Sub Maskenaufruf_Suche()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%k"
CommandBars.FindControl(ID:=860).Execute
End Sub
Es sind immer die auf den Buttons unterstrichenen Buchstaben mit Sendkeys zu kombinieren, um die Maske im entsprechenden Modus zu starten.
Um die Maske direkt mit dem Datensatz eines bestimmten Zellwerts zu öffnen, ist das der Code - hier steht der gesuchte Wert in Zelle G1, durchsucht wird Spalte B = Feld 2. Durch die Zelleingabe ist das eine recht dynamische Suche. Die Maske springt nun mit dem ersten zutreffenden Datensatz auf:
Sub Maskenaufruf_Suche_Zellwert()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%k{tab}" & Worksheets("Tabelle1").Range("G1").Text & "{tab}"
SendKeys "%t"
CommandBars.FindControl(ID:=860).Execute
End Sub
Sie können natürlich in anderen Feldern suchen, in mehreren Feldern gleichzeitig oder die Kriterien bereits im Code vorgeben. Was da alles kombinierbar ist, können Sie sich anhand dieser Beispiele selbst entwickeln: Aufruf zur Erfassung mit vorbelegten Feldern.
Aufruf der Datenmaske, beim Schließen der Maske werden Daten neu sortiert
Der Code kann aus jedem Blatt der Tabelle aufgerufen werden, zu Makrobeginn wird das Tabellenblatt, welches die Datenbank enthält sowie eine Zelle der Datenbank selektiert. Das ist ein Muss! Passen Sie Tabellenblattnamen und die Zelle Ihren Bedürfnissen an. Definieren Sie für den Datenbankbereich den Namen Datenmaske, weil dieser Bereich im Code sortiert wird.
Sub Maskenaufruf_mit_Sortierung()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
CommandBars.FindControl(ID:=860).Execute
Range("Datenbank").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Dieser Code sortiert beim Schließen der Maske nach Spalte C (die Daten) aufsteigend. Welche Spalte(n) sie sortieren möchten, können Sie anpassen und ebenfalls, ob es sich um Auf- oder Absteigende Sortierung handelt. Die Überschriftenzeile wird bei der Sortierung berücksichtigt.
Fehlerprüfung
Während der Datenbearbeitung in der Maske ist keine Überprüfung der Datengültigkeit sinnvoll möglich. Hier mehr dazu. Neben der dort erläuterten Kontrolle in der Tabelle über bedingte Formatierung können Sie aber auch zusätzlich ein Makro über Ihre Tabellendaten laufen lassen, um herauszufinden, ob es Probleme gibt.
In folgendem Beispiel wird geprüft, ob Daten > Heute in Spalte C liegen und ob in Spalte D Werte
Sub Fehlerprüfung()
If [COUNTIF(C:C,">"&TODAY())] = 0 Then
MsgBox "Es liegen in Spalte C keine Fehler vor"
Else
MsgBox ["Spalte C: "&COUNTIF(C:C,">"&TODAY())&" Fehler. Bitte korrigieren!"]
End If
If [SUM(COUNTIF(D:D,{"
MsgBox "Es liegen in Spalte D keine Fehler vor"
Else
MsgBox ["Spalte D: " &SUM(COUNTIF(D:D,{"
End If
End Sub
Welche/wieviele Spalten und Bedingungen Sie prüfen, das müssen Sie anpassen.
Aufruf zur Erfassung mit vorbelegten Feldern
Sie möchten einen Code haben, der direkt die Maske zur Neuerfassung von Datensätzen startet, dabei sollen gewisse Felder direkt vorbelegt sein, weil deren Inhalt immer so sein soll. Die Tabellenstruktur wäre dreispaltig so:
A B C
1 Name Datum Nettowert
2 Name1 15.02.2005 55,42
3 Name2 13.03.2005 66,78
4 Name3 08.04.2005 72,17
Zum Verständnis zunächst ein Beispiel, alle Felder sollen mit 0 belegt werden:
Sub NullVorbelegen()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%n{0}{tab}{0}{tab}{0}"
CommandBars.FindControl(ID:=860).Execute
End Sub
Sie sehen die 3 eingegebenen Nullen im Code und den Weitersprung von Feld zu Feld mit {tab}.
Das dritte Feld soll mit einem Wert belegt werden:
Sub ZahlVorbelegen()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%n{tab}{tab}3.500,00"
CommandBars.FindControl(ID:=860).Execute
End Sub
Da die ersten beiden Felder leer bleiben sollen zur Befüllung in der Maske, sind im Code dafür keine Werte hinterlegt, es wird nur per (tab) ins dritte Feld gesprungen und dort der Wert vorgegeben.
Das erste Feld soll mit einem Text belegt werden:
Sub WörterVorbelegen()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%nJochen{tab}"
CommandBars.FindControl(ID:=860).Execute
End Sub
Durch einmaliges (tab) nach dem Text im Code wird erreicht, dass das zweite Feld das aktive Feld ist.
Das zweite Feld soll mit dem aktuellen Datum belegt werden:
Sub HeuteVorbelegen()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%n{tab}" & Format(Date, "dd.mm.yyyy") & "{tab}"
CommandBars.FindControl(ID:=860).Execute
End Sub
Das erste Feld soll mit einem Zellwert (hier aus D1) belegt werden:
Sub ZellwertVorbelegen()
Application.Goto Worksheets("Tabelle1").Range("A1"), True
SendKeys "%n" & Worksheets("Tabelle1").Range("D1").Text & "{tab}"
CommandBars.FindControl(ID:=860).Execute
End Sub
Durch einmaliges (tab) nach dem Zellbezug im Code wird erreicht, dass das zweite Feld das aktive Feld ist.