Excel VBA - преобразовать текст в дату?

У меня есть столбец дат (столбец A), который хранится как текст в формате yyyy-mm-dd, который я пытаюсь преобразовать в даты, в конечном счете, чтобы я мог выполнять поиск по ним.

Я прочитал несколько тем и попробовал некоторые из предложений, но я не могу заставить работать. Один использовал:

Columns("A").Select
Selection.NumberFormat = "date"

Это изменило формат ячеек на сегодняшний день, но фактически не изменило формат значения, которое все еще сохранялось как текст.

Я понимаю, что мне нужно использовать CDate() для изменения формата значения из текста на сегодняшний день. Я пробовал что-то вроде этого:

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = CDate(c.Value)
Next c

Который дает мне ошибку несоответствия типа. Я задавался вопросом, было ли это потому, что я пытался сохранить значения даты обратно в ячейку, не связанную с датой, поэтому я попытался объединить ее с .NumberFormat = "date" выше, и это тоже не сработало.

Любые предложения будут оценены.

Ответы

Ответ 1

Вы можете быстро преобразовать столбец текста, который напоминает даты в фактические даты, с эквивалентом VBA рабочей таблицы Data ► Text-to-Columns.

With ActiveSheet.UsedRange.Columns("A").Cells
    .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
    .NumberFormat = "yyyy-mm-dd"   'change to any date-based number format you prefer the cells to display
End With

Массовые операции, как правило, намного быстрее, чем переходы по ячейкам, а метод VBA Range.TextToColumns - это очень быстро. Это также позволяет вам установить маску преобразования MDY или DMY или YMD, которая наносит урон многим текстовым импортам, где формат даты не соответствует региональным настройкам системы. См. свойство TextFileColumnDataTypes для получения полного списка доступных доступных форматов даты.

Предостережение: будьте осторожны при импорте текста, что некоторые даты еще не были преобразованы. Текстовая дата с двусмысленными целыми числами месяца и дня может быть неверно преобразована; например 07/11/2015, возможно, были интерпретированы как 07-Nov-2015 или 11-Jul-2015 в зависимости от региональных настроек системы. В таких случаях откажитесь от импорта и верните текст с помощью данных ► Получить внешние данные ► Из текста и укажите маска преобразования даты в мастере импорта текста. В VBA используйте метод Workbooks.OpenText и укажите xlColumnDataType.

Ответ 2

Вы можете использовать DateValue для преобразования вашей строки в дату в этом экземпляре

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = DateValue(c.Value)
Next c

Он может преобразовать строку формата yyyy-mm-dd непосредственно в значение даты в формате Excel.

Ответ 3

Помимо других параметров, я подтверждаю, что используя

c.Value = CDate(c.Value)

работает (только что протестировано с описанием вашего дела, с Excel 2010). Что касается причин возникновения ошибки несоответствия типа, вы можете проверить (например, это.

Это может быть проблема локали.

Ответ 4

Может быть:

Sub dateCNV()
    Dim N As Long, r As Range, s As String
    N = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To N
        Set r = Cells(i, "A")
        s = r.Text
        r.Clear
        r.Value = DateSerial(Left(s, 4), Mid(s, 6, 2), Right(s, 2))
    Next i
End Sub

Это предполагает, что столбец A содержит текстовые значения, такие как 2013-12-25, без ячейки заголовка.

Ответ 5

Этот код работает для меня

Dim N As Long, r As Range
N = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To N
    Set r = Cells(i, "B")
    r.Value = CDate(r.Value)
Next i

Попробуйте изменить столбцы в соответствии с вашим листом

Ответ 6

К OP... Я также получил ошибку несоответствия типа при первом запуске вашей подпрограммы. В моем случае это было причиной данных, не относящихся к дате, в первой ячейке (т.е. Заголовке). Когда я изменил содержимое ячейки заголовка в txt для тестирования даты, он просто отлично...

Надеюсь, что это тоже поможет.

Ответ 7

Взрыв из прошлого, но я думаю, что нашел легкий ответ на это. Следующие работали для меня. Я думаю, что это эквивалентно выбору ячейки, наживающей F2, а затем нажатию enter, что делает Excel распознавать текст как дату.

Columns("A").Select
Selection.Value = Selection.Value

Ответ 8

Я избавился от несоответствия типов, выполнив следующий код:

Sub ConvertToDate()

Dim r As Range
Dim setdate As Range

'in my case I have a header and no blank cells in used range,
'starting from 2nd row, 1st column
Set setdate = Range(Cells(2, 1), Cells(2, 1).End(xlDown)) 

    With setdate
        .NumberFormat = "dd.mm.yyyy" 'I have the data in format "dd.mm.yy"
        .Value = .Value
    End With

    For Each r In setdate
        r.Value = CDate(r.Value)
    Next r

End Sub

Но в моем конкретном случае у меня есть данные в формате "dd.mm.yy"

Ответ 9

Для DD- MM -YYYY это простой способ обхода строк и дат:

вставить дату в строку через DD- MMM -YYYY например, 01-11-2017 → 01-Nov-2017

U может использовать FORMAT (date, "dd- mmm -yyyy" ) для ввода дат в строку из листа распространения.

Позже, когда вы выведете его из строки, , он не будет путать дни и месяцы.