【问题标题】:How can I export a closed workbook sheet to a .CSV file?如何将已关闭的工作簿表导出到 .CSV 文件?
【发布时间】:2016-11-21 06:27:22
【问题描述】:

我目前正在研究一组 vba 函数,这些函数应该允许用户从 xls 或 xlsx 文件中导出多个工作表,并根据工作表的名称将它们全部导出为不同的文件格式。这是一个使用旧文件的非常具体的过程。

所选文件中的某些工作表应被视为原始数据,我想将它们导出为 .CSV 文件而不对数据进行任何更改。如果有帮助,我什至不需要“查看”数据来进行 IF 或其他逻辑处理。

我已经有一个函数可以从已关闭文件的特定工作表中的特定单元格中获取数据,但我无法弄清楚如何在不遍历所有数十亿个单元格的情况下从工作表中获取所有数据大部分是空的,只是为了检查 Cell(23785;GP) 中是否有数据。

这是我已经拥有的功能,它可能有助于理解预期的行为。

Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
    ByVal WBName As String, wsName As String, cellRef As String) As Variant
    Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "\" Then wbPath = wbPath & "\"
    If Dir(wbPath & "\" & WBName) = "" Then Exit Function
    arg = "'" & wbPath & "[" & WBName & "]" & wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function

必须在最后仍然关闭另一个工作簿,并且不对当前工作簿进行任何更改。至少,所做的所有更改都应该撤消,以便在选择文件后,用户只会在他的计算机上看到我的确认消息和新创建的文件,而在他的 Excel 中没有明显的差异。由于这将由既不是程序员也不是非常精通技术的人使用,所以任何弄乱他们当前可以同时用于某事的工作簿的人都会给我们一些抱怨。

【问题讨论】:

  • 看看通过ADO使用SQL。
  • 很抱歉,但这并没有太大帮助。我以前从未经常使用过 vba 或 excel,所以告诉我“通过 ADO 使用 SQL”只会告诉我有一种方法可以像读取数据库一样读取文件。我不知道怎么做,我还得导出到 csv 之后
  • 继续阅读会有所帮助,这不是代码编写服务。如果没有关于如何将文件保存为 CSV 的详细信息,我会感到震惊。

标签: vba excel csv export-to-csv


【解决方案1】:

此 Sub 将文件字符串和工作表名称作为参数创建一个 .CSV 文件,扩展名 .csv 附加到其先前的名称、工作表名称和扩展名。

Private Sub export_file_to_csv(src_path, sheet_name)
    Application.DisplayAlerts = False

    Set src_workbook = Workbooks.Open(src_path, , True)
    src_workbook.Sheets(sheet_name).Activate

    dst_path = src_path & " - " & sheet_name & ".csv"
    src_workbook.SaveAs Filename:=dst_path, FileFormat:=xlCSV
    src_workbook.Close

    Application.DisplayAlerts = True
End Sub

然后,您可以在另一个 sub 中根据需要多次调用它。

Sub main_sub()
    export_file_to_csv "C:\Users\username\Desktop\maps.xlsx", "Europe"
    export_file_to_csv "C:\Users\username\Desktop\maps.xlsx", "Asia"
    export_file_to_csv "C:\Users\username\Documents\budget.xls", "Sheet1"
End Sub

只需将此代码放在另一个工作簿中,编辑将导出为 CSV 的文件的路径和工作表名称,然后运行 ​​main_sub,它应该出现在宏菜单上。原始文件将保持不变,因为它们是以只读方式打开的。

希望对你有帮助!

【讨论】:

  • 非常感谢,这与我想要的非常接近。这是朝着正确方向迈出的一大步。唯一的问题是我不能只在第一张纸上运行它。我必须能够给出工作表的名称并使其在该工作表上运行,因为这些文件将包含大约十几个不同的工作表,没有特定的顺序,并且只有 3-4 个需要转换为 .CSV .你知道怎么做吗?
  • 已在答案中编辑。现在,您可以将文件路径和工作表名称传递给 Sub,以便 Excel 知道要为每个文件导出哪个工作表。每个生成的 CSV 文件的名称中都会包含选定的工作表名称。
  • 非常感谢!我接受了答案,因为它可以满足我的需要,但是有一个小问题。像“é”这样的特殊字符被逗号替换,这会弄乱它们的行。它看起来像一个编码问题。此外,生成的 CSV 比需要的要大。例如,在我的一张工作表中,所有数据都出现在 J 列之前,在我之后没有任何列包含任何数据或格式。生成的 CSV 有正确的行数,但每行都有数百个尾随逗号,中间没有数据。我需要的数据都在那里,但 csv 因此不必要地大。
  • 关于更改的字符,您的 windows/office 安装选择的语言是什么?嗯,超出的逗号是因为 Excel 中有一些行的数据比其他行多……是的,这是一个问题。除了最后一个之外,您的 CSV 是否有空单元格?也许我们可以弄清楚如何解决最后一个问题。
  • OP 正在讨论额外的列而不是不一致的列数。随着时间的推移,Excel 倾向于扩展其对单元格已用范围(行和列)的理解,这通常是由于边框格式或数据/格式已被删除。有时在 Excel 中,我会完全删除 Excel 可能包含在已用范围定义中的数据外部的行和列。在保存之前以编程方式删除列可能是解决 OP 问题的最快方法:Columns("J:IV").EntireColumn.Delete
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多