【问题标题】:Export each sheet to a separate csv file将每张工作表导出到单独的 csv 文件
【发布时间】:2012-01-16 03:01:17
【问题描述】:

我需要通过 VBA/VBS 脚本以编程方式将所有工作表(总共 4 个,我知道名称)导出到同一文件夹中名为 csv 文件的工作表,而无需加载 excel 并手动运行宏。

理想情况下,脚本会将源文件路径/文件名.xls 和导出文件路径作为命令行参数。

我已经阅读了许多 Excel VBA 脚本,用于在 Excel 中执行此操作,并且我看到了一些用于加载 excel 工作簿以导出第一张工作表的脚本。但是,当我尝试将两者混合时出现此错误:

(1,12) 预期语句结束

Dim source As Workbook
Set source = Application.Workbooks.Open(WScript.Arguments.Item(0), ReadOnly:=True)
For Each sheet In source.Sheets
.SaveAs Filename:= WScript.Arguments.Item(1) & Source.Sheets.Name, FileFormat:=xlCSV
Next sheet
wb.Close

【问题讨论】:

  • 欢迎来到 StackOverflow!请发布您的代码,以便其他人可以帮助调试它。表现出努力总是受到赞赏(和期望)。
  • 抱歉,我觉得我试图执行的代码可能离我很远,所以不想提交。正如我所说,我有一个类似的 vba 工作,它确实获得了第一张工作表,这段代码是与工作簿脚本中的其他一些代码的简单合并。

标签: excel csv vbscript vba


【解决方案1】:

运行此代码的 看起来像这样。

  1. vbs 文件可以从命令行执行
  2. 文件夹名称是多余的,好像文件存在(FSO 对象对此进行测试),那么它所在的文件夹也必须存在
  3. 代码自动化 Excel 以分隔工作表

与上面的 VBA 相比,需要注意两个关键点

  • 您不能将 vbs 对象调暗为字符串、工作簿等(因此您的初始错误)。您只能将它们调暗
  • 您不能在 vbscript 中使用命名常量,例如 xlCSV,因此使用下面的 6 作为 CSV 格式

    Dim strFilename  
    Dim objFSO  
    Set objFSO = CreateObject("scripting.filesystemobject")  
    strFilename = "C:\temp\test.xlsx"  
    If objFSO.fileexists(strFilename) Then  
      Call Writefile(strFilename)  
    Else  
      wscript.echo "no such file!"  
    End If  
    Set objFSO = Nothing  
    
    Sub Writefile(ByVal strFilename)  
    Dim objExcel  
    Dim objWB  
    Dim objws  
    
    Set objExcel = CreateObject("Excel.Application")  
    Set objWB = objExcel.Workbooks.Open(strFilename)  
    
    For Each objws In objWB.Sheets  
      objws.Copy  
      objExcel.ActiveWorkbook.SaveAs objWB.Path & "\" & objws.Name & ".csv", 6  
      objExcel.ActiveWorkbook.Close False  
    Next 
    
    objWB.Close False  
    objExcel.Quit  
    Set objExcel = Nothing  
    End Sub  
    

【讨论】:

  • 这正是我所需要的,非常感谢,一个很好的解释,感谢你让我知道我哪里出错了。我在这里学到了一些东西。
  • 赞赏是否可以将其更改为读取任何文件名而不是硬编码文件名。
【解决方案2】:

让您开始:

给定一个 Excel 工作簿,其中包含一个类似 Demo 的表格

-------------------------------
SELECT * FROM Demo
-------------------------------
|F1|F2 |F3        |F4        |
| 1|1.1|12/10/2011|text elm 1|
| 2|2.2|12/11/2011|text elm 2|
| 3|4.4|12/12/2011|text elm 3|
-------------------------------

和一个带有 ConnectionString 的 ADODB.Connection,例如:

Provider=MSDASQL.1;Extended Properties="DBQ=<FullPathToYourXls>;Driver={Microsoft
 Excel Driver (*.xls)};

你只需要 .Execute 就是一个 SELECT INTO 语句,比如

SELECT * INTO [Demo.csv] IN '<PathToYourCsvFolder>' 'Text;' FROM Demo

得到:

type ..\data\ExcelCsv2\Demo.csv
"F1";"F2";"F3";"F4"
1;1,10;10.12.2011 00:00:00;"text elm 1"
2;2,20;11.12.2011 00:00:00;"text elm 2"
3;4,40;12.12.2011 00:00:00;"text elm 3"

(德语语言环境)

SELECT INTO 语句将创建适当的部分

[Demo.csv]
ColNameHeader=True
CharacterSet=1252
Format=Delimited(;)
Col1=F1 Integer
Col2=F2 Float
Col3=F3 Date
Col4=F4 Char Width 50

自动在 schema.ini 文件中。

【讨论】:

  • 非常感谢 Ekkehard,但是我没有使用传统语言,我可以从我的环境中实现的最大功能是在传递所需参数的同时调用 vbs 脚本。但是,如果连接字符串可以在 VBA 中运行,那么我可以切换我可以保持连接的 xls 文件。
  • 另外,我看不到您的示例如何处理工作簿中的多个工作表,我是否遗漏了什么?
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2016-05-12
  • 2019-08-18
相关资源
最近更新 更多