Excel 2007将工作表另存为CSV不同于将工作表另存为VBA中的csv

我在第三方网站源的工作簿中的某些工作表中遇到问题。

  • 该电子表格可在第三方来源网站上获得
  • 我遇到问题的工作表是该zip文件中all-euro-data-2009-2010.xls中的EC工作表

这是一个足球比赛数据列表。

Manual Save as CSV
现在,当这个“EC”电子表格是焦点,我去保存并select.CSV,然后电子表格保存为CSV,数据是完美的。 即列“B”中的date,它们应该是DD / MM / YYYY格式。

EG,取自EC工作表EC最后一行,24/04/2010,Tamworth,Ebbsfleet

这是正确的,如果我去菜单,select“另存为”,并selectCSV,并接受所有提示保持在CSV格式等等等等的CSV文件保存为EC,24/04/2010,塔姆沃思,Ebbsfleet

这是正确的,因为date是在英国dd / mm / yyyy

VBA Save as CSV
现在让自己变得更加容易,因为我需要将每个工作表保存为csv文件,所以我使用下面的VBA代码自动保存当前目录名为worksheetname.csv(例如EC)的工作表。 csv),每次工作簿closures时,这都会将B列中的date更改为Americam格式MM / DD / YYYY。

然而,使用VBA保存为CSV数据最终会像EC,4/24/2010,Tamworth,Ebbsfleet

注意从英国dd / mm / yyyy到现在的美国格式mm / dd / yyyy的变化

如何在VBA中进行更改,使其保持为实际电子表格中显示的格式,即将vba保存为CSV时的日/年/年/ yyyy?

我需要这个CSV选项在VBA中工作,因为这些和许多其他类似的电子表格都被保存为每天input的CSV文件。

My settings

我在英国的Win 7(64位)个人电脑上使用Excel 2007。

我也尝试添加Local:= True到ws.SaveAs,但这没有什么区别。 即从VBA保存时,date仍保存为EC,4/24/2010,Tamworth,Ebbsfleet

谢谢

 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 

这似乎是与vba固有的“问题”,我相信唯一的解决办法是在导出之前将date字段格式化为文本字段,显然将Selection更改为实际范围

 Sub convertToStr() Dim c As Range For Each c In Selection c.Value = "'" + CStr(c.Value) Next c End Sub 

我已经能够复制所述的问题。 我的地区设置是新西兰英语。 安装程序是Excel 2010 32位,Win7 64位

多年来我一直使用Excel的csv文件很多次,通常发现Excel本地csv处理非常浮躁。 我倾向于写我自己的csv处理程序。

这是一个例子。 您将需要修改它以适应您的需求。 例如,处理你想要什么,不想要"" ,并包括或排除空单元格等

 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的早期绑定引用,因此如果需要,请将引用或更改设置为延迟绑定。

要在代码中使用它,请使用SaveAsCsv ws, Name关联ws.SaveAs Name, xlCSV

大约一个月之前,当我把Excel放在一边,有时把英国的date转换成美国的date和美国的date。 因此,1/4/11(4月1日)将成为11年4月1日(11月4日),但13/4/11(4月13日)将保持不变。 我不能重复这个问题,所以不得不承认,我一定是犯了一个错误。

八九年前,我遇到过这个问题,从那以后,我总是以格式“1Apr11”来通过date,以避免这个问题。 你的问题表明我是正确的,但Excel以外的东西是问题的根源。

我build立了一个包含数字,date和string的工作表。 它按照我的意愿保存为一个CSV文件。

我去了控制面板,并改变了我的位置“美国”。 我再次保存了工作表,这次CSV文件中的date如上所述是“美国化”的。

我把我的位置恢复到“英国”。 我的第三个CSV文件再次正确。

您声称您的控制面板设置是正确的。 我想你需要再次检查,并寻找其他可能是错误的,因为我现在知道如何开关这个效应。

当您遇到类似问题时,请loggingmacros并将生成的代码与您的代码进行比较。 请注意,它使用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 

如果您使用Excel菜单中的SaveAs而不是使用VBA时,则是这种情况。 改变区域设置不影响VBA翻转date到美国格式。 但是,如上所述,添加下面的语句为我解决了这个问题。

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