这是非常令人沮丧的,对我来说没有意义。格式化日期和地区设置Excel VBA
这是在Excel 2010中
我录的宏来格式化一些数据,包含日期(日/月/年)。我导入它,Excel将它视为文本。所以我使用我记录的“text to date”宏,存储到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将它视为日期,因为它是右对齐的。如果我将它转换为“数字”,我会像预期的那样看到底层序列。所以人们会认为这很好。但它真的不是:
如果我再次运行宏(我会,因为更多的数据将被添加到它后面,所以我需要确保新引入的数据在这些底部将被正确格式为好),我得到这个:
所以基本上是从DD/MM/YYYY(它应该是)以MM/DD/YYYY(这是错误的)改变的格式。如果我在该数据集上再次运行该宏,它将切换回DD/MM/YYYY。但最坏的事情是,如果我手动做同样的事情(例如,而不是运行宏,我手动去“数据”,“文本到列”,并选择相同的选项),然后它不会不会改变。如果日期被格式化为DD/MM/YYYY,则它保持这种方式,并且如果它被格式化为MM/DD/YYYY(由于这个愚蠢的怪癖),那么它也保持这种方式。我重复一遍就足够了(甚至重新录制了这个宏几次),以确定我做了完全相同的事情。
我知道这是由于区域设置,但该文件不会始终在我的计算机上使用,而且我也无法确保最终用户将具有任何特定的区域设置。我基本上需要这个文件是区域设置独立的。
我的问题是:如何确保这些日期为:
- 格式化&用Excel公认日期的用户的本地区域设置
- 独立的?
我知道我可以要么中介导入步骤(和格式存在的数据,在主文件代替),然后或者使已经应用在宏只新导入的数据调整代码....但后来我觉得它不可靠,因为我怎么知道Excel不会搞乱格式呢?
哦,因为宏是一个有点神秘看VBA:
我去的数据,文本列,选择“分隔符号”(没关系,因为我并不实际拆分成多列),然后将“Delimiters”作为默认值(无关紧要,实际上我没有将文本拆分为列),然后选择“日期”,然后在下拉菜单中选择“DYM”,以显示DD/MM/YYYY编辑:请罗恩罗森菲尔德的答案详见全文。对于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 2014-10-28 04:19:52
你真的只需要两件事:日期作为DateSerial和一个与当前语言环境设置无关的自定义数字格式。我相信你已经拥有了前者。后者是通过明确选择区域来实现的,例如,英语为[[-409美元]日/月/年]。方括号中的数字是要使用的十六进制LCID。 – IInspectable 2014-10-28 09:10:58