Это супер разочаровывает, и для меня это не имеет смысла.Форматирование Даты и региональные настройки Excel VBA
Это в Excel 2010.
Я записал макрос для форматирования некоторых данных, содержащий дату (ДД/ММ/ГГГГ). Я импортирую его, Excel видит его как текст. Поэтому я использую макрос «текст на сегодняшний день», который я записал, хранящийся в подменю VBA.
Вот записанный макрос:
Sub DateFormatting()
Sheets("Donnees").Select
Columns("H:H").Select
Selection.TextToColumns Destination:=Range("H1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, OtherChar _
:="/", FieldInfo:=Array(1, 4), TrailingMinusNumbers:=True
End Sub
Когда я импортировать мои данные, на первый у меня есть это. Вы можете видеть, что видел, как текст, Excel, поскольку он выровнен по левому краю (колонка H, и я подтверждаю, что на самом деле):
Затем я запустить макрос, и получить это (колонка H):
Вы можете увидеть Excel рассматривает его как дата, так как она выравнивается по правому краю. Если я преобразую его в «число», я вижу основной сериал, как и ожидалось. Поэтому можно подумать, что все в порядке. Но это действительно не так:
Если я запустил макрос AGAIN (и я бы хотел, потому что позже будет добавлено к нему больше данных, поэтому мне нужно убедиться, что недавно импортированные данные в нижней части будут правильно отформатированы как хорошо), я получаю это:
Так в основном он изменил формат от DD/MM/YYYY (который он должен быть) в MM/DD/YYYY (что неправильно). Если я снова запустил этот макрос в этом наборе данных, он переключится на DD/MM/YYYY.
Но НАСТОЯТЕЛЬНО, что если я ПРОЧИТАЮ ТОЛЬКО то же самое (например, вместо того, чтобы запускать макрос, я вручную перехожу в «Данные», «Текст в столбцы» и выбираю ТОЧНЫЕ одинаковые параметры), тогда он не делает Не меняйте. Если дата отформатирована как DD/MM/YYYY, она остается такой, и если она отформатирована как MM/DD/YYYY (из-за этой глупой причуды), то она остается и в этом случае. Я повторяю это достаточно (и даже повторно записал макрос пару раз), чтобы быть уверенным, что я делаю то же самое.
Я знаю, что это связано с региональными настройками, но файл не всегда будет использоваться на моем компьютере, и я не могу гарантировать, что у конечного пользователя будут какие-либо региональные настройки. Мне нужен этот файл, чтобы быть независимым от региона, в основном.
Мой вопрос: Как я могу убедиться, что эти даты:
- отформатированный & признан сегодняшний день Excel
- Independant локальных региональных настроек пользователей?
Я знаю, что могу либо перейти к промежуточному этапу импорта (и форматировать данные там, а не в основном файле), либо затем настроить код так, чтобы только новые импортированные данные применяли макрос .... Но тогда я чувствую, что это ненадежно, потому что, как я знаю, Excel не испортит формат?
О, потому что макросъемки немного загадочно глядя на VBA:
Я иду к данным, текст к колонке, выберите «разделителями» (не имеет значения, потому что я на самом деле не разделить его на столбцы), то «Разделители» по умолчанию (не имеет значения, опять-таки я фактически не разбиваю текст на столбцы), затем «Дата» и в раскрывающемся списке «DYM» для DD/MM/YYYY
EDIT: Please см. ответ Рона Розенфилда для получения полной информации. Для completedness, вот код, который я буду работать, чтобы импортировать данные & формат оно при ввозе, в отличие от его импорта, а затем форматированием:
Sub importData()
Dim myFile As String
myFile = Sheet5.Cells(2, 5).Value 'My metadata sheet, containing name of file to import
Sheet1.Select 'Setting target sheet as active worksheet
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\ChadTest\" & myFile, _
Destination:=Sheet1.Cells(Sheet5.Cells(2, 1).Value, 1))
.Name = "ExternalData_1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
If Sheet1.Cells(1, 1).Value = "" Then
.TextFileStartRow = 1
Else
.TextFileStartRow = 2
End If
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Sheet1.Select
Application.WindowState = xlMinimized
Application.WindowState = xlNormal
End Sub
Я бы попытался использовать функцию DateSerial в сочетании с циклом «For», чтобы вручную назначать определенные символы из исходных данных в месяц/день/год (используя «Mid», «Right», «Left» ', чтобы найти правильные числа для каждой части). – BobbitWormJoe
Вам действительно нужны только две вещи: дата как DateSerial и формат пользовательского номера, который не соответствует текущим настройкам локали. Я считаю, что у вас уже есть первая. Последнее достигается путем явного выбора локали, например. '[$ -409] dd/mm/yyyy' для английского. Число в квадратных скобках - это шестнадцатеричный LCID для использования. – IInspectable