2012-03-08 51 views
5

我以編程方式打開.csv文件時出現了一些問題。該文件是日常數據的時間序列,其中幾個數據點與每個日期相關聯。當文件以編程方式打開時,Excel VBA日期格式/值會發生變化

當我手動打開文件時,日期正確打開,日期格式爲dd/mm/yyyy。但是,當我以編程方式打開文件時,直到每月12號的日期打開爲mm/dd/yyyy,雖然格式仍爲dd/mm/yyyy(例如,1983年7月1日(1983年1月7日))將作爲第7 1983年1月(1983年1月1日) - 這不僅僅是一個格式問題,與這些日期相關的朱利安日期(自1901年1月1日以來的天數)也發生了變化),並且每月12日之後的日期被正確打開,儘管作爲文本而不是日期。

作爲文本輸入的數據不是問題,但是,一旦文件打開就更改日期是有問題的。我可以嘗試將整個.csv文件導入爲以逗號分隔的文本,而不是實際打開文件,但是,如果我可以在打開文件時停止更改日期,它會更容易,更快速。

過去有沒有人有類似的問題?任何意見,將不勝感激。
乾杯,本。

Flder = InputBox("Copy and Paste Folder path here:") 

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set SourcePath = FSO.GetFolder(Flder) 

For Each File In SourcePath.Files   
    Workbooks.Open (File) 

    FlNm = File.Name 

    StrtCol = Workbooks(FlNm).Worksheets(1).Range(Cells(4, 1), Cells(4, 30)).Find ("Mean").Column 

    Workbooks(FlNm).Worksheets(1).Range(Cells(1, 1), Cells(60000, 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("A3")) 
    Workbooks(FlNm).Worksheets(1).Range(Cells(1, StrtCol), Cells(60000, StrtCol + 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("B3")) 

    Workbooks(FlNm).Close 
Next 

該問題似乎發生在Workbooks.Open(File)行。對不起,不要把它扔到一開始。

+0

你能定義「以編程方式打開」嗎?你的意思是通過Excel自動化嗎?還是直接在VBA代碼中? 「打開文件」無法改變任何內容;這是另一回事,但你在你的問題中沒有發佈任何與此相關的內容。打開一個.csv文件不會做任何事情來改變它本身的內容(例如,在記事本中);張貼一些代碼或其他信息,顯示你如何閱讀它,以及你正在閱讀的文字。否則,我懷疑你的問題將被視爲「不是真正的問題」。 :) – 2012-03-08 23:06:08

+0

對不起,肯代碼不清晰,下面的代碼。 – 2012-03-08 23:15:37

+0

肯在這裏肯定。有一個根本原因。在那個時候,記事本中的文件是什麼樣子的,你是如何打開文件的?它是否被拉入模板。粘貼? – datatoo 2012-03-08 23:17:13

回答

0

我可以嘗試導入整個.csv文件爲逗號分隔的文本,而不是實際打開文件,但是,它會更容易和更快,如果我能更改停止的日期,當我打開文件。

它仍然是快,如果你打開它的CDT。您只需使用.OpenText而不是.Open。其餘的代碼保持不變:)

嘗試錄製一個宏,你會看到代碼看起來有點像這樣。

Workbooks.OpenText Filename:= File, _ 
Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ 
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ 
Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _ 
TrailingMinusNumbers:=True 
+0

我的經驗是,如果日期未格式化,我的經驗是OpenText不起作用mdy – user2981639 2014-12-24 23:56:18

+0

不,但您可以強制導入**作爲文本**,操作文本以具有正確的明確格式(最好是ISO,即YYYY-MM -DD)並將CDate應用於此類操縱字符串。 – Ister 2017-10-19 12:11:07

4

既然問題已經由OP的評論回答但不貼作爲一個正式的答案,我會把它放在這裏,以防別人漏掉了像我一樣。

workbook = workbooks.Open(filename, Local:= true) 

通過設置本地=真正使用本地計算機的日期格式,而不是語言環境,如澳大利亞(DMY)假設MDY所以它會改變開放的行爲()

0

我發現user2981639有正確的想法,但我得到了與'本地:真'的語法錯誤所以 我用'本地:=真'相反

這個問題是驅使我瘋了,因爲我也有2個備忘錄字段在CSV文件。 如果我試圖以任何方式格式化日期備忘錄字段將無法正確導入,它們將被截斷爲255個字符或任何嵌入的CRLF字符將根據有多少記錄切成片段。

謝謝你們張貼

+0

謝謝我糾正了我的語法 – user2981639 2014-12-24 23:53:49

0

在這裏,您將看到例如一個工作代碼。這個問題也讓我感到沮喪。我在excel中打開了一個.txt文件,我使用的日期是從dd-mm-yyyy格式轉換爲mm-dd-yyyy格式。下面你看到一個解決方案。它位於最後一個命令(,Local:= True)。見下文。希望能幫助到你。

Note that while trasferring .txt file to excel use File Origin as "xlWindows: 
    Workbooks.OpenText Filename:= _ 
    ThisWorkbook.Worksheets("Reporting").Cells(3, 6), Origin:=xlWindows, _ 
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(49 _ 
    , 1), Array(50, 1), Array(67, 1), Array(80, 1), Array(93, 1), Array(106, 1), Array(119, 1)) _ 
    , DecimalSeparator:=",", ThousandsSeparator:=".", TrailingMinusNumbers:= _ 
    True, Local:=True 

注意:數組和小數點分隔符以上的設置是我的具體工作 - 可能不適用於您。

相關問題