Страницы: 1 2 След.
RSS
DateValue - Type Mismatch - как починить?, vba
 
такой код выдает ошибку DateValue - Type Mismatch, хотя раньше вроде бы работал
Код
Sub test()
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c1 = DateValue(cstr(a))
c2 = DateValue(a)
End Sub

появление ошибки зависит от настроек винды? или настроек экселя?
как её чинить?
Изменено: KUDRIN - 14.01.2026 13:52:54
 
Код отработал, ошибка не воспроизвелась
Вспоминайте, что изменилось после этого 'раньше'
Согласие есть продукт при полном непротивлении сторон
 
А зачем вообще применять DateValue к данным, которые и так являются датой? FileDateTime возвращает именно дату в формате даты, а не текст.
Проблемы могут возникнуть на разных локализациях, если переменная а имеет тип String. Попробуйте задать типы явно:
Код
Sub test()
Dim a as date, b as boolean, c as date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = DateValue(a)
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 13:53:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Sanja написал:
Код отработал, ошибка не воспроизвелась
а у меня вот так, ни c1 ни c2 не отрабатывает


Цитата
Sanja написал:
Вспоминайте, что изменилось после этого 'раньше'
например смена винды, в данном случае с 7+2010 на 10+2020

Цитата
Дмитрий(The_Prist) Щербаков написал:
Попробуйте задать типы явно:
с этим кодом тоже самое, та же ошибка
Изменено: KUDRIN - 14.01.2026 14:26:25
 
Цитата
Дмитрий(The_Prist) Щербаков  написал:
А зачем вообще применять DateValue к данным, которые и так являются датой?
например чтобы вместо каши получить нормальную дату, или время (TimeValue я не стал упомянать, т.к. в контексте этой проблемы нет разницы)
уместен ли тут вообще вопрос "зачем?"  
Изменено: KUDRIN - 14.01.2026 14:27:01
 
Добавьте в макрос Дмитрия после присвоения переменной a
Код
Debug.Print a


Скопируйте текст из окна Immediate (Ctrl+G в VBE) и поместите в сообщение
Владимир
 
Цитата
KUDRIN написал:
ни c1 ни c2 не отрабатывает
ага, и при этом переменна b = true, а переменная a = реальная дата. И типы переменным Вы так и не назначили, оставив их как есть. Даже больше скажу - приложили Вы скрин с ошибкой, которая возникла на строке:
Код
c1 = DateValue(SCtr(a))

до с2 дело даже не дошло. В чем смысл проверки с2, если Вы даже не дошли до назначения ей значения?
Цитата
KUDRIN написал:
чтобы вместо каши получить нормальную дату, или время
Код
Sub test()
Dim a As Date, b As Boolean, c As Date, ct As Date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = Int(a)
ct = a - c
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 14:18:31
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
И типы переменным Вы так и не назначили
я отвечал другому человеку, и скрин приложил тоже для него
скринить результат с объявлением типов данных я не стал, а просто написал текстом
если нужен персональный скрин и слов недостаточно, то пожалуйста



вот ещё и файл-пример прикреплён с этим же кодом, который тоже у меня выдаёт ошибку

Цитата
Дмитрий(The_Prist) Щербаков написал:
В чем смысл проверки с2, если Вы даже не дошли до назначения ей значения?
да, я умею пользоваться Ctrl+F9 , ещё вопросы?

Цитата
Дмитрий(The_Prist) Щербаков написал:
ct = a - c
вопрос был не в конвертации дат, а вопрос темы - причина ошибки и как эту ошибку полечить

Цитата
sokol92 написал:
Скопируйте текст из окна Immediate (Ctrl+G в VBE) и поместите в сообщение
готово:
Код
Ср 12.06.24 9:42:15 
Изменено: KUDRIN - 14.01.2026 14:34:13
 
Увидел Ваши картинки.
Интересно, в Вашей конфигурации дата неявно преобразована в текст как "Ср 12.06.24 9:42:15". Такой текст функция DateValue "забракует".
А что у Вас указано в настройках Windows в разделе Регион:
Изменено: sokol92 - 14.01.2026 14:37:47
Владимир
 
А так?
Код
Sub test111()
Dim a As String, b As Boolean, c As Date
a = FileDateTime("C:\Windows\notepad.exe")
Debug.Print a
b = IsDate(a)
c = DateValue(a)
End Sub
 
