Проблема с функцией CDate в VBA - PullRequest
2 голосов
/ 18 июня 2010

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

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

* 1005 например *

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

Ответы [ 4 ]

1 голос
/ 18 июня 2010

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

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
1 голос
/ 18 июня 2010

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

0 голосов
/ 21 апреля 2011

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

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

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

0 голосов
/ 01 июля 2010

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

Если это так, то я бы порекомендовал изменить предложение Рему следующим образом (использование 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 = "@").

...