【问题标题】:How to create a separate CSV file from VBA?如何从 VBA 创建单独的 CSV 文件?
【发布时间】:2012-01-15 05:32:11
【问题描述】:

我需要将一些结果输出为 .csv 文件,稍后由另一个进程对其进行解析。为了产生这些结果,我有一个巨大的工作簿,其中包含我需要的所有宏和函数。

  1. 是否可以从 VBA“创建”一个单独的 .csv 文件?
  2. 是否可以使用 VBA 功能将其写入其中,而不仅仅是以“原始文本”方式写入?

【问题讨论】:

标签: vba excel csv


【解决方案1】:

你想要这样的东西吗?

Option Explicit
Sub WriteFile()

  Dim ColNum As Integer
  Dim Line As String
  Dim LineValues() As Variant
  Dim OutputFileNum As Integer
  Dim PathName As String
  Dim RowNum As Integer
  Dim SheetValues() As Variant

  PathName = Application.ActiveWorkbook.Path
  OutputFileNum = FreeFile

  Open PathName & "\Test.csv" For Output Lock Write As #OutputFileNum

  Print #OutputFileNum, "Field1" & "," & "Field2"

  SheetValues = Sheets("Sheet1").Range("A1:H9").Value
  ReDim LineValues(1 To 8)

  For RowNum = 1 To 9
    For ColNum = 1 To 8
      LineValues(ColNum) = SheetValues(RowNum, ColNum)
    Next
    Line = Join(LineValues, ",")
    Print #OutputFileNum, Line
  Next

  Close OutputFileNum

End Sub

不要忘记,您需要在任何包含逗号的字段周围加上引号。

【讨论】:

  • 不知道为什么,但是如果我修改任何此代码的注释并运行它,SheetValues 会合并到一列或两列中,并将代码恢复为本文中的代码解决问题。刚刚花了一整天的时间尝试测试这些东西,但找不到原因。
  • @阿尔法布拉沃。如果你去我的个人资料,你会找到一个电子邮件地址。如果您将错误代码的副本发送给我,我会看看。
  • @tonyDallimore,“Lock Write as #OutputFileNum”有什么作用?
  • @Austin Wismer 我知道自 Office 2003 以来 VBA Open 语句没有任何变化。它可能与早期版本没有变化,但我的知识不会追溯到 2003 年之前。“锁定写入”意味着没有其他程序可以写入这个文件,直到这个宏关闭它。有关 Office 2013 Open 语句的规范,请参阅 msdn.microsoft.com/en-us/library/office/gg264163.aspx
  • 谢谢!使用 PRINT 和 WRITE 命令有什么区别?
【解决方案2】:

Tony 的回答通常有效,但不能处理您的文本包含逗号或引号的情况。您可能更喜欢使用 Workbook.SaveAs 方法。

如果您想将 Sheet1 的内容保存为单独的 csv 文件,这里是一个示例。

Sub create_csv()
    Dim FileName As String
    Dim PathName As String
    Dim ws As Worksheet

    Set ws = ActiveWorkbook.Sheets("Sheet1")
    FileName = "filename.csv"
    PathName = Application.ActiveWorkbook.Path
    ws.Copy
    ActiveWorkbook.SaveAs FileName:=PathName & "\" & FileName, _
        FileFormat:=xlCSV, CreateBackup:=False
End Sub

想象一下您的 Sheet1 包含:

判断题

lore,m ips“嗯”

输出的 csv 文件将是:

lorem,ipsum

"lore,m","ips""um"""

【讨论】:

    【解决方案3】:

    您可以编写一个宏,例如从 VBA 以 CSV 格式保存当前工作簿(打开的 excel 文件):

    ActiveWorkbook.SaveAs Filename:="C:\Book1.csv", _
        FileFormat:=xlCSVMSDOS, CreateBackup:=False
    

    【讨论】:

    • 好的,这将是一个开始。但是知道我怎么能做一个完全外部的吗?
    【解决方案4】:

    对于那些手动编写 CSV 的人,您需要处理逗号、双引号和换行符。

    例如

    Sub WriteToCsv(Items() as String)
    
        OutFile = FreeFile          
        Open "Outfile.csv" For Output As #OutFile
        
        Print #OutFile, "Header"
        
        For Each Item In Items       
            If InStr(1, Item, Chr(34)) > 0 Then Item = Chr(34) & Replace(Item, Chr(34), Chr(34) & Chr(34)) & Chr(34)
            If InStr(1, Item, ",") > 0 And Left(Item, 1) <> Chr(34) Then Item = Chr(34) & Item & Chr(34)
            If InStr(1, Item, vbLf) > 0 And Left(Item, 1) <> Chr(34) Then Item = Chr(34) & Item & Chr(34)
            Print #OutFile, Item
        Next
        
        Close OutFile
    
    End Sub
    

    【讨论】:

      【解决方案5】:

      以您的代码为基础(谢谢!!!)但必须对其进行修改才能使其正常工作。 它没有处理多行,所有单元格都被放置在彼此之后。 2个循环:一个遍历行,一个遍历每行的单元格。 每次行循环开始时,临时字符串都会被清空。在开始新行之前,将临时字符串添加到 Outfile。

      Sub ToCsv()
      
      Dim rng As Range
      Dim row As Range
      Dim cell As Range
      
      Dim ItemNew As String
      
      Set rng = Range("A1:E2")    'Adjust the range accordingly
      
      OutFile = FreeFile
      Open "Outfile.csv" For Output As #OutFile
      
      'Print #OutFile, "Header"
      
      For Each row In rng.Rows
          ItemNew = ""
          For Each Item In row.Cells
              If InStr(1, Item, Chr(34)) > 0 Then Item = Chr(34) & Replace(Item, Chr(34), Chr(34) & Chr(34)) & Chr(34)
              If InStr(1, Item, ",") > 0 And Left(Item, 1) <> Chr(34) Then Item = Chr(34) & Item & Chr(34)
              If InStr(1, Item, vbLf) > 0 And Left(Item, 1) <> Chr(34) Then Item = Chr(34) & Item & Chr(34)
              If ItemNew = "" Then
                  ItemNew = Item
              Else
                  ItemNew = ItemNew & "," & Item
              End If
          Next
          Print #OutFile, ItemNew
      Next
      Close OutFile
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2017-12-04
        • 1970-01-01
        相关资源
        最近更新 更多