Цитата
KUDRIN написал:
если нужен персональный скрин и слов недостаточно, то пожалуйста
я бы верил на слово, если бы код был предоставлен без всяких добавок в виде CStr, а не тот, который в скрине. При том скрин явно не повествует о том, на какой же строке ошибка. Т.е. сами наводите мороки и каши с кодами, а потом еще раздражаетесь, что Вас кто-то где-то не так понял. Вообще без проблем - мне Ваше персональное внимание не нужно, у меня код ошибок вообще не выдает. Просто было желание помочь, отсюда и подобные вопросы с желанием увидеть именно предложенный вариант с ошибкой, а не что-то опять на коленке написанное.
Цитата
KUDRIN написал:
вопрос был не в конвертации дат, а вопрос темы - причина ошибки и как эту ошибку полечить
самое правильное - как раз как я показал - в любой локализации сработает без ошибок. На мой взгляд это самое правильное "лечение". Если думаете, что DateValue ничего никуда не конвертирует - Вы ошибаетесь. Эта функция сначала конвертирует входное значение в текстовое выражение, и уже только после этого полученный текст - в значение даты. Именно поэтому я и сделал в самом первом посте упор на локализацию. Потому что DateValue(a) будет всегда от неё зависеть и этот метод весьма не надежен. Он нужен только если изначально работаете с явным текстом и то - лучше отказаться, если не понимания, какие виды этого самого текста могут быть в итоге. А вот Int - это куда ближе при работе с датами, чем DateValue, т.к. любая дата это в первую очередь число и как раз такие методы куда быстрее и корректнее обработают даты.
Даже достучавшись до причины ошибки(явно что-то в локали) - что делать будете на тех ПК, где на эти настройки повлиять не можете? Заставлять пользователей настройки менять?
Цитата
KUDRIN написал:
я умею пользоваться Ctrl+F9 , ещё вопросы?
нет, откуда? Я вижу у Вас и без моих советов и вопросов все отлично. Удачи!
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 14:51:18
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Или так?
Код
Sub test111()
Dim a As String, b As Boolean, c As Date
a = FileDateTime("C:\Windows\notepad.exe")

Dim arr As Variant
arr = Split(a, " ")
a = arr(UBound(arr) - 1) & " " & arr(UBound(arr))
arr = Empty

Debug.Print a
b = IsDate(a)
c = DateValue(a)
End Sub
 
_

Цитата
sokol92 написал:
А что у Вас указано в настройках Windows в разделе Регион



Цитата
МатросНаЗебре написал:
А так?

Цитата
МатросНаЗебре написал:
Или так?
в обоих случаях ошибка

Цитата
Дмитрий(The_Prist) Щербаков написал:
Даже достучавшись до причины ошибки(явно что-то в локали) - что делать будете
для начала достучусь до причины ошибки, а потом уже можно дальше подумать
вообще странно, что за столько лет такой ошибки ни у кого не возникало? с нуля копать

попробую позапускать код на разных версиях windows, о результатах сообщу
Цитата
sokol92 написал:
дата неявно преобразована в текст как "Ср 12.06.24 9:42:15". Такой текст функция DateValue "забракует"

а у всех остальных какой результат преобразования? вот такой? "12.06.24 9:42:15" ? значит проблема именно в том, чтобы выставить (в системе?), чтобы день недели спереди не отображался
Изменено: KUDRIN - 14.01.2026 15:17:57
 
Цитата
KUDRIN написал:
вообще странно, что за столько лет такой ошибки ни у кого не возникало
Боюсь, у Вас необычный формат "краткой даты" (в региональных настройках MS Windows). VBA преобразует  дату в текст в соответствии с форматом "краткой даты".
Обычный формат краткой даты: 14.01.2026
Про настройки форматов см., например, здесь, "Настройка формата даты и времени вручную".
Изменено: sokol92 - 14.01.2026 15:21:13
Владимир
 
Цитата
KUDRIN написал:
за столько лет такой ошибки ни у кого не возникало?
возникали. Написали уже - локализация. У Вас запись даты включает в себя день недели в кратком формате("Ср 14.01.2025"). И этот формат даты никак не может быть преобразован из VBA через DateValue, потому что - см.выше. DateValue всегда работает с текстом и если передали не текст - то пытается в текст преобразовать и преобразовывает "как есть", т.е. в "Ср 14.01.2025". А такой текст не является допустимым в VBA.
Вы IsDate неверно использовали, если хотели проверить, допустим ли полученный формат даты в DateValue. Попробуйте так:
Код
b = IsDate(Cstr(a))

уверен, что выдаст False.

