Как заставить Excel распознавать даты без ручного поиска и замены "/" на "/"? - PullRequest
0 голосов
/ 29 мая 2019

Как заставить Excel распознавать метки времени как метки времени, а не как строки?

Если я выполняю поиск и замену на "/" на "/", это исправляет это в большинстве файлов:

Cells.Replace What:="/", Replacement:="/", LookAt:=xlPart, SearchOrder :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

У меня есть кусок кода, который проверяет, находится ли он по-прежнему в неправильном формате, путем преобразования в формат «запятая» и проверки, содержит ли ячейка какие-либо символы «/», а затем разрывает строку, которая срабатывает в этом случае, чтобы предупредить менячто мне нужно вручную найти и заменить этот файл.Если я остановлю макрос при сбое и запустлю его вручную (Crtl + h, Enter), то он заработает, и я смогу перезапустить макрос для завершения стандартизации.Мне нужен способ автоматизации этого.

У меня> 2000 .csv файлов похожего, но не идентичного формата.Каждая из них содержит ~ 350 переменных, каждая со своей меткой времени и столбцом данных.Я написал код, который форматирует его в пригодный для использования формат.Исходный csv имеет временные метки в формате «ДД / ММ / ГГГГ чч: мм: сс», как на моем компьютере и в Excel по умолчанию.

Excel, по-видимому, случайным образом решает, что не может распознавать около четверти временных меток файлов, и вместо этого интерпретирует их как строки.Это можно исправить, щелкнув по ячейке, а затем щелкнув по ячейке, а затем Excel распознает ее как метку времени.Мне нужны распознанные временные метки, чтобы я мог интерполировать значения в стандартную частоту дискретизации, так как Excel не может интерполировать, используя значения, которые он интерпретирует как строки.

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

Я пытался использовать SendKeys.Кажется, проблема в том, что он открывает диалог поиска и замены для редактора сценариев VBA, а не для таблицы Excel.Ранее я пытался сместить фокус, вызывая:

Windows(windowname).Activate
ActiveWorkbook.Application.SendKeys("^h")

Я также пытался:

Windows(windowname).Application.SendKeys("^h")

Что приводит к вызову функции поиска и замены в редакторе сценариев VBA.

У меня нет ярлыка для запуска макроса.

Я пробовал Matlab, но он не может работать с заголовком файла или столбцами, заполненными текстом.Я хотел бы сохранить все данные.

Я использовал Макро-рекордер, чтобы записать, как я выполняю поиск и замену, что приводит к:

Sub Fixer()
'
' Fixer Macro
'

'
    Selection.Replace What:="/", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

Но это не работает, когдавы запускаете его в том же файле.

Я ожидаю, что он преобразует формат строки "ДД / ММ / ГГГГ чч: мм: сс" в формат даты и времени, который затем я могу преобразовать в десятичный формат, который язатем можно использовать для интерполяции значений в пригодный для использования формат.Вместо этого я не получаю сообщения об ошибке, и ничего не происходит.

Пример строки временных меток даты из необработанного CSV: «31/03/2019 14: 55: 57,1.0000000149,31 / 03/2019 14:55: 57,14.6,31 / 03/2019 14: 55: 57,57.86,31 / 03/2019 14: 55: 57,0.175000000000068 "

Таким образом, отметка времени" 31.03.2009 14:55: 57 "Я хочу преобразовать в" 43555.62218750000 "

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вам необходимо выполнить резервное копирование шага.

Ваша проблема является общей и вызвана OPEN использованием csv файла, в котором формат даты (DMY) в данном случаенаходится в другом формате, чем ваши региональные настройки Windows на вашем компьютере.

Таким образом, даже входные данные, которые, по-видимому, будут преобразованы правильно, не будут совпадать с тем, как день и месяц будут заменены на ожидаемые значения.

Возможно, «лучшее» исправление для этой проблемы, при условии, чтоВы не можете изменить файл csv, вместо него будет ИМПОРТ .

В зависимости от того, как вы выполняете ИМПОРТ , и это зависит от версии Excel,у вас будет возможность во время импорта определить формат даты входящих данных, чтобы они были правильно преобразованы в Excel.

В Power Query вы можете указать, чтобы PQ сделатьпреобразование даты в соответствии с указанным языком.В более ранних версиях Excel открывался мастер преобразования текста в столбцы, позволяющий указать DMY для формата файла CSV.Я бы предложил использовать PQ, так как он легко обрабатывает часть времени, тогда как в старом мастере вам нужно разделить два, а затем сложить их вместе.

0 голосов
/ 29 мая 2019

Сначала импортируйте поле даты / времени в Excel как Текст . В моем демонстрационном случае я использую столбец A . Затем запустите:

Sub TextToValue()
    Dim Kolumn As String, N As Long, i As Long
    Dim d As Double, dt As Date, tm As Date
    Dim v As Variant

    Kolumn = "A"
    N = Cells(Rows.Count, Kolumn).End(xlUp).Row

    For i = 1 To N
        v = Cells(i, Kolumn).Text
        If InStr(1, v, "/") > 0 Then
            arr = Split(v, " ")
            brr = Split(arr(0), "/")
            dt = DateSerial(brr(2), brr(1), brr(0))
            tm = TimeValue(arr(1))
            d = CDbl(dt + tm)
            Cells(i, Kolumn).Clear
            Cells(i, Kolumn).Value = d
        End If
    Next i
End Sub

До:

enter image description here

И после:

enter image description here

...