2011-12-29 183 views
2

我在使用第三方網站來源的工作簿中的某些工作表時遇到問題。Excel 2007將工作表另存爲CSV不同於將工作表另存爲VBA中的csv

EC工作表中all-euro-data-2009-2010.xls這是足球比賽的數據列表問題工作表。

Manual Save as CSV
現在,當這個「EC」電子表格中的重點和我去另存爲,選擇.CSV,那麼電子表格保存爲CSV和數據是完美的。即列「B」中的日期,並且它們應該是DD/MM/YYYY格式。

例如,從EC工作 EC的最後一排拍攝,24/04/2010,塔姆沃思,艾貝斯費特

這是正確的,如果我去菜單並選擇「另存爲」,並選擇CSV並接受所有提示,以保持它在CSV格式等等等等的CSV文件保存爲 EC,24/04/2010,塔姆沃思,艾貝斯費特

這是正確的,因爲日期是在英國DD/MM/YYYY

VBA Save as CSV
現在讓我對自己變得更加容易,因爲我需要將每個工作表保存爲csv文件,所以我使用下面的VBA代碼自動將當前目錄中的每個工作表保存爲worksheetname.csv(例如EC .csv)每次關閉工作簿時,這會將列B中的日期更改爲Americam格式MM/DD/YYYY。

然而使用VBA保存爲CSV數據結束像 EC 4/24/2010年,塔姆沃思,艾貝斯費特

通知從英國日/變更/ yyyy的到現在的美國格式mm/dd/yyyy

如何在VBA中將日期保存爲實際電子表格中顯示的格式,即在將vba保存爲CSV時是dd/mm/yyyy?

我需要這個CSV選項在VBA中工作,因爲這些和許多其他類似的電子表格都被保存爲每天輸入的CSV文件。

My settings

我使用Excel 2007中,運7(64位)PC在英國上。

我也嘗試添加Local:= True到ws.SaveAs,但這沒有什麼區別。即日期仍然保存爲EC 4/24/2010年,塔姆沃思,艾貝斯費特從VBA

由於節省

Option Explicit 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Alerts_Suppress 
ThisWorkbook.Save 
Save_All_WorkSheets_As_CSV 
Alerts_Enable 
ActiveWorkbook.Close False 
Application.Quit 
End Sub 


Sub Save_All_WorkSheets_As_CSV() 

Dim Name As String 
Dim Current_Directory As String 
Dim ws As Worksheet 
Dim wb As Workbook 
Set wb = ActiveWorkbook 
Dim i As Integer 
i = 0 

Current_Directory = ActiveWorkbook.Path & "\" 
For Each ws In wb.Worksheets 
    Name = Current_Directory & LCase(ws.Name) + ".csv" 
    ws.SaveAs Name, xlCSV 
    i = i + 1 
Next 

End Sub 

Sub Alerts_Suppress() 
Application.DisplayAlerts = False 
End Sub 

Sub Alerts_Enable() 
Application.DisplayAlerts = True 
End Sub 
+0

您是否嘗試過使用區域設置搞亂? – 2011-12-29 14:46:32

+0

我的區域設置爲英語(英國),日期爲dd/MM/yyyy,位置設置爲英國。其他像日期/時間/ keybaord其他所有都設置爲英國 – 2011-12-29 14:52:34

+0

由於csv真的只是文本將日期字段轉換爲文本字段適用? – 2011-12-29 14:59:12

回答

2

這似乎是用VBA固有的「問題」,我認爲唯一的解決辦法是將之前導出格式化你的日期字段文本字段,明顯改變Selection實際範圍

Sub convertToStr() 
    Dim c As Range 

    For Each c In Selection 
    c.Value = "'" + CStr(c.Value) 
    Next c 

End Sub 
+2

最後,我只帶了一個VBA代碼的附加內容,非常簡單,但花了幾個小時,現在日期被正確保存,無論它們如何出現在Excel工作表中,所以我會打勾這就是答案,因爲它給了我這個想法..只需在VBA腳本的save as命令前插入這一行ws.Columns(「B:B」)。NumberFormat =「dd/mm/yyyy」即可。 – 2011-12-30 08:34:54