И это не единственный формат, который может "не понравиться" VBA. Поэтому я и предложил работать через Int, как наиболее универсальное средство, которое не несет в себе по сути никаких подводных камней.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 15:18:19
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
("Ср 14.01.2025"). И этот формат даты никак не может быть преобразован из VBA через DateValue,
всё, направление понятно, буду копать где убирается (и добавляется) эта "Ср". настройки винды это или может софтина какая, а может настройки часов

О, и даже с виртуалками морочиться не пришлось
вот где это убирается - ПКМ на часы справа снизу - настройка времени и даты - формат даты и времени и региона - изменить форматы данных - выставить ту, где нету "дня недели"
у меня после изменения строка со "Ср dd.mm.yyyy" куда-то пропала, а была выбрана внизу нижней строчкой (там где красная рамка)


я вроде какую-то софтину устанавливал или где-то что-то шаманил, чтобы в часах вин 10 отображался день недели в строке перед датой, как на вин7

после смены в (Пуск - Региональные параметры (Регион) - изменить форматы данных) - всё починилось и код заработал
Цитата
Дмитрий(The_Prist) Щербаков написал:
И это не единственный формат, который может "не понравиться" VBA.
ну, когда уже ясна причина, то можно искать всякие разные пути - изменение настроек часов, пользование другими функциями или преобразование и причёсывание выдаваемого значения FileDateTime, это уже дело десятое. именно DateValue - Type Mismatch плохо гуглилась и сразу была не ясна причина ошибки

благодарю каждого за помощь, каждый внёс свою прояснительную грань в этом вопросе
Изменено: KUDRIN - 14.01.2026 15:43:09
 
Цитата
sokol92 написал:
Скопируйте текст из окна Immediate (Ctrl+G в VBE) и поместите в сообщение
Увидел Ваши картинки.
да, тут ещё мне надо было делать ставку, что в сегодняшних реалиях отображение картинок с фотохостингов то нынче не у всех работает и лучше скрины прикреплять во вложение, чтобы всем было 100% видно

Цитата
sokol92  написал:
Про настройки форматов см., например, здесь,
хорошая ссылка, там и выставляется формат даты с днём недели "dddd dd.MM.yyyy" или "ddd dd.MM.yyyy", который ломает работу DateValue, и каждый может опробовать это на себе на практике
Изменено: KUDRIN - 14.01.2026 15:57:27
 
Еще вариант.
Код
Sub test111()
Dim a As String, b As Boolean, c As Date
a = FileDateTime("C:\Windows\notepad.exe")

If Len(a) = 0 Then Exit Sub
Dim ya As Long, yb As Long, ch As String
Dim arr As Variant
ReDim arr(1 To Len(a))
For ya = 1 To UBound(arr)
    ch = Mid(a, ya, 1)
    If IsNumeric(ch) Or ch = " " Or ch = ":" Or ch = "." Then
        yb = yb + 1
        arr(yb) = ch
    End If
Next
a = Join(arr, "")
a = Trim(a)

Debug.Print a
b = IsDate(a)
c = DateValue(a)
End Sub
 
МатросНаЗебре, а зачем вот это вот все в принципе? Переменная а уже является датой и временем. Если уж захочется получить все не через int - есть же другие функции, куда более стабильно работающие вне зависимости от локализации и форматов:
Код
Sub test()
Dim a As Date, b As Boolean, c As Date, ct As Date
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = DateSerial(Year(a), Month(a), Day(a))
ct = TimeSerial(Hour(a), Minute(a), Second(a))
End Sub

другой вопрос, если мы берем не FileDateTime, а какой-то текст, который может представлять дату. Но это уже совсем другая история и решить её одним кодом без вводных данных точно не получится.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
а зачем вот это вот все в принципе? Переменная а уже является датой и временем.
Меня смутило, что в этой строке был день недели "Ср 12.06.24 9:42:15". Предположил, что эту часть обрабатывает не правильно.
У меня ошибка не воспроизводится, делал без тестирования в условиях, которые описал ТС.
 
Цитата
МатросНаЗебре написал:
Еще вариант.
работает, если перед дебагпринтом добавить строку :
Код
a = Replace(a, ".", "/") 
---
Цитата
Дмитрий(The_Prist) Щербаков написал:
c = DateSerial(Year(a), Month(a), Day(a))
причём оба кода выдают день недели в своём результате, а не просто день месяц год
Код
#Ср 15.12.2021#
Изменено: KUDRIN - 14.01.2026 17:07:12
 
