Проблема с функцией CDate в VBA

Я использую CDate для преобразования определенной даты, отформатированной как строка, в тип даты Excel. Я написал небольшой UDF для этого преобразования; однако, когда я запускаю функцию как функцию в ячейке, она возвращает число, а формат по умолчанию для вызывающих ячеек устанавливается на тип номера. Когда я вручную преобразую его в тип даты, Excel отобразит правильную запись даты.

Итак, мне нужно знать, есть ли способ установить формат по умолчанию для вызывающей ячейки для типа Date через мой макрос преобразования даты. В противном случае пользователь должен вручную изменить формат каждой ячейки.

например

Function Test() Test = CDate("2010/12/23") End Function 

Вызывающая ячейка открывается через Application.ThisCell однако вам придется вручную форматировать до / после вызова, поскольку Excel UDF не может изменить физическую характеристику ячейки.

Возможно, вы можете запустить что-то после ввода ячеек?

 Dim c As range For Each c In ActiveSheet.UsedRange.Cells ''Case sensitive If c.Formula = "=test()" Then c.NumberFormat = "d/mm/yyy" End If Next 

Похоже, что вы хотите сделать на самом деле процесс из двух частей: преобразовать значение в ячейку (или диапазон ячеек) в дату и затем отобразить ее как дату, а не просто преобразовать текстовое значение, которое выглядит как дата до значения даты.

Если это так, то я бы рекомендовал модифицировать предложение Remou так, как это (использование UsedRange может быть проблематичным на листах, содержащих большие объемы данных):

 Dim c As Range For Each c In Selection.Cells c.Value = CDate(c.Value) c.NumberFormat = "m/d/yyyy" Next c 

Затем пользователю нужно будет выбрать ячейки, к которым должно применяться форматирование, и запустить макрос; это звучит так, как будто вы этого не хотите, но я не уверен, что это возможно.

В зависимости от того, как вы хотите использовать макрос, вы можете добавить дополнительные проверки: например, вы можете применить форматирование только к c.Value <> "" and c.NumberFormat = "@" ячейкам, которые в настоящее время отформатированы как текст ( c.Value <> "" and c.NumberFormat = "@" ).

Если вы вернете данные в виде строки и в формате, который Excel автоматически преобразует в дату, вы можете заставить ячейку правильно отформатировать.

 Function Test() As String Test = Format(DateValue("2010/12/23"), "mm/dd/yyyy") End Function 

Это работает в US Excel, но если вам нужно, чтобы он был агностиком языка, я думаю, что у вас будут проблемы.

  • Почему функция UDF не появляется при наборе текста в ячейке в Excel VBA?
  • Как использовать постоянные значения в Excel UDF?
  • Удалите слова, которые содержат друг друга, и оставьте длинный
  • Как создать определенные пользователем формулы вместо ввода длинных строк
  • Многоканальная ссылка VBA UDF
  • excel передать содержимое ячейки в udf как аргумент диапазона
  • Функция непрерывной суммы
  • Interesting Posts

    Как добавить только элемент из списка, если элемент в другом списке не равен 0, сохраняя один и тот же индекс?

    Применить условие IF к диапазону Excel VBA

    Используйте INDEX / MATCH, чтобы выбрать формулу, написанную как строку, и включить ее?

    Как убедиться, что из Excel открыт какой-либо документ Word или нет?

    Чтение данных даты в Excel в R

    VBA Copy Вставить строку поиска

    Excel VBA для поиска строки в приложении Outlook, пометить электронную почту, если совпадение найдено

    Как я могу достичь этого настраиваемого формата ленты ленты в Excel с помощью xml

    Прочитать xlsx, хранящийся в местоположении sharepoint, с помощью openpyxl в python?

    Отчеты с SQL Server с использованием Excel

    VB.net Более быстрый способ создания папок, подпапок и файлов Excel в этих папках

    Проблема с датой условного форматирования + другие условия

    читать файл Excel, встроенный в веб-сайт

    tomcat / CGI и python3 не могут использовать win32com для открытия файла Excel

    Петля внутри цикла в цикле

    Давайте будем гением компьютера.