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

时间:2011-12-29 14:32:55

标签: excel vba csv date

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

这是足球比赛数据列表。

all-euro-data-2009-2010.xls
现在,当这个“EC”电子表格成为焦点并且我转到SAVE AS并选择.CSV时,电子表格将保存为CSV并且数据是完美的。即“B”栏中的日期,它们应为DD / MM / YYYY格式。

EG,取自EC工作表的最后一行 EC,24/04/2010,塔姆沃思,艾贝斯费特

这是正确的,如果我进入菜单并选择“另存为”并选择CSV并接受所有提示以保持CSV格式等等,将CSV文件另存为 EC,24/04/2010,塔姆沃思,艾贝斯费特

这是正确的,因为日期是英国dd / mm / yyyy

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

然而,使用VBA保存为CSV,数据最终会像 EC 4/24/2010年,塔姆沃思,艾贝斯费特

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

如何在VBA中进行更改,以便将日期保留为实际电子表格中显示的格式,即dd / mm / yyyy在vba中保存为CSV时的效果?

我需要此CSV选项才能在VBA中使用,因为这些和许多其他类似的电子表格都会保存为CSV文件,以便每天导入。

VBA Save as CSV

我在英国的Win 7(64位)PC上使用Excel 2007。

我也尝试将local:= True添加到ws.SaveAs但这没有任何区别。即从VBA保存时,日期仍保存为EC,4/24/2010,Tamworth,Ebbsfleet

由于

My settings

5 个答案:

答案 0 :(得分:2)

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

Sub convertToStr()
  Dim c As Range

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

End Sub

答案 1 :(得分:1)

我能够按照描述复制问题。我的区域设置是新西兰英语。安装程序是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的早期绑定引用,因此如果需要,可以设置引用或更改为后期绑定。

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

重新SaveAsCsv ws, Name

答案 2 :(得分:0)

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

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

我设置了一个包含数字,日期和字符串的工作表。它就像我希望的那样保存为CSV文件。

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

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

您声称控制面板设置正确无误。我想你需要再次检查并查找其他可能出错的地方,因为我现在知道如何打开和关闭此效果。

答案 3 :(得分:0)

如果您使用Excel菜单中的SaveAs而不是使用VBA时,则会出现这种情况。更改区域设置对VBA将日期翻转为美国格式没有影响。但是如上所述,添加以下语句为我修复了它。

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

答案 4 :(得分: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