Text-To-Columns в макросе конвертирует 24 раза в 12h формат - PullRequest
2 голосов
/ 14 января 2020

Я создал макрос, который выполняет функцию Text-To-Columns (делит дату и время, хранящиеся в одном столбце, на два других столбца, один для даты и один для времени).

Однако, когда я выполняю Эта функция непосредственно в Excel, я получаю желаемый вывод: дата + время в 24-часовом формате, но когда я запускаю точно такую ​​же процедуру, записанную как макрос, вывод: дата + время в 12-часовом формате. Дополнительный третий столбец создается с отметкой AM / PM. Макрос работает для нескольких ячеек правильно, но для немногих - нет.

Исходный файл:

'original data'

Вывод без макроса (вот как мне нужно вывод с макросом):

'without macro'

вывод с макросом:

imageWith macro">

Подскажите, пожалуйста, как решить эту проблему?

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
                        Semicolon:=True, Comma:=False, Space:=True, Other:=False, FieldInfo:= _
                        Array(Array(1, 4), Array(2, 1)), TrailingMinusNumbers:=True

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Похоже, что известная проблема уже возникла на форуме Microsoft . Во всяком случае, переключение с DataType:=xlDelimited на DataType:=xlFixedWidth, кажется, помогает:

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
                TrailingMinusNumbers:=True

Результат:

enter image description here

0 голосов
/ 14 января 2020

Мне кажется, что ваши Windows Региональные настройки - MDY, а файл CSV отформатирован как DMY.

Что происходит:

  • Даты, когда D <= 12 интерпретируются как реальные даты (хотя <strong>неправильно ), а при записи в ячейку переводятся в реальные даты в формате m/dd/yyyy h:mm AM/PM
  • Даты, в которых D > 12 интерпретируются как строки, и к ним не добавляется AM/PM.

Когда вы делаете TTC, у «реальных дат» есть два пробела, поэтому AM/PM в третий столбец. «Строки» имеют только один пробел, поэтому разбивайтесь по мере их показа.

Даты, которые интерпретируются как даты, вероятно, интерпретируются неправильно. Другими словами, ваш 1-10-2019 воспринимается Excel как Jan 10, 2019, тогда как он должен быть 1-Oct-2019.

Помимо сложной подпрограммы VBA, Fix для этой проблемы заключается в правильном Импортируйте данные, чтобы даты правильно интерпретировались до того, как они попадут на лист.

Это можно сделать либо с помощью мастера импорта Legacy, либо с помощью Power Query.

Используя либо Во-первых, вы можете разделить пространство и указать, что даты равны DMY, а затем отформатировать дату и время, как бы вы ни были sh.

0 голосов
/ 14 января 2020

Я думаю, что это ошибка записи макроса. Попробуйте этот код:

Sub ExtractTime()
'
' Extract time from date
'

'
    Dim Target As Range
    For Each Target In Selection
        If IsDate(Target) Then
            Target.Offset(0, 1).Value = Target.Value - Int(Target.Value)
            Target.Offset(0, 1).NumberFormat = "HH:MM:SS"
            Target.Value = Int(Target.Value)
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...