Мяв! Народ, подключайтесь. Обнаружил проблему следующего свойства. Вводим дату с использованием кода отсюда. Если ввод осуществляется в ячейку с форматом "общий", все работает. Дата вводится, и в ячейке устанавливается формат "дата". А вот при попытке исправить дату в ячейке, сначала Excel преобразует введенное значение в соответствии со своим пониманием правил работы с датой, и только после этого запускается макрос. Но в ячейке уже не то, что мы вводим, а погода в Африке. Как сию бяку победить? У меня с идеями туго.
Мяв! Народ, подключайтесь. Обнаружил проблему следующего свойства. Вводим дату с использованием кода отсюда. Если ввод осуществляется в ячейку с форматом "общий", все работает. Дата вводится, и в ячейке устанавливается формат "дата". А вот при попытке исправить дату в ячейке, сначала Excel преобразует введенное значение в соответствии со своим пониманием правил работы с датой, и только после этого запускается макрос. Но в ячейке уже не то, что мы вводим, а погода в Африке. Как сию бяку победить? У меня с идеями туго.RAN
If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If
[/vba]
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True ...
[/vba]
А так в самом начале? [vba]
Код
If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If
[/vba]
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True ...
Под спойлером моего поста выше начало макроса. Целиком так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then If Len(Target) = 3 Or Len(Target) = 4 Then If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then Application.EnableEvents = False Target = Format(Format(Target.Value, "00:00"), "h:nn") Application.EnableEvents = True Else Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If Application.EnableEvents = True Exit Sub error_: Application.EnableEvents = False Target = Empty ' Punto Switcher, гад, отмене мешает ' Application.Undo Application.EnableEvents = True End Sub
[/vba]
Под спойлером моего поста выше начало макроса. Целиком так [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then If Len(Target) = 3 Or Len(Target) = 4 Then If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then Application.EnableEvents = False Target = Format(Format(Target.Value, "00:00"), "h:nn") Application.EnableEvents = True Else Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End If End If Application.EnableEvents = True Exit Sub error_: Application.EnableEvents = False Target = Empty ' Punto Switcher, гад, отмене мешает ' Application.Undo Application.EnableEvents = True End Sub
Написал ответ, а форум сдох. Саш, мУрси за направление на путь истинный. Переклинило, решил что происходит по типу 1.5>>43586>>1.май, поэтому смену формата даже и не попробовал. А проверка на формат, думаю, излишняя, ибо оставляет оператору лазейку для вольностей.
Написал ответ, а форум сдох. Саш, мУрси за направление на путь истинный. Переклинило, решил что происходит по типу 1.5>>43586>>1.май, поэтому смену формата даже и не попробовал. А проверка на формат, думаю, излишняя, ибо оставляет оператору лазейку для вольностей.RAN