Доброго времени суток Форумчане. Использовал найденный в Internet`e макрос [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim vVal Dim StrVal As String Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("D5:D10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
[/vba] Помогите пожалуйста сделать так, что бы он работал и в колонках "E""F""G""H" Файл прилагаю
Доброго времени суток Форумчане. Использовал найденный в Internet`e макрос [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim vVal Dim StrVal As String Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("D5:D10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
[/vba] Помогите пожалуйста сделать так, что бы он работал и в колонках "E""F""G""H" Файл прилагаюDrMini
Сделал методом научного тыка. Получилось вот так: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim vVal Dim StrVal As String Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("D5:D10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("E5:E10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("F5:F10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("G5:G10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("H5:H10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If Application.EnableEvents = True
End Sub
[/vba] Работет.
Сделал методом научного тыка. Получилось вот так: [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim vVal Dim StrVal As String Dim dDate As Date
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5:C10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("D5:D10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("E5:E10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("F5:F10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If
If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("G5:G10000")) Is Nothing Then With Target StrVal = Format(.Text, "000000") If IsNumeric(StrVal) And Len(StrVal) = 6 Then Application.EnableEvents = False dDate = DateValue(Left(StrVal, 2) & "/" & Mid(StrVal, 3, 2) & "/" & Right(StrVal, 2)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(dDate), Month(dDate), Day(dDate))) End If End With End If
If Not Intersect(Target, Range("H5:H10000")) Is Nothing Then With Target vVal = Format(.Value, "0000") If IsNumeric(vVal) And Len(vVal) = 4 Then Application.EnableEvents = False .Value = Left(vVal, 2) & ":" & Right(vVal, 2) .NumberFormat = "[h]:mm" End If End With End If Application.EnableEvents = True
При ошибке ввода (например всего четырёх цифр) макрос перестаёт работать. Помогает только перезагрузка файла. Так, как этот лист будет в книге состоящей из нескольких листов помогите это исправить. Какой ни будь функцией в макросе не дающей ему прекращать работать или кнопкой для его перезапуска. [p.s.]Создать новую тему или можно продолжить эту?[/p.s.] [offtop]Прошу прощения если написал в описании проблемы бред. Я в VBA мягко говоря не силён. Помогите если это возможно.[/offtop]олжить здесь?
При ошибке ввода (например всего четырёх цифр) макрос перестаёт работать. Помогает только перезагрузка файла. Так, как этот лист будет в книге состоящей из нескольких листов помогите это исправить. Какой ни будь функцией в макросе не дающей ему прекращать работать или кнопкой для его перезапуска. [p.s.]Создать новую тему или можно продолжить эту?[/p.s.] [offtop]Прошу прощения если написал в описании проблемы бред. Я в VBA мягко говоря не силён. Помогите если это возможно.[/offtop]олжить здесь?DrMini
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 Len(Target) = 5 Or Len(Target) = 6 Then If IsDate(Format(Target.Value, "00\/00\/00")) Then If Mid(Format(Target.Value, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/00")) Application.EnableEvents = True End If ElseIf Len(Target) = 7 Or Len(Target) = 8 Then If IsDate(Format(Target.Value, "00\/00\/0000")) Then If Mid(Format(Target.Value, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/0000")) Application.EnableEvents = True End If End If 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 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 Len(Target) = 5 Or Len(Target) = 6 Then If IsDate(Format(Target.Value, "00\/00\/00")) Then If Mid(Format(Target.Value, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/00")) Application.EnableEvents = True End If ElseIf Len(Target) = 7 Or Len(Target) = 8 Then If IsDate(Format(Target.Value, "00\/00\/0000")) Then If Mid(Format(Target.Value, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/0000")) Application.EnableEvents = True End If End If 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 Application.Undo Application.EnableEvents = True End Sub
RAN, Конечно муррр но не совсем... Ввожу например вместо 050119 5119 выходит ошибка. И после нажатия на любую из кнопок "Debug" или "End" надо перезагружать файл по новой. При вводе пяти цифр 50119 всё нормально. Ошибка возникает только при вводе от ОДНОЙ до ЧЕТЫРЁХ цифр. Вот как бы избавиться от перезагрузки файла. К нему в локалке подключается изредка ещё один человек (только для чтения) что бы посмотреть данные. Может это как то возможно сделать?
RAN, Конечно муррр но не совсем... Ввожу например вместо 050119 5119 выходит ошибка. И после нажатия на любую из кнопок "Debug" или "End" надо перезагружать файл по новой. При вводе пяти цифр 50119 всё нормально. Ошибка возникает только при вводе от ОДНОЙ до ЧЕТЫРЁХ цифр. Вот как бы избавиться от перезагрузки файла. К нему в локалке подключается изредка ещё один человек (только для чтения) что бы посмотреть данные. Может это как то возможно сделать?DrMini
Вы еще АБВГД попробуйте ввести. По вашему 5119 похоже на дату? По моему нет.
Полностью с Вами согласен. Диспетчера будут в течении суток вводить данные и может быть любая ошибка которая остановит выполнение макроса. Хочется исключить перезагрузку файла. Только макрос. Или сделать так, что бы выдавалась ошибка и можно было дальше работать.
Вы еще АБВГД попробуйте ввести. По вашему 5119 похоже на дату? По моему нет.
Полностью с Вами согласен. Диспетчера будут в течении суток вводить данные и может быть любая ошибка которая остановит выполнение макроса. Хочется исключить перезагрузку файла. Только макрос. Или сделать так, что бы выдавалась ошибка и можно было дальше работать.DrMini
Сообщение отредактировал DrMini - Воскресенье, 21.04.2019, 08:58
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 Len(Target) = 5 Or Len(Target) = 6 Then If IsDate(Format(Target.Value, "00\/00\/00")) Then If Mid(Format(Target.Value, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/00")) Application.EnableEvents = True Else: GoTo error_ End If ElseIf Len(Target) = 7 Or Len(Target) = 8 Then If IsDate(Format(Target.Value, "00\/00\/0000")) Then If Mid(Format(Target.Value, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/0000")) Application.EnableEvents = True Else: GoTo error_ End If Else: GoTo error_ End If 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
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 Len(Target) = 5 Or Len(Target) = 6 Then If IsDate(Format(Target.Value, "00\/00\/00")) Then If Mid(Format(Target.Value, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/00")) Application.EnableEvents = True Else: GoTo error_ End If ElseIf Len(Target) = 7 Or Len(Target) = 8 Then If IsDate(Format(Target.Value, "00\/00\/0000")) Then If Mid(Format(Target.Value, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ Application.EnableEvents = False Target = CDate(Format(Target.Value, "00\/00\/0000")) Application.EnableEvents = True Else: GoTo error_ End If Else: GoTo error_ End If 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
И не правильные даты просто не вводятся. Спасибо Вам. Вроде то, что надо. Сегодня гонят меня на огород копать. Вечером буду тестировать. [p.s.]СПАСИБО[/p.s.]
И не правильные даты просто не вводятся. Спасибо Вам. Вроде то, что надо. Сегодня гонят меня на огород копать. Вечером буду тестировать. [p.s.]СПАСИБО[/p.s.]DrMini
Сообщение отредактировал DrMini - Воскресенье, 21.04.2019, 18:21
В продолжении этой и вот этой тем. Помогите пожалуйста "подружить" макросы на одном листе.
[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 Private Sub Worksheet_Change(ByVal Target As Range) Dim d0_ As Range Set d_ = Intersect(Target, Range("J5:J2000")) 'диапазон If Not d_ Is Nothing Then Application.ScreenUpdating = 0 Application.EnableEvents = 0 On Error Resume Next With d_ For Each d0_ In d_ d0_ = --Right(d0_, 10) d0_.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##" Next d0_ End With Application.EnableEvents = 1 Application.ScreenUpdating = 1 End If 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 Private Sub Worksheet_Change(ByVal Target As Range) Dim d0_ As Range Set d_ = Intersect(Target, Range("J5:J2000")) 'диапазон If Not d_ Is Nothing Then Application.ScreenUpdating = 0 Application.EnableEvents = 0 On Error Resume Next With d_ For Each d0_ In d_ d0_ = --Right(d0_, 10) d0_.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##" Next d0_ End With Application.EnableEvents = 1 Application.ScreenUpdating = 1 End If End Sub