標題:

excel vba開啟csv檔

發問:

各位大大 : http://www.FunP.Net/440430 我遇到的問題是:二個來源檔, 一為3月31日pos_SALE_HOUR(31032011),CSV, 一為4月1日pos_SALE_HOUR(01042011).CSV 執行時, 在開啟pos_SALE_HOUR.CSV後, D欄為日期, 但3月31的檔案,日及月很清楚沒錯, 但若是4月1日時, 會月日錯置, 要如何解決? PS : 執行時要將來來源檔改為pos_SALE_HOUR.CSV 更新: 准大: 直接開啟匯入檔.csv時, 確實是日/月/年, 但執行footfall.xls的巨集時, 它開啟pos_SALE_HOUR.csv的4月1日檔, 就會變成1月4日?? 更新 2: TO:准提部林 如以下檔案, 執行後, D欄的日期欄位, 會變成2011/1/4號, 轉出檔也是, 但其實是4月1日 http://www.funp.net/30060 TO:沙拉油 依你提供的程式, 可以解決我的問題, 但可否進一步指教, 問題是出在那裏? 為什麼同樣的程式, 匯入檔日期是31/03/2011就沒問題, 但4月1日就出現日月錯置問題了? 因為是初學,所以有些程式語法不太明白,請指教 更新 3: TO:沙拉油 我懂了, 你是用匯入外部資料時,將日期欄位改成DMY,對嗎? 更新 4: TO: Kubi 因為此二檔日期欄位是以日月年方式呈現,用記事本開啟二個csv檔, 你就知道我的問題所在了 感謝各位大大的指教 更新 5: TO:沙拉油 問題是解決了,但有一點想不明白,為什麼3月31日的檔案, 其日期31/03/2011, 我的程式不會出問題, 遇到4月1日的檔案, 其日期1/4/2011就出問題了呢? 所以一定要用匯入外部檔案方式是嗎

最佳解答:

