Excel VBA und Normales Excel

  • #1
L

LKhan

Mitglied
Themenersteller
Dabei seit
28.06.2007
Beiträge
12
Reaktionspunkte
0
Hallo da draußen,

ich habe mal wieder ein Problem in Excel - eigentlich zwei:
1. die Anwender wollen in einer Tabelle (Spalte C) ein Datum eintragen.
Das soll aber ohne Punkt eingegeben werden können. Also: 01012011
Ich möchte aber, dass direkt nach der Eingabe das Ganze als 01.01.2011 geliefert wird.
Am liebsten wäre es mir, wenn ein VBA das im Hintergrund automatisch erledigen würde.

2. Gleiches Problem, nur soll hier in einer Maske (Textbox) das Datum auch wie oben eingegeben werden und dann im Hintergrund das richtige Datum in die Tabelle geschrieben werden.
Wie es dahin kommt, weiß ich, aber wie es umgewandelt wird, halt nicht - siehe oben. :'(

Könnt ihr mir da weiterhelfen ?

Als Info: Excel 2000 auf x64 Platform
:1

Gruß
LKhan
 
  • #2
Hallo LKhan,

zum ersten Punkt müßtest du folgendes Makro in die Code-Seite des Tabellen-Blattes einfügen.
(Lasche des Blattes markieren, rechte Maustaste, Code anzeigen)

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 
 Const c_SPALTE = 3->zu überwachende Spalte
 Const c_ZEILE_AB = 2->ab Zeile zu überwachend
 
 Dim r As Range
 
 For Each r In Target
 
  If r.Column = c_SPALTE Then
   If r.Row >= c_ZEILE_AB Then
    Application.EnableEvents = False
    Call DatumStringTTMMJJJJ_InDatumUmwandeln(r)
    Application.EnableEvents = True
   End If
  End If
 Next

 Set r = Nothing
End Sub

Private Function DatumStringTTMMJJJJ_InDatumUmwandeln(Zelle As Range)
 Dim sText As String, dDatum As Date
 
 sText = Zelle.Value
 
 If sText =  Then Exit Function
 If Len(sText) <> 8 Then Exit Function
 On Error Resume Next
 dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 Zelle.NumberFormat = dd.mm.yyyy
 Zelle.Value = dDatum
 
End Function

zu Punkt 2 folgender Code-Schnipsel
Code:
Sub Beispiel()

 Dim sText As String
->... Textbox auslesen und Wert in sText speichern
->...
 sText = 0012013
 If DatumStringTTMMJJJJ_InDatumUmwandeln2(sText) Then
 
 ->... sText in Zelle eintragen
 ->...
 Else
 ->... Fehlermeldung
  
 End If

End Sub
Private Function DatumStringTTMMJJJJ_InDatumUmwandeln2(sText As String) As Boolean
 Dim dDatum As Date
 
 DatumStringTTMMJJJJ_InDatumUmwandeln2 = False
 
 If sText =  Then Exit Function
 If Len(sText) <> 8 Then Exit Function
 On Error Resume Next
 dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 sText = Format(dDatum, dd.mm.yyyy)
 
 DatumStringTTMMJJJJ_InDatumUmwandeln2 = True
 
End Function

Gruß Matjes :)
 
  • #3
Hallo Matjes,
ich habe das Script in mein VBA kopiert.
Am Anfang hat es auch Kasse funktioniert, aber bei der vierten Eingabe von TextZahlen hat mir Excel ein Gatter->####' gebaut und ist in den Debugg-Modus gesprungen. Und zwar an der markierten Stelle.
Ein wenig Ahnung habe ich von VBA auch, aber das hat mich vor ein Rätsel gestellt. ???
Das gleiche hatte ich schon einmal, nach einem Script.
Ich kann es mir nicht erklären, weil es am Anfang einwandfrei läuft. :|
Hast Du noch eine Idee ?
Vielen Dank für das Script und die Unterstützung.

Gruß
LKhan
Private Sub Worksheet_Change(ByVal Target As Range)

Const c_SPALTE = 3->zu überwachende Spalte
Const c_ZEILE_AB = 2->ab Zeile zu überwachend

Dim r As Range

For Each r In Target

If r.Column = c_SPALTE Then
If r.Row >= c_ZEILE_AB Then
Application.EnableEvents = False
Call DatumStringTTMMJJJJ_InDatumUmwandeln(r)
Application.EnableEvents = True
End If
End If
Next

Set r = Nothing
End Sub

Private Function DatumStringTTMMJJJJ_InDatumUmwandeln(Zelle As Range)
Dim sText As String, dDatum As Date

sText = Zelle.Value
If sText = Then Exit Function
If Len(sText) <> 8 Then Exit Function
On Error Resume Next
dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
On Error GoTo 0
If Err.Number <> 0 Then Err.Clear: Exit Function
Zelle.NumberFormat = dd.mm.yyyy
Zelle.Value = dDatum

End Function
 
  • #4
Hallo LKhan,

also das Ganze klappt nur, wenn die Spalte C als Text formatiert wird/bleibt.

Gatter->####' gebaut...
Das tritt auf, wenn die Zelle als Datum formatiert ist und eine Eingabe z.B. 010120000 erfolgt (man achte auf die Null zuviel) . Das überschreitet dann den Wertebereich von Datum und deshalb wedren ### ausgegeben.
Dies ist im Makro jetzt abgefangen - nicht die fehlerhafte Eingabe, aber der Sprung in den Debag-Modus.