Цитата
KUDRIN написал:
этот код сохраняет день недели в своём результате
да, потому что так установлено региональными настройками локали. И это нормально. Но с этой переменной можно спокойно работать как с датой. Впрочем, как и с переменной a.
Даже больше можно сказать - попробуйте такой код:
Код
a = Date

Есть подозрение, что и там будет фигурировать день недели, ибо...см. выше - локаль.
Как Вы писали выше - вопрос "зачем" это все надо не рассматривается, поэтому его не задаем и варианты предлагаем из своих додумок.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:09:23
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
a = Date
Есть подозрение, что и там будет фигурировать день недели,
вот результат работы этого кода:
Код
#Ср 14.01.2026#
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
есть же другие функции, куда более стабильно работающие вне зависимости от локализации и форматов:
Код
c = DateSerial(Year(a), Month(a), Day(a))
Код
a = DateValue("24/11/21")
оба кода выдают  #Ср 14.01.2026#


наверное в таком случае более стабильным вывод будет с такой текстовой, а не датированной пред-обработкой
(для вывода в ячейку или в дальнейшую обработку)
Код
Sub test()
a = FileDateTime("C:\Windows\notepad.exe")
b = IsDate(a)
c = Day(a) & "/" & Month(a) & "/" & Year(a)
d = Hour(a) & ":" & Minute(a) & ":" & Second(a)
End Sub
Изменено: KUDRIN - 14.01.2026 17:36:55
 
Это ожидаемо, я так и написал. У Вас все даты будут так отображаться. Почему? См.выше :)
Ну а так - у меня-то был один-единственный не раскрытый вопрос: почему именно не стабильная DateValue, которая сильно зависит от локали. На него ответ по сути получен следующий: потому что. Более стабильные варианты преобразований почему-то не воспринимаются. Почему? Никто не знает, а Вы не говорите. А понимать тот факт, что любая дата будет отображаться при переводе в текст "как есть" именно как она в локали - Вы почему-то тоже не хотите.
А значит дальше обсуждать в итоге нечего(лично для меня) - проблема определена, решения по работе именно через DateValue искать Вам, т.к. это будут решения под каждый вид настроек даты на ПК.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:37:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
KUDRIN написал:
вывод будет с такой текстовой
Вы серьезно? Т.е. Вы рассказываете, что нужна именно DateValue, которая если и преобразует текст в дату - выглядеть она будет точно так же - с днем недели(ибо локаль). Однако потом все это выводите в текст. Вы уверены, что для Вас не имеет значения ответ на вопрос - зачем это все? У меня другой вопрос назрел: Вы точно понимаете, что то, что Вы выводите в Immediate - это просто текстовый вид даты? Но от этого сама переменная не перестает быть датой и с ней можно работать как с датой без всяких конвертаций? И есть специальные функции, переводящие правильные даты в любой нужный формат. Та же Format:
Код
c = Format("dd/MM/yyyy")

и никаких там Day и прочих выдумок.
Нет, я еще понимал Вас, когда надо было отсечь время. Но это...Это уже где-то за гранью моего понимания без ответов на очевидные вопросы.
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 17:44:40
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
почему именно не стабильная DateValue
потому что простая, короткая, без лишних слов, и сестра к TimeValue

Цитата
Дмитрий(The_Prist) Щербаков написал:
Более стабильные варианты преобразований почему-то не воспринимаются.
например какой код в этом треде выдаст стабильно дату #14/01/2026#? или #14.01.2026# ? без дня недели (на ПК, где стоит формат даты с днём недели)

Цитата
Дмитрий(The_Prist) Щербаков написал:
А вот Int - это куда ближе при работе с датами, чем DateValue, т.к. любая дата это в первую очередь число и как раз такие методы куда быстрее и корректнее обработают даты.
Код
a = FileDateTime("C:\Windows\notepad.exe")
c = Int(a)
этот код через число тоже выдаёт среду #Ср 14.01.2026#

Цитата
Дмитрий(The_Prist) Щербаков написал:
почему-то не воспринимаются.
был же ответ - сначала искалась причина.
теперь же, когда причина ясна - остаётся дело за малым - топорно преобразовать дату в текст перед выводом. т.к. любой вывод или обработка именно даты - выдаст день недели, что как оказывается не всегда съедается самими же родными экселевскими функциями
Изменено: KUDRIN - 14.01.2026 18:09:33
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
И есть специальные функции, переводящие правильные даты в любой нужный формат. Та же
Код
c = Format("14/01/2026")
тоже выдаёт "Ср 14.01.2026", но уже в виде строки а не даты
Изменено: KUDRIN - 14.01.2026 18:01:32
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Вы серьезно? Т.е. Вы рассказываете, что нужна именно DateValue, которая если и преобразует текст в дату - выглядеть она будет точно так же - с днем недели(ибо локаль)
после того как узналась причина ошибки мною был написан уж точно стабильный вариант выгрузки даты в ячейку
что не так? чем текстовая "14/01/26" ЗНАЧИТЕЛЬНО хуже датированной "#среда 14/01/2026 по лунному календарю#" ?

