Excel VBA und Normales Excel

Dieses Thema Excel VBA und Normales Excel im Forum "Microsoft Office Suite" wurde erstellt von LKhan, 22. Dez. 2011.

Thema: Excel VBA und Normales Excel Hallo da draußen, ich habe mal wieder ein Problem in Excel - eigentlich zwei: 1. die Anwender wollen in einer...

  1. 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.

    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).
     
Die Seite wird geladen...

Excel VBA und Normales Excel - Ähnliche Themen

Forum Datum
Re: Excel VBA und Normales Excel Windows XP Forum 27. Dez. 2011
Excel-Feature gesucht Microsoft Office Suite 11. Okt. 2016
Excel Tabelle Werte zu ordnen Microsoft Office Suite 23. Sep. 2016
Excel: Bereiche auf 'leer' Überprüfen Microsoft Office Suite 15. Sep. 2016
Import Datensatz inkl = und - Zeichen in Excel/Libre CALC Software: Empfehlungen, Gesuche & Problemlösungen 20. Mai 2016