【问题标题】:Create CSV from array in VBA从 VBA 中的数组创建 CSV
【发布时间】:2010-11-16 05:54:58
【问题描述】:

我是一名新手程序员,试图自动化一些重复性的工作任务,这些任务应该由聪明的脚本而不是人类来完成。我做过一些 VBA 和 Java,但都是非常基础的东西。

我们有一些由经过验证的在线表单生成的数据,这些数据通过电子邮件发送到邮箱,然后邮件客户端 (Outlook 2010) 中的过滤器将其放入特定文件夹。我的目的是编写一些 VBA,当触发时将检查该文件夹的内容,然后对于每个邮件项,将消息正文文本作为字符串获取,创建一个数组,然后将数组内容写入 .csv 文件。然后,我将让另一个应用程序(用于 Firefox 的 iMacros)读取 csv 并与内部公司 web 应用程序交互来完成其余的工作。

除了将数组内容写入 csv 之外,我想我可以做到所有这些。

我最好通过查看代码示例(我确实尝试理解 MS 对象模型文档),但我能找到的将 VBA 数组写入 CSV 的最好方法是:

  'save the file
  Open sFileName For Output As #7
  For n = 0 To UBound(MyArray, 1)
    Print #7, Format(MyArray(n, 0), "0.000000E+00")
  Next n
  Close #7

我认为这是 VB 而不是 VBA,但这里的一般想法是否有效?或者,如果其他人有代码示例可以帮助我入门或任何其他指针,我将不胜感激。

PS也看过How do I save a 2-dimensional array as a csv file?但是看不懂。

【问题讨论】:

    标签: vba csv outlook


    【解决方案1】:

    以下代码适用于在 CSV 中转换二维数组。我没有写代码,但是已经测试过了,它可以工作!

    ' SaveAsCSV saves an array as csv file. Choosing a delimiter different as a comma, is optional.
    '
    ' Syntax:
    ' SaveAsCSV dMyArray, sMyFileName, [sMyDelimiter]
    '
    ' Examples:
    ' SaveAsCSV dChrom, app.path & "\Demo.csv"       --> comma as delimiter
    ' SaveAsCSV dChrom, app.path & "\Demo.csv", ";"  --> semicolon as delimiter
    '
    ' Rev. 1.00 [8 jan 2003]
    ' written by P. Wester
    ' wester@kpd.nl
    
    
    Public Sub SaveAsCSV(MyArray() As Variant, sFilename As String, Optional sDelimiter As String = ",")
    
    Dim n As Long 'counter
    Dim M As Long 'counter
    Dim sCSV As String 'csv string to print
    
    On Error GoTo ErrHandler_SaveAsCSV
    
    
    'check extension and correct if needed
    If InStr(sFilename, ".csv") = 0 Then
      sFilename = sFilename & ".csv"
    Else
      While (Len(sFilename) - InStr(sFilename, ".csv")) > 3
        sFilename = Left(sFilename, Len(sFilename) - 1)
      Wend
    End If
    
    'If MultiDimensional(MyArray()) = False Then '1 dimension
    
      'save the file
    '  Open sFileName For Output As #7
    '  For n = 0 To UBound(MyArray(), 1)
    '    Print #7, Format(MyArray(n, 0), "0.000000E+00")
    '  Next n
    '  Close #7
    
    'Else 'more dimensional
    
      'save the file
      Open sFilename For Output As #7
      For n = 1 To UBound(MyArray(), 1)
        sCSV = ""
        For M = 1 To UBound(MyArray(), 2)
          sCSV = sCSV & Format(MyArray(n, M)) & sDelimiter
        Next M
        sCSV = Left(sCSV, Len(sCSV) - 1) 'remove last Delimiter
        Print #7, sCSV
      Next n
      Close #7
    
    'End If
    
    Exit Sub
    
    
    ErrHandler_SaveAsCSV:
      Close #7
    

    【讨论】:

    • 效果很好,只需要添加这个,以防字段记录中有逗号。 codeDim RecordAt As String and For m = LBound(MyArray(), 2) To UBound(MyArray(), 2) RecordAt = Format(MyArray(n, m)) If InStr(RecordAt, ",") > 0然后 RecordAt = Chr(34) & RecordAt & Chr(34) sCSV = sCSV & RecordAt & sDelimiter 下一个 m code
    【解决方案2】:

    我不使用 VB,所以我不确定输出 #7 的打开文件,但如果它有效(用一些随机输出测试它),那么你的代码 sn-p 是正确的。唯一的问题是您应该有另一个 Print 调用,在其中添加一个“,”。

    只需确保在最后一次迭代中没有添加“,”。你可以通过添加一个 If 语句来检查 n = UBound(MyArray) - 1 (这是最后一个元素的索引。)

    希望对你有帮助,

    下午

    【讨论】:

      【解决方案3】:

      这是一个基于 Excel 的解决方案。如果您从 excel 控制前景,这可能是一个可行的解决方案。此外,如果您正在处理一个 excel 项目,这可能会很有用。

      Private Sub ArrayToCsvWorkborkMethod(MyArray As Variant, FileName As String)
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      Dim WB As Workbook
      Set WB = Application.Workbooks.Add
      Dim WS As Worksheet
      Set WS = WB.Sheets(1)
      
      Dim Target As Range
      Set Target = Range("A1").Resize(UBound(MyArray, 1), UBound(MyArray, 2))
      Target.Value = MyArray
      WB.SaveAs FileName, 23
      WB.Close
      Application.ScreenUpdating = True
      Application.DisplayAlerts = True
      End Sub
      

      我用这种方式解决了它。这速度较慢,但​​消除了先前解决方案可能执行的任何奇怪的格式设置。 这将创建一个新工作簿,将您的数组写入工作表,将该新工作簿另存为 CSV 文件,然后关闭新工作簿。

      至少对我来说,这更可靠,并且可以将任何格式问题转移到 Excel。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-07
        • 2017-02-03
        • 1970-01-01
        • 2014-11-04
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多