匯入外部資料 Sub Macro1() Dim rs As Long ActiveSheet.UsedRange.Clear With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:\twn\pos_SALE_HOUR.CSV", Destination:=Range("A1")) .AdjustColumnWidth = True .TextFileCommaDelimiter = True .TextFileColumnDataTypes = Array(1, 1, 1, 4, 1, 1) .Refresh BackgroundQuery:=False rs = .ResultRange.Rows.Count .Delete End With Range("H1").Resize(rs, 1).FormulaR1C1 = _ "=IF(ISERROR(VLOOKUP(RC[-5],Sheet2!R1C1:R100C2,2,FALSE)),"""",VLOOKUP(RC[-5],Sheet2!R1C1:R100C2,2,FALSE))" Range("I1").Resize(rs, 1).FormulaR1C1 = _ "=TEXT(RC[-4],""[h]:mm"")" End Sub 2011-04-07 07:09:03 補充: 看來在 ActiveSheet.UsedRange.Clear 上面再加一行 sheet1.activate 會比較保險 2011-04-07 08:49:40 補充: 原來還要輸出成檔案,上述巨集最後再加上底下的程式碼吧! 2011-04-07 08:50:04 補充: Dim OutFileName As String Dim r As Integer, s As String OutFileName = "C:\TWN\SD" + Format(Range("D1"), "ddmmyyyy") + "10.1466" Open OutFileName For Output As #1 For r = 1 To rs s = Format(Range("A" & r), "00") & "," s = s & Format(Range("B" & r), "00") & " " 2011-04-07 08:50:16 補充: s = s & Range("H" & r) & "," s = s & Format(Range("D" & r), "dd/mm/yyyy") & " " & Range("I" & r) & "," s = s & Range("F" & r) Print #1, s Next Close #1 MsgBox OutFileName 2011-04-07 21:18:09 補充: 如果你要知道你的程式碼錯在哪裡?我給你提示好了 問題錯在.................... 第12列的 Workbooks.Open... 少用了一個重要的引數 以及 第35列的 ActiveCell.FormulaR1C1... 寫的公式不適用 輪到你作功課了~~ 2011-04-07 21:22:23 補充: RE: 你是用匯入外部資料時,將日期欄位改成DMY,對嗎? 有作功課,很聰明~恭喜!你答對了~ 2011-04-07 22:48:54 補充: 我上面意見說第12列有問題對吧?! 你在第 13 列寫個 exit sub 直接跳出巨集 然後執行該巨集,再看看日期那一欄變成什麼? 兩個CSV檔都要試喔~ 2011-04-07 22:56:14 補充: 更正! 其實不用寫 exit sub 就可以知道 Workbooks.Open 做了什麼好事了 日期那一欄3月31日會靠左,4月1日會靠右對吧?! 一個是文字格式,另一個是日期格式 2011-04-07 23:06:49 補充: 您必須將 Workbooks.Open 的 local 引數設為 true 這樣 Excel 開啟 csv 檔才不會將 d/m/yyyy 或 dd/mm/yyyy 辨識成日期 不會辨識成日期之後你就又會發現 35 列所寫的公式是擷取固定長度的字串 擷取 d/m/yyyy 時就會不正確 某些國家地區是使用 d/m/yyyy 的日期格式 另外如果日期格式 mm/dd/yyyy 會被辨識成日期 那麼 31/3/2011 就不會是日期,2/4/2011 就會被辨識成 2011年2月4日 Excel 辨識日期是依照您的作業系統「控制台」「地區及語言」裡面的設定 2011-04-07 23:15:49 補充: 如果您將 Workbooks.Open 的 local 引數設為 true Excel 辨識日期是依照您的作業系統「控制台」「地區及語言」裡面的設定 如果您沒有將 Workbooks.Open 的 local 引數設為 true Excel 會依預設 Visual Basic for Applications (VBA) (通常為美式英語) 的語言來作辨識 看一下說明,上面說的好像不會一樣對吧?! 有些功能可能得自己測試出來! 2011-04-07 23:18:04 補充: 最後! 您是要自己決定日期的格式? 還是要 Excel 自主主張猜日期格式? 您決定吧!!! 2011-04-07 23:39:11 補充: RE: 所以一定要用匯入外部檔案方式是嗎 我可沒這麼說 上面說過原程式碼的 12 列 35 列程式碼改好後「就可以用了」 「就可以用了」是指在作業系統設定的地區設在台灣的大多數人 是大多數人喔~有些人或許改過作業系統上的設定就可能不能用了

其他解答:

TO 版大: pos_SALE_HOUR(31032011).CSV內的D欄日期為3月31日,而 pos_SALE_HOUR(01042011).CSV內的D欄日期為1月4日, 並非如版大所述的是4月1日呦。 您可利用 Day() 及 Month() 兩個函數去測便知。|||||For Ellie 大: 我開起來D欄是 31/03/2011 及 1/4/2011,都是 日/月/年 只是一個是 dd/mm/yyyy ,一個是 d/m/yyyy, 看不出有月日錯置! 2011-04-07 17:27:47 補充: For Ellie 大: 就用您的檔案修改,因原檔案我無法測試, 所以僅依原程式碼內容判讀需求, 有不同時,若您不知如何更改再告訴我。 http://www.funp.net/358185 (含資料夾,可直接測試) 測試完後,要啟用時請先進程式碼修改您實際檔案路徑。 2011-04-07 21:20:20 補充: 不管是以 Notpae 還是以 EXCEL 直接開啟, 都與巨集開啟一樣 1/4/2011, 這點還是有請 沙拉油 大 詳述分明, 從未遇過這情況,多見識了。 2011-04-07 22:20:32 補充: 請教 沙拉油 大: 以Workbooks.OpenText 方式是可先將日期轉成 DMY, 但是 CSV 檔,使用 Workbooks.Open ,在我的PC執行, 並不會將 1/4/2011 變成 4/1/2011,何以 Ellie 大的會, 可否賜教?謝謝!7CA86E5143DBFF22