将每个表单导出到单独的csv文件

6
我需要通过VBA/VBS脚本编程,将所有工作表(共4个,我知道它们的名称)以工作表命名的csv文件形式导出到同一文件夹中,而不需要加载Excel并手动运行宏。
理想情况下,脚本应该将源文件路径/文件名.xls和导出文件路径作为命令行参数输入。
我已经阅读了许多用于在Excel内完成此操作的Excel VBA脚本,并且我已经看到了一些用于加载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

4
欢迎来到 StackOverflow!请发布您的代码以便他人帮助调试。我们非常欢迎并期望您展示努力的证明。 - Excellll
抱歉,我觉得我尝试执行的代码可能完全错误,所以不想提交。正如我所说,我有一个类似的 VBA 工作,可以获取第一个工作表,这段代码是一些其他工作簿脚本的简单合并。 - Adam Mills
2个回答

15

运行此代码的文件应该长这样。

  1. vbs文件可以从命令行执行
  2. 文件夹名称是多余的,因为如果文件存在(FSO对象会测试此项),则包含它的文件夹也必须存在
  3. 该代码自动化Excel以分离工作表

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

  • you can't Dim a vbs object as a string, Workbook etc (hence your initial error). You can only Dim them
  • you can't used a named constant such as xlCSV in vbscript, hence the use of 6 below as the CSV format

    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  
    

1
这正是我所需要的,非常感谢,解释得非常好,谢谢你让我知道我的错误之处。我从中学到了些东西。 - Adam Mills
感谢您能将此更改为读取任何文件名,而不是硬编码文件名。 - RAP

-1

让我们开始吧:

假设有一个包含名为Demo的工作表的Excel工作簿,如下所示:

-------------------------------
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)};

你所需要执行的只是一个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文件。 - Adam Mills
我也不知道你的示例如何在工作簿中使用多个工作表,我有什么遗漏吗? - Adam Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接