Excel 2007将工作表另存为CSV与在VBA中将工作表另存为CSV不同

Excel 2007将工作表另存为CSV与在VBA中将工作表另存为CSV不同,excel,vba,csv,date,Excel,Vba,Csv,Date,我在使用第三方网站来源的工作簿中的某些工作表时遇到问题 电子表格可在 我遇到问题的工作表是该zipfile中all-euro-data-2009-2010.xls中的EC工作表 这是一个足球比赛数据列表 手动另存为CSV 现在,当这个“EC”电子表格处于焦点时,我转到另存为并选择.CSV,然后电子表格被另存为CSV,数据就完美了。即“B”列中的日期,它们应为DD/MM/YYYY格式 例如,取自EC工作表的最后一行 EC,2010年4月24日,塔姆沃思,Ebbsfleet 这是正确的,如果我进

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

  • 电子表格可在
  • 我遇到问题的工作表是该zipfile中
    all-euro-data-2009-2010.xls
    中的
    EC
    工作表
这是一个足球比赛数据列表

手动另存为CSV

现在,当这个“EC”电子表格处于焦点时,我转到另存为并选择.CSV,然后电子表格被另存为CSV,数据就完美了。即“B”列中的日期,它们应为DD/MM/YYYY格式

例如,取自EC工作表的最后一行 EC,2010年4月24日,塔姆沃思,Ebbsfleet

这是正确的,如果我进入菜单,选择“另存为”,选择CSV,并接受所有提示以CSV格式保存,等等,CSV文件是另存为 EC,2010年4月24日,塔姆沃思,Ebbsfleet

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

VBA另存为CSV

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

但是,使用VBA将数据另存为CSV,结果如下 EC,4/24/2010,塔姆沃思,Ebbsfleet

请注意,从UK dd/mm/yyyy更改为现在的美国格式mm/dd/yyyy

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

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

我的设置

我在英国的Win7(64位)PC上使用Excel 2007

我还尝试将Local:=True添加到ws.SaveAs中,但这没有任何区别。即从VBA保存时,日期仍保存为EC,2010年4月24日,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

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

我在八、九年前就遇到了这个问题,从那时起,我总是以“1Apr11”的格式传递日期,以避免出现这个问题。你的问题表明我是正确的,但问题的根源不是Excel

我设置了一个包含数字、日期和字符串的工作表。它保存为CSV文件,正如我所希望的

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

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


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

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

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
子SaveAsCsv(ws作为工作表,名称作为字符串)
将fso设置为文件系统对象
作为文本流的Dim fl
Dim dat作为变量
变暗rw为长,col为长
将ln变为字符串
将引号变为字符串
关于错误转到EH
Set fso=新文件系统对象
Set fl=fso.CreateTextFile(名称,True)
dat=ws.UsedRange
对于rw=1至UBound(dat,1)
ln=“”
对于col=1至UBound(dat,2)
'修改此部分以满足您的需要
如果dat(rw,col)“,则
如果是数字(dat(rw,col))或_
IsDate(dat(rw,col))然后
Quote=“”
其他的
引号“”
如果结束
ln=ln&Quote&dat(rw,col)&Quote&“
如果结束
下一列
左前写线(层,层(层)-1)
下一个rw
呃,
出错时继续下一步
如果fl不为空,则fl关闭
设置fl=无
设置fso=无
端接头
它包含对Microsoft脚本运行时的早期绑定引用,因此如果需要,请将引用或更改设置为晚期绑定


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

从Excel菜单使用SaveAs,而不是在使用VBA时使用。更改区域设置对VBA将日期翻转为美国格式没有影响。但是,添加下面的声明,正如上面所建议的那样,为我解决了这个问题

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

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

你试过在区域设置上乱搞吗?我的区域设置是英语(英国),日期为dd/MM/yyyy,地点设置为英国。所有其他内容,如日期/时间/键盘等,都设置为UKAs csv真的是ju