0

一個月左右前,我拍下來的時候,當我提出撤銷有關Excel有時將英國日期轉換爲可能是有效美國日期到美國日期。因此1/4/11(4月1日)將成爲4/1/11(11月4日),但13/4/11(4月13日)將保持不變。我不能重複這個問題,所以不得不承認我一定犯了一個錯誤。

八九年前我遇到過這個問題,從那以後我總是以格式「1Apr11」通過日期來避免這個問題。你的問題表明我是正確的,但Excel以外的東西是問題的根源。

我設置了一個包含數字,日期和字符串的工作表。它按照我的意願保存爲CSV文件。

我去了控制面板,並將我的位置更改爲「美國」。我再次保存了工作表,這次CSV文件中的日期如上所述是「美國化」的。

我將我的位置恢復到「英國」。我的第三個CSV文件再次正確。

您聲稱您的控制面板設置是正確的。我認爲你需要再次檢查,並尋找其他可能是錯誤的,因爲我現在知道如何開關這種效應。

1

我已經能夠按照所述複製問題。我的地區設置是新西蘭英語。安裝程序是Excel 2010 32位,Win7 64位

我已經使用Excel多年來csv文件多年來,通常發現Excel本地csv處理非常易變。我傾向於寫我自己的csv處理程序。

下面是一個例子。您需要對其進行修改以滿足您的需求。如處理你想要什麼,不想要""「d和包含或排除空細胞等

Sub SaveAsCsv(ws As Worksheet, Name As String) 
    Dim fso As FileSystemObject 
    Dim fl As TextStream 
    Dim dat As Variant 
    Dim rw As Long, col As Long 
    Dim ln As String 
    Dim Quote As String 

    On Error GoTo EH 

    Set fso = New FileSystemObject 
    Set fl = fso.CreateTextFile(Name, True) 
    dat = ws.UsedRange 
    For rw = 1 To UBound(dat, 1) 
     ln = "" 
     For col = 1 To UBound(dat, 2) 
      ' Modify this section to suit your needs 
      If dat(rw, col) <> "" Then 
       If IsNumeric(dat(rw, col)) Or _ 
        IsDate(dat(rw, col)) Then 
        Quote = "" 
       Else 
        Quote = """" 
       End If 
       ln = ln & Quote & dat(rw, col) & Quote & "," 
      End If 
     Next col 
     fl.WriteLine Left(ln, Len(ln) - 1) 
    Next rw 


EH: 
    On Error Resume Next 
    If Not fl Is Nothing Then fl.Close 
    Set fl = Nothing 
    Set fso = Nothing 

End Sub 

它包括一個早期綁定參考Microsoft Scripting Runtime,所以設置引用或改變,如果你想後期綁定。

要在代碼中使用它,relace ws.SaveAs Name, xlCSVSaveAsCsv ws, Name

0

這是,如果你使用的是從Excel菜單另存爲,但使用VBA時,情況並非如此。更改區域設置不會影響VBA翻轉日期爲美國格式。但是如上所述,添加下面的語句爲我解決了這個問題。

ws.Columns("B:B").NumberFormat = "dd/mm/yyyy" 
+0

這是對託尼Dallimore的[回覆](http://stackoverflow.com/a/8670362/369450)的評論,並沒有提供一個問題的答案。一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你將能夠[對任何帖子發表評論](http://stackoverflow.com/help/privileges/comment)。 – cpburnz 2016-08-12 18:22:57

0

當您遇到類似問題時,請記錄宏並將生成的代碼與您的代碼進行比較。請注意,它使用Workbook.SaveAs而不是

For Each ws In wb.Worksheets 
    ws.Activate 
    wb.SaveAs Current_Directory & LCase(ws.Name) & ".csv", xlCSV ' check this line with Record Macro 
Next 
相關問題