Leesteken wijzigen door een ander leesteken in de actieve regel (Excel / VBA)

Status
Niet open voor verdere reacties.

Robert Smidt

Gebruiker
Lid geworden
26 mei 2009
Berichten
947
Beste Helpmij'ers,

Ik ben op zoek naar een vba-code die een punt (.) en/of komma (,) in kolom A, tijdens het typen, wijzigt in een streepje (-) dus alleen in de actieve regel. Kolom A heeft een datumeigenschap (31-12) zonder jaartal. Wanneer er een punt wordt gezet lijkt het dat de juiste datum er staat, echter maakt excel daar het jaar 1900 van. Het is dus mijn bedoeling; wanneer per abuis een punt of een komma wordt getypt deze er een streepje van maakt.

Alvast heel erg bedankt.

M.vr.gr.
Robert
 
Gebruik deze functie eens achter dat blad:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Or Target.Column > 1 Then Exit Sub
    
    Application.EnableEvents = False
    If InStr(1, Target.Value, ".") > 0 Then
        Target.Value = DateValue(Replace(Target.Value, ".", "-"))
        Application.EnableEvents = True
        Exit Sub
    End If
    
    Dim T As Date
    T = Target.Value
    If InStr(1, CDbl(T), ",") > 0 Then
        Target.Value = DateValue(Replace(CDbl(T), ",", "-"))
    End If
    Application.EnableEvents = True
End Sub
 
Laatst bewerkt:
Bedankt voor jouw reactie.

De code werkt, echter staat deze de rest van de codes in de weg. Wanneer ik datum heb genoteerd doet deze zijn werking, echter verspringt de cursor niet naar de volgende cel, zie onderstaande codes. Wat kan ik hier aan veranderen dat deze het wel weer doen?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Or Target.Column > 1 Then Exit Sub 

Application.EnableEvents = False

If Not Intersect(Target, Range("a13:y500")) Is Nothing Then
    If Selection.Count = 1 Then
    If Not Intersect(Target, Union(Columns(1), Columns(2), Columns(3), Columns(4), Columns(5), Columns(6), Columns(7), Columns(8), Columns(9), Columns(10), Columns(11), Columns(12), Columns(13), Columns(14), Columns(15), Columns(18), Columns(23), Columns(32))) Is Nothing Then
        With Target

        If .Column = 1 And Not IsEmpty(Target) Then Application.Goto .Offset(, 2) 'kolom a
        If .Column = 3 And Not IsEmpty(Target) Then Application.Goto .Offset(, 3) 'kolom c
        If .Column = 5 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom e
        If .Column = 6 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom f
        If .Column = 7 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom g
        If .Column = 8 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom g
        If .Column = 9 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom I
        If .Column = 10 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom J
        If .Column = 11 And Not IsEmpty(Target) Then Application.Goto .Offset(, 1) 'kolom K

        'Datumnotatie universeel
        Application.EnableEvents = False
        If InStr(1, Target.Value, ".") > 0 Then
            Target.Value = DateValue(Replace(Target.Value, ".", "-"))
            Application.EnableEvents = True
            Exit Sub
        End If
        
        Dim T As Date
        T = Target.Value
        If InStr(1, CDbl(T), ",") > 0 Then
            Target.Value = DateValue(Replace(CDbl(T), ",", "-"))
        End If

etc.
 
Een voorbeeldbestandje met de volledige code wordt zeer op prijs gesteld ipv van halve vragen waarbij er ineens een konijn uit de hoge hoed komt!

Code:
If Target.Count > 1 Or Target.Column > 1 Then Exit Sub

Dit gaat je natuurlijk niet echt helpen om de kolommen > 1 ook nog een event te laten triggeren.

Als je in kolom A bv 03,10 gaat invoeren (3 oktober) zal dat ook niet het gewenste resultaat opleveren.

Wat het probleem is met de invoer begrijp ik verder niet. Iets met een "." invoeren geeft een tekstwaarde iets met een "," invoeren geeft een getal. Iets met een "-" of "/" invoeren geeft een datum. Dat kan volgens mij iedereen zien die een datum moet invoeren.

Om er iets van te maken moet je eerst de eigenschap op tekst instellen.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        If Target = "" Then Target.NumberFormat = "@"
    End If
End Sub



En vervolgens de hele handel een beetje repareren.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Count = 1 Then
    Application.EnableEvents = False
    With Target
        .NumberFormat = "dd-mm"
        c00 = Replace(Replace(Target, ",", "-"), ".", "-")
        If InStr(1, c00, "-") <> 0 Then .Value = DateSerial(Year(Date), Format(Split(c00, "-")(1), "00"), Split(c00, "-")(0))
    End With
    Application.EnableEvents = True
End If
End Sub
 
Zonder de selection_change code.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Count = 1 Then
    Application.EnableEvents = False
    With Target
       c00 = Replace(Replace(.value, ",", "-"), ".", "-")
      If InStr(c00, "-") > 0 Then .Value = DateSerial(Year(Date), CInt(Split(c00, "-")(1)), CInt(Split(c00, "-")(0)))
      .NumberFormat = "dd-mm"
    End With
    Application.EnableEvents = True
End If
End Sub
 
Sorry voor de late reactie.

Helaas werkt de komma nog steeds niet, het systeem maakt daar ongeacht welke maand je invult hier de maand januari (01) van. Omdat de code verder prima werkt (alleen de komma niet) zie ik dat als een aanvaardbaar risico en wil jullie heel hartelijk bedanken voor de hulp.
 
Als je gebruikersinvoer wil controleren ('begeleiden') gebruik je daarvoor een userform.

Als je dat niet wil is validation (met alle inherente beperkingen) de aangewezen weg.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan