Есть такой момент, с запятой не проверил. Это все Excel мудрит, с запятой число преобразует. Нужно формат ячейки -текст. А формат ввода 1,10, специально сделан ошибкой. Даже не предполагал, что так вводить можно/нужно.
Есть такой момент, с запятой не проверил. Это все Excel мудрит, с запятой число преобразует. Нужно формат ячейки -текст. А формат ввода 1,10, специально сделан ошибкой. Даже не предполагал, что так вводить можно/нужно. RAN
А зачем с запятой? А без нее еще проще! А как с проверкой ввода дня и месяца? Мудрить надо. Короче, дерзайте. Пример слямзил с этого форума.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target = 0 Then Exit Sub Dim D4 As String Dim D8 As Date If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("D3:D33")) Is Nothing Then With Target D4 = Format(.Text, "0000") If Val(Left(D4, 2)) = 0 Or Val(Left(D4, 2)) > 31 Then MsgBox "Так низзя!!!": Exit Sub If Val(Mid(D4, 3, 2)) = 0 Or Val(Mid(D4, 3, 2)) > 12 Then MsgBox "Так низзя!!!": Exit Sub If IsNumeric(D4) And Len(D4) = 4 Then Application.EnableEvents = False D8 = DateValue(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(D8), Month(D8), Day(D8))) End If End With End If Application.EnableEvents = True End Sub
[/vba]
А зачем с запятой? А без нее еще проще! А как с проверкой ввода дня и месяца? Мудрить надо. Короче, дерзайте. Пример слямзил с этого форума.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target = 0 Then Exit Sub Dim D4 As String Dim D8 As Date If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("D3:D33")) Is Nothing Then With Target D4 = Format(.Text, "0000") If Val(Left(D4, 2)) = 0 Or Val(Left(D4, 2)) > 31 Then MsgBox "Так низзя!!!": Exit Sub If Val(Mid(D4, 3, 2)) = 0 Or Val(Mid(D4, 3, 2)) > 12 Then MsgBox "Так низзя!!!": Exit Sub If IsNumeric(D4) And Len(D4) = 4 Then Application.EnableEvents = False D8 = DateValue(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(D8), Month(D8), Day(D8))) End If End With End If Application.EnableEvents = True End Sub
А как с проверкой ввода дня и месяца? Мудрить надо. Короче, дерзайте.
А вы попробуйте ввести 2902 А как ввести дату 29.02.12 по сокращенной схеме Код тоже требует доработки. А что не так в моем последнем файле? там проверка дата или нет - если нет то возвращает введенный текст
А как с проверкой ввода дня и месяца? Мудрить надо. Короче, дерзайте.
А вы попробуйте ввести 2902 А как ввести дату 29.02.12 по сокращенной схеме Код тоже требует доработки. А что не так в моем последнем файле? там проверка дата или нет - если нет то возвращает введенный текст SLAVICK
isstr конечно нет. когда выдает ошибку? что вводите? по идее не должно останавливаться на этой строке. вложите файл и напишите что вводили и в какую ячейку. так сложно сказать
isstr конечно нет. когда выдает ошибку? что вводите? по идее не должно останавливаться на этой строке. вложите файл и напишите что вводили и в какую ячейку. так сложно сказать SLAVICK
Наиболее вероятно, что это никак не преодолеть. Вероятная причина возникновения - в ячейке установлен не общий формат, а формат даты, или числовой, или... При передаче значения в макрос происходит преобразование типа (причем именно до передачи значения и запуска макроса), макрос получает значение не соответствующего типа и выдает ошибку. Костыль - отслеживать формат ячейки, при не соответствии изменять формат и предлагать повторный ввод.
Проблема сродни "как заставить Excel при вставке копипастом НЕ преобразовывать 1.1 в 1 января"
Я, вроде, допилил свой макрос, но при изменении формата ячейки с общего на дата, получается не дата, а погода в Африке.
Наиболее вероятно, что это никак не преодолеть. Вероятная причина возникновения - в ячейке установлен не общий формат, а формат даты, или числовой, или... При передаче значения в макрос происходит преобразование типа (причем именно до передачи значения и запуска макроса), макрос получает значение не соответствующего типа и выдает ошибку. Костыль - отслеживать формат ячейки, при не соответствии изменять формат и предлагать повторный ввод.
Проблема сродни "как заставить Excel при вставке копипастом НЕ преобразовывать 1.1 в 1 января"
Я, вроде, допилил свой макрос, но при изменении формата ячейки с общего на дата, получается не дата, а погода в Африке.RAN
А как с проверкой ввода дня и месяца? Мудрить надо.
А во вторых SLAVICK, сообщение адресовано не Вам. А то, что код требует доработки, так на то и существует серое вещество. Если ТСу потребуется - доработает, если нет воспользуется Вашим готовым. Я же предложил пример для ввода 4-х знаков без запятой для самого быстрого ввода и особо с ним не разбирался. Ну если сильно надо, то пожалуйста.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target = 0 Then Exit Sub Dim D4 As String Dim D8 As Date If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("D3:D33")) Is Nothing Then With Target D4 = Format(.Text, "0000") If IsNumeric(D4) And Len(D4) = 4 Then If IsDate(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) Then Application.EnableEvents = False D8 = DateValue(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(D8), Month(D8), Day(D8))) Else MsgBox "Нет такой даты!" End If End If End With End If Application.EnableEvents = True End Sub
[/vba]
Хотя можно сделать на много короче. Только мне не надо.
А как с проверкой ввода дня и месяца? Мудрить надо.
А во вторых SLAVICK, сообщение адресовано не Вам. А то, что код требует доработки, так на то и существует серое вещество. Если ТСу потребуется - доработает, если нет воспользуется Вашим готовым. Я же предложил пример для ввода 4-х знаков без запятой для самого быстрого ввода и особо с ним не разбирался. Ну если сильно надо, то пожалуйста.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target = 0 Then Exit Sub Dim D4 As String Dim D8 As Date If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("D3:D33")) Is Nothing Then With Target D4 = Format(.Text, "0000") If IsNumeric(D4) And Len(D4) = 4 Then If IsDate(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) Then Application.EnableEvents = False D8 = DateValue(Left(D4, 2) & "/" & Mid(D4, 3, 2) & "/" & Year(Date)) .NumberFormat = "dd/mm/yyyy" .Value = CDate(DateSerial(Year(D8), Month(D8), Day(D8))) Else MsgBox "Нет такой даты!" End If End If End With End If Application.EnableEvents = True End Sub
[/vba]
Хотя можно сделать на много короче. Только мне не надо.Wasilich
Вероятная причина возникновения - в ячейке установлен не общий формат, а формат даты, или числовой, или..
Если это так - попробуйте изменить немного код [vba]
Код
Dim s$ If Target.Count > 1 Then Exit Sub s = Target.Value If InStr(1, s, ",") = 0 Then Exit Sub
[/vba] я поставил передачу значения в "s" до поиска запятой, а поиск уже в переменной. По идее должно помочь. если ошибка будет все равно - можно заменить s = Target.Value на s = Target.Text
Вероятная причина возникновения - в ячейке установлен не общий формат, а формат даты, или числовой, или..
Если это так - попробуйте изменить немного код [vba]
Код
Dim s$ If Target.Count > 1 Then Exit Sub s = Target.Value If InStr(1, s, ",") = 0 Then Exit Sub
[/vba] я поставил передачу значения в "s" до поиска запятой, а поиск уже в переменной. По идее должно помочь. если ошибка будет все равно - можно заменить s = Target.Value на s = Target.Text SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Суббота, 06.12.2014, 14:31
Не поможет. Точнее, может помочь для отдельных случаев, когда Excel не может преобразовать введенный текст в значение соответствующего типа. Например, если текст содержит 2 запятые. А при вводе без разделителей - сначала происходит преобразованте, а после уже преобразованное значение передается в функцию.
Я и писал это (немного в другом виде) для текстбокса формы. Там все отлично.
Не поможет. Точнее, может помочь для отдельных случаев, когда Excel не может преобразовать введенный текст в значение соответствующего типа. Например, если текст содержит 2 запятые. А при вводе без разделителей - сначала происходит преобразованте, а после уже преобразованное значение передается в функцию.
Я и писал это (немного в другом виде) для текстбокса формы. Там все отлично.RAN
А куда конкретнее? "01,10" преобразуется в "1,1", "1,1" передается в функцию, и, в результате, получаем 01.01.1900 При формате ячейки "дата" 1111 будет сначала преобразовано в дату"15.01.1903", а после передано в функцию. И на выходе - погода в Африке. А при формате "общий" в функцию будет передано "1111", что распознается и обработается как 11.11.2014. Если "1,1," не может быть преобразовано, оно и будет передано как "1,1,", а дальше все в шляпе.
А куда конкретнее? "01,10" преобразуется в "1,1", "1,1" передается в функцию, и, в результате, получаем 01.01.1900 При формате ячейки "дата" 1111 будет сначала преобразовано в дату"15.01.1903", а после передано в функцию. И на выходе - погода в Африке. А при формате "общий" в функцию будет передано "1111", что распознается и обработается как 11.11.2014. Если "1,1," не может быть преобразовано, оно и будет передано как "1,1,", а дальше все в шляпе.RAN
Так при этом код выдавать ошибку все равно не должен - некорректно преобразовывать - да, но сообщения об ошибке нет.
В файле с 14-го поста нужен текстовый формат ячеек -тогда все правильно. В примере с 15-го поста(где 2-е запятые) - можно любой формат оставлять.
Так при этом код выдавать ошибку все равно не должен - некорректно преобразовывать - да, но сообщения об ошибке нет.
В файле с 14-го поста нужен текстовый формат ячеек -тогда все правильно. В примере с 15-го поста(где 2-е запятые) - можно любой формат оставлять.SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Суббота, 06.12.2014, 19:41
есть столбцы, отформатированные как "дата" макрос общий для ВСЕХ ячеек (т.е. учитывать номер столбца не нужно) Но перед попыткой преобразования (при проверке на запятые) проверять формат ячейки Если она НЕ "дата", то выходим. Иначе продолжаем и проверяем на запятые проверенным способом. Таким образом имеем простой макрос и без ошибок преобразования.
Каким кодом можно проверить формат ячейки?
Уважаемые эксперты и специалисты!
если немного уточнить ТЗ
есть столбцы, отформатированные как "дата" макрос общий для ВСЕХ ячеек (т.е. учитывать номер столбца не нужно) Но перед попыткой преобразования (при проверке на запятые) проверять формат ячейки Если она НЕ "дата", то выходим. Иначе продолжаем и проверяем на запятые проверенным способом. Таким образом имеем простой макрос и без ошибок преобразования.
Каким кодом можно проверить формат ячейки?карандаш
isstr конечно нет. когда выдает ошибку? что вводите? по идее не должно останавливаться на этой строке. вложите файл и напишите что вводили и в какую ячейку. так сложно сказать
не помню точно. Но один раз макрос ругался на число типа 7230945 другой раз ещё на что-то, что не было датой и было не в столбце в датами - то ли текст, то ли ещё что-то. Не смог воспроизвести. т.е. ошибка преобразования возникала тогда, когда был ввод не даты не в ячейке для даты.
файл прикрепить не могу, т.к. он не "чистый" (т.е. не "академический" - содержит правила раскраски по условиям, в формате 2010 и с кучей страниц). На "голом" файле воспроизвести не могу.
isstr конечно нет. когда выдает ошибку? что вводите? по идее не должно останавливаться на этой строке. вложите файл и напишите что вводили и в какую ячейку. так сложно сказать
не помню точно. Но один раз макрос ругался на число типа 7230945 другой раз ещё на что-то, что не было датой и было не в столбце в датами - то ли текст, то ли ещё что-то. Не смог воспроизвести. т.е. ошибка преобразования возникала тогда, когда был ввод не даты не в ячейке для даты.
файл прикрепить не могу, т.к. он не "чистый" (т.е. не "академический" - содержит правила раскраски по условиям, в формате 2010 и с кучей страниц). На "голом" файле воспроизвести не могу.карандаш
Сообщение отредактировал карандаш - Воскресенье, 07.12.2014, 15:38
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim s$, form$ If Target.Count > 1 Then Exit Sub form$ = Target.NumberFormatLocal s = Target.Value If InStr(1, form, ".") = 0 Then Exit Sub 'If Not Target.NumberFormat = "m/d/yyyy" Then Exit Sub ' можно так - если используется только такой формат даты If InStr(1, s, ",") = 0 Then Exit Sub If UBound(Split(s, ",")) <> 2 Then Exit Sub s = Replace(s, ",", ".") If Right(s, 1) = "." Then s = s & Year(Now) If IsDate(s) Then Target = Format(s, "dd.mm.yyyy") End Sub
[/vba]
Вот:
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim s$, form$ If Target.Count > 1 Then Exit Sub form$ = Target.NumberFormatLocal s = Target.Value If InStr(1, form, ".") = 0 Then Exit Sub 'If Not Target.NumberFormat = "m/d/yyyy" Then Exit Sub ' можно так - если используется только такой формат даты If InStr(1, s, ",") = 0 Then Exit Sub If UBound(Split(s, ",")) <> 2 Then Exit Sub s = Replace(s, ",", ".") If Right(s, 1) = "." Then s = s & Year(Now) If IsDate(s) Then Target = Format(s, "dd.mm.yyyy") End Sub