這是非常令人沮喪的,對我來說沒有意義。格式化日期和地區設置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