Данные типа даты изменяются с типа «дд / мм» на тип «мм / дд» при импорте текстового файла с разделителями табуляции в Excel через VBA - PullRequest
0 голосов
/ 11 октября 2018

Проходя через SO избранную публикацию VBA, проблема форматирования даты Я думаю, что проблему нельзя просто отмахнуться, сказав проблему форматирования.На моем рабочем месте мы живем с подобным типом проблем в течение последних 12/13 лет.Однако мы работали с грубым обходным подходом.Но фундаментальная проблема все еще остается в силе.

Поскольку реальные данные, которые мы обрабатываем, носят технический характер и не подлежат разглашению, они содержат более 6000 строк и 50 столбцов.Также актуальная обработка данных вследствие импорта данных состоит из страниц кодирования VBA.Я воспроизвел проблему только с небольшими ложными данными.

Когда текстовый файл с разделителями табуляции был импортирован вручную, даты в одном столбце (также состоят из пустых чисел и текстов в одном столбце) импортируются в обычном формате даты («дд / мм / гггг»),Макрос также записывался во время ручной операции

Но когда ту же задачу выполняли через VBA.

  1. Даты со значением дня более 12 отображаются в виде текста.

  2. В качестве типа даты указываются даты со значением дня меньше 13, но 01/04/2017 (т.е. 1 апреля 2017 г.) изменяется на 04/0! / 2017 (т.е. 4-jan-2017) и т. д.

    Fname = "C:\Users\user\Desktop\SO Sample.TXT"
    
    Workbooks.OpenText Filename:=Fname, Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False, _
        Space:=True, Other:=True, OtherChar:="*", FieldInfo:=Array(Array(1, 1), _
        Array(2, 1), Array(3, 1))
    

Мой первый вопрос В чем заключается ловушка между ручным управлением и кодированием VBA ?

  1. Для удовлетворения, кодирование было заменено и опробовано с записанным макросом
  2. Макрос VBA протестирован для нескольких вариантов с источником файла: = xlMSDOS, Xl Windows, 437 и т. Д.
  3. Региональная настройка всехмашины этого конкретного отдела имеют только один и тот же формат даты «дд / мм / гггг».
  4. Поскольку это устаревший процесс, коды макросов / VBA проверяются только в Office 2007 и старых версиях.
  5. Обычно все форматы сохраняются Общие.

Теперь старый метод обхода, который мы все еще работаем, изменен для выборочных данных

Sub Macro1()
Fname = "C:\Users\user\Desktop\SO Sample.TXT"

    Workbooks.OpenText Filename:=Fname, Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
        ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False, _
        Space:=True, Other:=True, OtherChar:="*", FieldInfo:=Array(Array(1, 1), _
        Array(2, 1), Array(3, 1))

    SrcName = ActiveWorkbook.Name
    Range("A1:C40").Select
    Selection.Copy
    Windows(ThisWorkbook.Name).Activate
    Sheet1.Range("A5").Select
    ActiveSheet.Paste
    Windows(SrcName).Activate
    Range("A1:A1").Select
    Selection.Copy                     ' To release vast clipboard date
    ActiveWorkbook.Close False
    ThisWorkbook.Activate


 For X = 5 To 40
 Xdate = Cells(X, 2).Text
 Cells(X, 5).Value = Xdate
 Ydate = Cells(X, 5).Value
    If IsDate(Xdate) And IsDate(Ydate) Then
    Zdate = CDate(Ydate)
    'If DateDiff("d", Ydate, #1/1/1900#) > 0 Then Zdate = ""     'to filter out numeric data interpreted as date/time
    Else
    Zdate = ""
    End If
 Cells(X, 6).Value = Zdate
 Next

'Next are the sections of processing the data beased on the non empty date values found in column 6.
End Sub

Здесь, когда ячейки (X, 2).Text был помещен в ячейки (X, 5)

  1. Появляются даты со значением дня более 12s остается текстовым типом в столбце 5.

  2. Даты со значением дня меньше 13 отображаются в виде типа даты, но 01/04/2017 (т.е. 1 апреля 2017 года), которые были изменены на04/0! / 2017 (т.е. 4 января 2017 года) в Col 2 Снова меняйте на 01.04.2017 (т.е. 1 апреля 2017 года) в Col 5

сейчасМой второй вопрос: что происходит, когда мы помещаем ячейки (X, 2). Текст в ячейки (X, 5) ? Sample data

ЭтоСтрого ради академического интереса я сменил отдел, люди довольны старой работой и никто не хочет возиться со старым кодом.Но моя догадка, что решение должно быть очень простой однострочной настройкой и заставило нас произнести: «О, как мы могли пропустить эту глупую вещь в течение многих лет».

Edit2: Был проведен еще небольшой эксперименткак Cells.text работает с различными датами и региональными настройками («DMY» и «MDY»).Несколько образцов дат вводятся в файл Excel и выполняется простой цикл для помещения текста ячеек столбца B в столбец D.
The result is Я пришел к выводу, что независимо от региональных настроек VBACells.Text интерпретирует дату в формате США (mdy) .Когда то же самое помещается в другую ячейку (в случае, если региональные настройки равны «DMY», а месяц и дата могут быть взаимозаменяемыми, т.е. дата <13), они взаимозаменяются.Я все еще приветствую любое другое лучшее понимание в предмете. </p>

1 Ответ

0 голосов
/ 11 октября 2018

VBA предполагает региональные настройки США.Если в ваших настройках используется формат dd/mm, добавьте Local:=True к команде Opentext.

Во второй части вы забыли использовать CDate при помещении XDate в ячейку.

...