кто даст гарантию, что на каком-то ПК не установлен такой формат даты? "ddd dd.MM.yyyy yyyy"

и что это никоим образом не повлияет на сотню различных возможных функций-преобразований вида (дата-число-строка) ? как например повлияло на DateValue, да даже банальная CStr(Date) выдаст тоже "среду", которая полетит дальше по коду пытаться обрабатываться как неожиданная фиктивная числовая дата
или вообще поедет в ячейку к бухгалтеру тёте Глаше, а потом они будут всем отделом гадать а откуда у них там взялась среда или два года подряд в ячейке с датой, ведь в коде у умного дяди погромиста было всё по науке, обработка только формата даты, и никаких тебе убогих стрингов

я лишь дал один из вариантов обработки, никого к нему не призываю
спорить про чей-то ЛИЧНЫЙ уровень понимания типов данных и прочие далёкие от конкретного кода филосовские штуки - это не ко мне
Изменено: KUDRIN - 14.01.2026 18:31:48
 
Цитата
KUDRIN написал:
например какой код в этом треде выдаст стабильно дату #14/01/2026#? или #14.01.2026# ? без дня недели
никакой. И ни один из Ваших, без перевода в текст. Только это уже будет не дата "#14/01/2026#", а текст "14/01/2026". И это разные вещи. Как раз решетки в Watches указывают на то, что в переменной храниться тип даты. Я уже писал, что DateValue при этом тоже вернет дату с днем недели, т.к. это задано региональными настройками. А DateValue возвращает НЕ ТЕКСТ, а ДАТУ. Вы просто почему-то этого не хотите слышать, видеть, воспринимать.
Вы вообще можете прямо в коде записать:
Код
a = #14/01/2026#

а потом сразу же в Watches обнаружите, что туда день недели добавился откуда-то :)
И считаете, что понимание типов данных здесь не при чем. Ну да ладно, Ваше дело.
Цитата
KUDRIN написал:
чем текстовая "14/01/26" ЗНАЧИТЕЛЬНО хуже датированной "#среда 14/01/2026 по лунному календарю#"
не знаю. Это Вы хотите именно через DateValue получать дальше текст, а не я. Я изначально задавал вопрос - зачем эти танцы с бубном через не самую стабильную функцию.
Цитата
KUDRIN написал:
c = Format("14/01/2026")
тоже выдаёт "Ср 14.01.2026", но уже в виде строки а не даты
ну это логично. Потому что слеш имеет вполне себе служебное значение - он является неким обозначением регионального разделителя дат, независимо от разделителя в системе. Хотя не очень понял смысл приведенной записи - там ничего не форматируется, а текст "14/01/2026" на лету внутри Format конвертируется в дату и ему не назначается никакой формат :) Ну или чего-то в строке не хватает(либо формата, либо самой даты).
А если записать так:
Код
Format("14/01/2026","dd.MM.yyyy")

то получите вполне ожидаемое: "14.01.2026"
Еще можете попробовать так:
Код
Format(date,"dd\/MM\/yyyy")

или так(если лень разбираться со служебными символами:
Код
Replace(Format$(Date, "dd.MM.yyyy"),".","/")

в этих вариантах день недели должен отсутствовать, если его явно не указать в строке формата:
Код
Replace(Format$(Date, "ddd dd.MM.yyyy"),".","/")

Цитата
KUDRIN написал:
я лишь дал один из вариантов обработки
обработки чего? Это тоже не мешает указать, т.к. пока что Вы просто показали, как объединить в текст год, месяц и день(ну и часы с минутами). А для чего это все? В чем смысл таких манипуляций - пока никому не известно. А следовательно бесполезно для всех, кроме вас, по своей сути.
Я вообще не понимаю зачем переводить в текст реальные даты для дальнейшей работы с ними. Обычно наоборот все пытаются сделать...

P.S. Что это за функции такие в Excel, которые с датами отказываются работать? Может они не должны с датами работать, а с текстом?
Изменено: Дмитрий(The_Prist) Щербаков - 14.01.2026 18:32:35
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1 2 След.
Читают тему
Наверх