Проходя через SO избранную публикацию VBA, проблема форматирования даты Я думаю, что проблему нельзя просто отмахнуться, сказав проблему форматирования.На моем рабочем месте мы живем с подобным типом проблем в течение последних 12/13 лет.Однако мы работали с грубым обходным подходом.Но фундаментальная проблема все еще остается в силе.
Поскольку реальные данные, которые мы обрабатываем, носят технический характер и не подлежат разглашению, они содержат более 6000 строк и 50 столбцов.Также актуальная обработка данных вследствие импорта данных состоит из страниц кодирования VBA.Я воспроизвел проблему только с небольшими ложными данными.
Когда текстовый файл с разделителями табуляции был импортирован вручную, даты в одном столбце (также состоят из пустых чисел и текстов в одном столбце) импортируются в обычном формате даты («дд / мм / гггг»),Макрос также записывался во время ручной операции
Но когда ту же задачу выполняли через VBA.
Даты со значением дня более 12 отображаются в виде текста.
В качестве типа даты указываются даты со значением дня меньше 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 ?
- Для удовлетворения, кодирование было заменено и опробовано с записанным макросом
- Макрос VBA протестирован для нескольких вариантов с источником файла: = xlMSDOS, Xl Windows, 437 и т. Д.
- Региональная настройка всехмашины этого конкретного отдела имеют только один и тот же формат даты «дд / мм / гггг».
- Поскольку это устаревший процесс, коды макросов / VBA проверяются только в Office 2007 и старых версиях.
- Обычно все форматы сохраняются Общие.
Теперь старый метод обхода, который мы все еще работаем, изменен для выборочных данных
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)
Появляются даты со значением дня более 12s остается текстовым типом в столбце 5.
Даты со значением дня меньше 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](https://i.stack.imgur.com/6OwAm.jpg)
ЭтоСтрого ради академического интереса я сменил отдел, люди довольны старой работой и никто не хочет возиться со старым кодом.Но моя догадка, что решение должно быть очень простой однострочной настройкой и заставило нас произнести: «О, как мы могли пропустить эту глупую вещь в течение многих лет».
Edit2: Был проведен еще небольшой эксперименткак Cells.text работает с различными датами и региональными настройками («DMY» и «MDY»).Несколько образцов дат вводятся в файл Excel и выполняется простой цикл для помещения текста ячеек столбца B в столбец D.
Я пришел к выводу, что независимо от региональных настроек VBACells.Text интерпретирует дату в формате США (mdy) .Когда то же самое помещается в другую ячейку (в случае, если региональные настройки равны «DMY», а месяц и дата могут быть взаимозаменяемыми, т.е. дата <13), они взаимозаменяются.Я все еще приветствую любое другое лучшее понимание в предмете. </p>