Vba Excel:如何仅在CSV文件中向字符串添加双引号

Vba Excel:如何仅在CSV文件中向字符串添加双引号,vba,excel,csv,Vba,Excel,Csv,我想从Excel创建一个CSV文件,其中字符串值应为双引号,日期值应为MM/dd/yyyy格式。所有数值和布尔值都应不带引号 我该怎么做呢?使用VBA更容易做到这一点。Workbook对象的SaveAs方法仅允许您选择预定义格式,xlCSV方法不使用双引号分隔字符串 要在VBA中执行此操作,请执行以下操作: Dim fileOut As Integer fileOut = FreeFile Open "C:\foo.csv" For Output As #fileOut Write #fil

我想从Excel创建一个CSV文件,其中字符串值应为双引号,日期值应为MM/dd/yyyy格式。所有数值和布尔值都应不带引号


我该怎么做呢?

使用VBA更容易做到这一点。
Workbook
对象的
SaveAs
方法仅允许您选择预定义格式,
xlCSV
方法不使用双引号分隔字符串

要在VBA中执行此操作,请执行以下操作:

Dim fileOut As Integer

fileOut = FreeFile
Open "C:\foo.csv" For Output As #fileOut

Write #fileOut, 14, "Stack Overflow", Date, True

Close #fileOut
(NB
Date
是一个VBA语句,返回当前系统日期作为子类型日期的变量)

如果随后在记事本中检查该文件:

14,“堆栈溢出”,2009-05-12,正确#

字符串已按要求分隔,日期转换为通用格式,日期和布尔值均用#符号分隔

要在读取数据时使用
Input#
语句,该语句将正确解释所有值

如果要写一行的一部分,然后稍后再完成,请执行以下操作:

Write #fileOut, 14, "Stack Overflow";
Write #fileOut, Date, True
生成与原始程序相同的结果。第一条语句末尾的分号阻止新行开始


嵌入双引号的字符串将导致问题,因此您需要删除或替换这些字符

使用VBA更容易做到这一点。
Workbook
对象的
SaveAs
方法仅允许您选择预定义格式,
xlCSV
方法不使用双引号分隔字符串

要在VBA中执行此操作,请执行以下操作:

Dim fileOut As Integer

fileOut = FreeFile
Open "C:\foo.csv" For Output As #fileOut

Write #fileOut, 14, "Stack Overflow", Date, True

Close #fileOut
(NB
Date
是一个VBA语句,返回当前系统日期作为子类型日期的变量)

如果随后在记事本中检查该文件:

14,“堆栈溢出”,2009-05-12,正确#

字符串已按要求分隔,日期转换为通用格式,日期和布尔值均用#符号分隔

要在读取数据时使用
Input#
语句,该语句将正确解释所有值

如果要写一行的一部分,然后稍后再完成,请执行以下操作:

Write #fileOut, 14, "Stack Overflow";
Write #fileOut, Date, True
生成与原始程序相同的结果。第一条语句末尾的分号阻止新行开始


嵌入双引号的字符串将导致问题,因此您需要删除或替换这些字符

Excel不允许您指定格式有点可怕。这里有一个MrExcel链接,可能对您也很有用

以下是该站点的代码:

Sub CSVFile()

Dim SrcRg As Range
Dim CurrRow As Range
Dim CurrCell As Range
Dim CurrTextStr As String
Dim ListSep As String
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")

If FName <> False Then
  ListSep = Application.International(xlListSeparator)
  If Selection.Cells.Count > 1 Then
    Set SrcRg = Selection
  Else
    Set SrcRg = ActiveSheet.UsedRange
  End If    
  Open FName For Output As #1    
  For Each CurrRow In SrcRg.Rows
    CurrTextStr = ""
    For Each CurrCell In CurrRow.Cells
      CurrTextStr = CurrTextStr & """" & CurrCell.Value & """" & ListSep
    Next
    While Right(CurrTextStr, 1) = ListSep
      CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
    Wend    
    Print #1, CurrTextStr    
  Next    
  Close #1    
  End If
End Sub
子CSVFile()
调光SRRG As范围
暗电流范围
Dim Curr单元格作为范围
Dim CurrTextStr作为字符串
将列表设置为字符串
Dim FName作为变体
FName=Application.GetSaveAsFilename(“,”CSV文件(*.CSV),*.CSV”)
如果FName为False,则
ListSep=Application.International(xlListSeparator)
如果Selection.Cells.Count>1,则
设置SrcRg=Selection
其他的
设置SrcRg=ActiveSheet.UsedRange
如果结束
打开FName,输出为#1
对于SrcRg.行中的每个currow
CurrTextStr=“”
对于CurrRow.Cells中的每个CurrCell
CurrTextStr=CurrTextStr&“”&CurrCell.Value&“”&ListSep
下一个
而右侧(CurrTextStr,1)=ListSep
CurrTextStr=Left(CurrTextStr,Len(CurrTextStr)-1)
温德
打印#1,CurrTextStr
下一个
关闭#1
如果结束
端接头

Excel不允许您指定格式有点可怕。这里有一个MrExcel链接,可能对您也很有用

以下是该站点的代码:

Sub CSVFile()

Dim SrcRg As Range
Dim CurrRow As Range
Dim CurrCell As Range
Dim CurrTextStr As String
Dim ListSep As String
Dim FName As Variant
FName = Application.GetSaveAsFilename("", "CSV File (*.csv), *.csv")

If FName <> False Then
  ListSep = Application.International(xlListSeparator)
  If Selection.Cells.Count > 1 Then
    Set SrcRg = Selection
  Else
    Set SrcRg = ActiveSheet.UsedRange
  End If    
  Open FName For Output As #1    
  For Each CurrRow In SrcRg.Rows
    CurrTextStr = ""
    For Each CurrCell In CurrRow.Cells
      CurrTextStr = CurrTextStr & """" & CurrCell.Value & """" & ListSep
    Next
    While Right(CurrTextStr, 1) = ListSep
      CurrTextStr = Left(CurrTextStr, Len(CurrTextStr) - 1)
    Wend    
    Print #1, CurrTextStr    
  Next    
  Close #1    
  End If
End Sub
子CSVFile()
调光SRRG As范围
暗电流范围
Dim Curr单元格作为范围
Dim CurrTextStr作为字符串
将列表设置为字符串
Dim FName作为变体
FName=Application.GetSaveAsFilename(“,”CSV文件(*.CSV),*.CSV”)
如果FName为False,则
ListSep=Application.International(xlListSeparator)
如果Selection.Cells.Count>1,则
设置SrcRg=Selection
其他的
设置SrcRg=ActiveSheet.UsedRange
如果结束
打开FName,输出为#1
对于SrcRg.行中的每个currow
CurrTextStr=“”
对于CurrRow.Cells中的每个CurrCell
CurrTextStr=CurrTextStr&“”&CurrCell.Value&“”&ListSep
下一个
而右侧(CurrTextStr,1)=ListSep
CurrTextStr=Left(CurrTextStr,Len(CurrTextStr)-1)
温德
打印#1,CurrTextStr
下一个
关闭#1
如果结束
端接头

我可以建议以ISO yyyy MM dd格式存储日期吗?这将为您节省国际化问题。我可以建议以ISO yyyy MM dd格式存储日期吗?这将为您解决国际化问题。