Blöd ist auch eine eventuelle Korrektur: wiederholte Eingabe von 01010212 wird in eine Datumszahl umgewandelt, und zwar von Excel und nicht vom Makro :mad: Das hab ich jetzt so geändert, das das umgewandelts datum jetzt als Text abgelegt wird. Dann kann man in der Zelle auch wiederholt z.B. 01012012 eingeben, und das wird dann jedesmal richtig in 01.01.2012 umgewandelt.

Gruß Matjes :)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 
 Const c_SPALTE = 3->zu überwachende Spalte
 Const c_ZEILE_AB = 2->ab Zeile zu überwachend
 
 Dim r As Range
 
 For Each r In Target
 
  If r.Column = c_SPALTE Then
   If r.Row >= c_ZEILE_AB Then
    Application.EnableEvents = False
    Call DatumStringTTMMJJJJ_InTTPunktMMPunktJJJJ_Umwandeln(r)
    Application.EnableEvents = True
   End If
  End If
 Next

 Set r = Nothing
End Sub

Private Function DatumStringTTMMJJJJ_InTTPunktMMPunktJJJJ_Umwandeln(Zelle As Range)
 Dim sText As String, dDatum As Date
 
 On Error Resume Next
 sText = Zelle.Value
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
 If sText =  Then Exit Function
 
 If Len(sText) <> 8 Then Exit Function
 
 On Error Resume Next
 dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
 Zelle.NumberFormat = @->Format Text, da sonst eine wiederholte Eingabe nicht möglich ist
 Zelle.Value = Format(dDatum, dd.mm.yyyy)
 
End Function
 
  • #5
Hallo Matjes,

deine Makro sind wie immer, einfach Klasse!

Hätte aber ein Änderungsvorschlag, um die wiederholte Eingabe, bei der Eingabe von z.B. 01012012 zu vermeiden.
Im Standard Formatierten Feld, wird die Eingabe von z.B. 01012012 von 01012012, in 1012012, von Excel geändert.
Diese Fehlerkorrektur von Excel abfangen, mit folgender Funktions- Änderung:

Code:
Private Function DatumStringTTMMJJJJ_InTTPunktMMPunktJJJJ_Umwandeln(Zelle As Range)
 Dim sText As String, dDatum As Date
 
 On Error Resume Next
 sText = Zelle.Value
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
 If sText =  Then Exit Function
 
' DIESE ZEILE EINFÜGEN
 If Len(sText) = 7 Then sText = Mid(0 & sText, 1, 8)

 If Len(sText) <> 8 Then Exit Function
 
 On Error Resume Next
 dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
' DIESE ZEILE LÖSCHEN
' Zelle.NumberFormat = @->Format Text, da sonst eine wiederholte Eingabe nicht möglich ist

 Zelle.Value = Format(dDatum, dd.mm.yyyy)
 
End Function
 
  • #6
Hallo Matjes, hallo hddiesel,

eure Scripts sind Klasse und funktionieren einwandfrei! mml
Dank der Verbesserung von hddiesel ist das Ganze noch komfortabler.
Vielen Dank :1

LKhan
 
  • #7
Hallo LKahn,

wenn du die Funktion noch um eine Zeile erweiterst, kannst du auch die Eingabe, Erster Januar 2012 112012 abfangen, dann ist das Ganze noch komfortabler.

Code:
' Eingabe 112012 abfangen
 If Len(sText) = 6 Then sText = 0 & Mid(sText, 1, 1) & 0 & Mid(sText, 2, 6)

Hier die geänderte Funktion:

Code:
Private Function DatumStringTTMMJJJJ_InTTPunktMMPunktJJJJ_Umwandeln(Zelle As Range)
 Dim sText As String, dDatum As Date
 
 On Error Resume Next
 sText = Zelle.Value
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
 If sText =  Then Exit Function
 
' Eingabe 112012 abfangen
 If Len(sText) = 6 Then sText = 0 & Mid(sText, 1, 1) & 0 & Mid(sText, 2, 6)
 
' Eingabe 01012012 abfangen
 If Len(sText) = 7 Then sText = Mid(0 & sText, 1, 8)
 
 If Len(sText) <> 8 Then Exit Function
 
 On Error Resume Next
 dDatum = Mid(sText, 1, 2) & . & Mid(sText, 3, 2) & . & Mid(sText, 5, 4)
 On Error GoTo 0
 If Err.Number <> 0 Then Err.Clear: Exit Function
 
 Zelle.Value = Format(dDatum, dd.mm.yyyy)
 
End Function
 
  • #8
Wichtig bei deinem Problem 1 ist, dass die Leute nach dem Schreiben des Datums die Zelle mit Enter verlassen und auf keinen Fall nach Ende des Schreibens mit der Maus eine neue Zelle auswählen.
Das ist eine Unart, die sehr viele unbeadarfte Excel-User haben.

Der Eintrag in eine Excel-Zelle ist erst mit einem abschließenden Enter beendet. Auch wenn es manchmal anders funktioniert, so funktoniert es mit Enter immer (z.B. wenn man den Eintrag in eine Zelle mit einem Bindestrich beginnt).
 
Thema:

Excel VBA und Normales Excel

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben