【问题标题】:Convert Excel columns to csv data将 Excel 列转换为 csv 数据
【发布时间】:2021-03-21 08:12:31
【问题描述】:

我希望 Excel 工作表的每一列都变成一个 CSV 文件,仅以该列作为其唯一的一行。

例如,从随附的 Excel 屏幕截图中,我的输出应该是两个 csv 文件(因为有 2 列),每个文件都有一行。
也就是说,第一个 csv 变量将来自 1-9,而第二个将来自 11-19。

【问题讨论】:

标签: excel vba


【解决方案1】:

你很幸运,我刚刚花了一周的时间来解决一个类似的问题。我根据您的问题对其进行了调整。

享受吧!

   Private Sub SplitColumnsInCSV()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim TableToSplit As ListObject
    Dim WorkbookPath As String
    Dim CSVLocation As String
    Dim FilePath As String
    Dim Folder As String
    Dim i, j, TableColumnCount As Integer
    Dim TempRangeToSplit As Range
   
    Set wb = ActiveWorkbook

    'Real name of your worksheet where your table is located
    Set ws = wb.Worksheets("Feuil1")

    'Real name of your table in your worksheet
    Set TableToSplit = ws.ListObjects("TableToSplit")

    For i = 1 To TableToSplit.ListColumns.Count
        'adjust temp range for each columns
        Set TempRangeToSplit = TableToSplit.ListColumns(i).Range
        
        'Create à folder with your CSV  where your workbook is located
        CSVLocation = wb.Path & "\CSV\"
        Folder = Dir(CSVLocation, vbDirectory)
        If Folder = "" Then MkDir CSVLocation
    
        'name the csv file
        FilePath = wb.Path & "\CSV\" & ws.Name & TempRangeToSplit.Cells(1, 1).Value & ".csv"
        
        'this piece of code have 2 loops in case of 2 dimentionnal range
        Open FilePath For Output As #1
            For j = 1 To TempRangeToSplit.Rows.Count
                For k = 1 To TempRangeToSplit.Columns.Count
                    cellValue = TempRangeToSplit.Cells(j, k).Value
                    If k = TempRangeToSplit.Columns.Count Then
                        Write #1, cellValue
                    Else
                        Write #1, cellValue,
                    End If
                Next k
            Next j
        Close #1
    Next i
End Sub

详细说明:

  • 我用要在 CSV 中提取的列填充临时范围
  • 我创建一个文件夹以防它不存在
  • 我创建了 csv 文件并为其命名
  • 我在 csv 文件中写入一列的所有行

小心,如果你重复使用宏,新的同名文件会覆盖旧的。

【讨论】:

  • 返回“无效的外部过程”并突出显示“set” wb = ActiveWorkbook
  • "invalid outside procedure" 出现是因为您没有将这段代码复制粘贴到“sub”中。我已经更新了添加 à sub 的答案,您现在需要指定表所在的工作表名称
  • 虽然设置 wb = ActiveWorkbook 阶段但我在必须输入表名的地方卡住了
  • 你知道excel的“表格”是什么吗?您需要选择所有数据和“插入”>“表”。然后每列的第一行将有一个新的过滤器选项。这意味着您的数据在表格中。您必须在左上角“表名”字段的“设计”选项卡中为该表命名。您需要在 Excel 表中具有与 vba 代码中相同的名称。
  • 我已经在 wetransfert 上上传了我的工作簿,wetransfer.com/downloads/… 你可以看到上面的所有内容,它运行良好
【解决方案2】:

将列导出到行

  • 将范围的每一列导出到一行.csv-file。
  • 调整常量部分中的值。
Option Explicit

Sub exportColumnsToCSV()
    
    Const FolderPath As String = "F:\Test\2021\66730122\"
    Const FileLeft As String = "File "
    Const csvDelimiter As String = "," ' or maybe ";"
    
    Dim rg As Range: Set rg = Range("A1").CurrentRegion
    Dim Data As Variant: Data = rg.Value
    Dim rCount As Long: rCount = UBound(Data, 1)

    Dim Result As Variant: ReDim Result(1 To rCount)
    Dim cNum As Long: cNum = FreeFile
    Dim cFile As String
    Dim c As Long, r As Long
    
    For c = 1 To UBound(Data, 2)
        For r = 1 To rCount
            Result(r) = Data(r, c)
        Next r
        cFile = FolderPath & FileLeft & c & ".csv"
        Open cFile For Output As #cNum
        Print #cNum, Join(Result, csvDelimiter)
        Close #cNum
    Next c

End Sub

【讨论】:

  • 非常感谢,这更像是它,只是我需要连续输出所有输出,而不是跨列分布它们的方式(如垂直排列)
  • 你得具体点,我不明白你在说什么。也许尝试一个实际的例子,例如在“A1:B9”范围内,我想将值“A1:A9”写入一个文件 1、2、3、4... 和值 ...。也许使用vbLf 作为DelimiterConst csvDelimiter As String = vbLf
  • 是的,比如 A1:A9 在新的 CSV 文件中应保留为 A1:A9,B1:B9 在第二个 CSV 文件中应保留为 B1:B9,依此类推
  • 到目前为止,输出很好,只是原始文件中的 A1:A9 值在转换为 CSV 文件时改变了排列,将 A1:A9 值拆分为 A1:I1...
  • B1:B9 不会变成A1:A9 而是保持B1:B9?你确定吗?这意味着第二个 csv 文件中的值是 ,11 ,12 ,13... 一个低于另一个。请务必确认。
猜你喜欢
  • 2014-11-19
  • 2012-10-10
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2020-03-08
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多