这非常令人沮丧,对我来说没有意义。
这是在 Excel 2010 中。
我录制了一个宏来格式化一些数据,包括日期(DD/MM/YYYY)。我导入它,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 视为 TEXT,因为它是左对齐的(H 列,我确认它实际上是):
然后我运行宏,得到这个(H 列):
您可以看到 Excel 将其视为日期,因为它是右对齐的。如果我将它转换为“数字”,我会看到底层序列,正如预期的那样。所以有人会认为这很好。但实际上并非如此:
如果我再次运行宏(我会,因为稍后会添加更多数据,所以我需要确保这些底部新导入的数据也将正确格式化),我得到这个:
所以基本上它将格式从 DD/MM/YYYY(它应该是)更改为 MM/DD/YYYY(这是错误的)。如果我在该数据集上再次运行该宏,它会切换回 DD/MM/YYYY。
但最糟糕的是,如果我手动执行完全相同的操作(例如,我没有运行宏,而是手动转到“数据”、“文本到列”并选择完全相同的选项),那么它不会改变。如果日期格式为 DD/MM/YYYY,它会保持这种状态,如果它的格式是 MM/DD/YYYY(因为这个愚蠢的怪癖),那么它也会保持这种状态。我重复了很多次(甚至重新录制了几次宏)以确保我做完全相同的事情。
我知道这是因为区域设置,但该文件不会一直在我的计算机上使用,而且我无法确保最终用户将拥有任何特定的区域设置。基本上,我需要这个文件独立于区域设置。
我的问题是:我怎样才能确保这些日期是:
- Excel 格式化并识别为日期
- 独立于用户的本地区域设置?
我知道我可以进行中间导入步骤(并在那里格式化数据,而不是在主文件中),或者然后调整代码,以便只有新导入的数据才应用宏......但后来我觉得不是可靠,因为我怎么知道 Excel 不会弄乱格式?
哦,因为宏在看 VBA 时有点神秘:
我转到数据,文本到列,选择“定界”(没关系,因为我实际上并没有将它分成列),然后默认为“定界符”(再次无关紧要,我实际上并没有拆分文本到列中),然后是“日期”,然后在 DD/MM/YYYY 的下拉列表“DYM”中
编辑:有关详细信息,请参阅 Ron Rosenfield 的回答。为了完整起见,我将运行以下代码来导入数据并在导入时对其进行格式化,而不是先导入然后格式化:
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