【问题标题】:VBA Add row to csv file [closed]VBA将行添加到csv文件[关闭]
【发布时间】:2019-07-25 07:36:02
【问题描述】:

我搜索了很多,但大多数结果都与 excel 有关。所以我找不到任何答案。

我正在尝试通过 ms access2010:

我在第一行有几个带有标题的 csv 文件。所有字段都由 分隔,并且它们都是字符串(双引号,它们有很多,在双引号中)。

我不知道每个 csv 文件中有多少列。 我想在第一行(标题)和第二行之间插入新行。

如何知道 csv 文件有多少列? 以及如何在第二行添加新的文本行?

【问题讨论】:

  • 您可以在 Excel 中打开 CSV 文件,添加行,然后以 CSV 格式保存。
  • CSV 是一种文本格式。您甚至不需要在 Excel 中打开它 - 只需使用 VBA 文本文件处理函数或 FileSystemObject。如果您不知道列布局,另一种选择是使用 ADODB 文本驱动程序 read the schema 连接到它,然后通过 INSERT 命令添加一行。
  • 我在问它如何用 vba 来做。每个人都知道如何打开它并添加新行。请不要将 csv 文件与其他内容相关联。我只能使用 ms 访问权限,我所拥有的只是 csv 文件。
  • 我想知道如何构建一个函数(csv 文件作为参数),它获取 csv 文件的标题数量和一个函数(csv 文件、标题数量、字段的数组值作为参数)添加新行
  • 阅读我上面评论中的链接答案。它确切地向您展示了如何阅读标题 - 您只需使用 a csv driver 而不是 Excel 连接到它。如上所述,添加一行是一个简单的插入语句。

标签: excel vba csv ms-access ms-access-2010


【解决方案1】:

只需录制一个宏来为您完成工作。我这样做了,我得到了下面的代码。

Sub Makro1()

Workbooks.Open Filename:="C:\Users\Excel\Desktop\Coding\R Programming\Merge Multiple CSV Files\CSV5.csv", Local:=True

Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Range("A1").Select
ActiveCell.FormulaR1C1 = "field1"
Range("B1").Select
ActiveCell.FormulaR1C1 = "field2"
Range("C1").Select
ActiveCell.FormulaR1C1 = "field3"
Range("A1").Select
ActiveWorkbook.Save

End Sub

【讨论】:

    【解决方案2】:

    FileSystemObject 是完成此类任务的绝佳工具:

    Public Function InsertLine()
    
        Const TmpExtension      As String = ".tmp"
        Const BakExtension      As String = ".bak"
    
        Dim FileSystemObject    As Scripting.FileSystemObject
        Dim SourceStream        As Scripting.TextStream
        Dim TargetStream        As Scripting.TextStream
    
        Dim Fields              As Variant
        Dim Values              As Variant
        Dim FieldCount          As Long
        Dim Item                As Long
        Dim Field               As String
        Dim FileName            As String
        Dim BaseName            As String
        Dim TempFileName        As String
        Dim Path                As String
        Dim Extension           As String
        Dim DotExtension        As String
        Dim TextLine            As String
    
        Set FileSystemObject = New Scripting.FileSystemObject
    
        ' File to modify.
        FileName = "c:\test\timezone.csv"
    
        BaseName = FileSystemObject.GetBaseName(FileName)
        Extension = FileSystemObject.GetExtensionName(FileName)
        Path = FileSystemObject.GetParentFolderName(FileName)
        DotExtension = "." & Extension
        TempFileName = BaseName & TmpExtension
    
        Set SourceStream = FileSystemObject.OpenTextFile(FileName, ForReading)
        Set TargetStream = FileSystemObject.CreateTextFile(TempFileName, ForWriting)
    
        ' Read header line.
        TextLine = SourceStream.ReadLine
        ' Copy header line.
        TargetStream.WriteLine TextLine
    
        ' Create line two.
        Fields = Split(TextLine, ",")
        ' FYI.
        FieldCount = UBound(Fields)
        ' Array to hold values.
        Values = Fields
        For Item = LBound(Fields) To UBound(Fields)
            Select Case Item
                Case 0
                    Field = "SomeValue"
                Case 1
                    Field = "OtherValue"
                Case 2
                    Field = "YetAValue"
                ' etc.
                Case Else
                    Field = CStr(Item)
            End Select
            Values(Item) = Chr(34) & Field & Chr(34)
        Next
        ' Write line two.
        TargetStream.WriteLine Join(Values, ",")
    
        ' Copy remaining lines.
        While Not SourceStream.AtEndOfStream
            TargetStream.WriteLine SourceStream.ReadLine
        Wend
        ' Close files.
        SourceStream.Close
        TargetStream.Close
    
        ' Rename files.
        FileSystemObject.MoveFile FileName, FileSystemObject.BuildPath(Path, BaseName & BakExtension)
        FileSystemObject.MoveFile TempFileName, FileSystemObject.BuildPath(Path, BaseName & DotExtension)
    
    End Function
    

    需要将引用设置为:Microsoft.Scripting.Runtime

    【讨论】:

    • 就我而言,重命名会出错,因为路径包含文件名。谢谢
    • 你是对的。不知何故,我的最后一次修正去了南方。请查看更正后的代码。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多