Экспорт каждого листа в отдельный файл csv

Мне нужно программно с помощью сценария 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

person Adam Mills    schedule 08.12.2011    source источник
comment
Добро пожаловать в StackOverflow! Пожалуйста, опубликуйте свой код, чтобы другие могли помочь в его отладке. Демонстрация усилий всегда приветствуется (и ожидается).   -  person Excellll    schedule 08.12.2011
comment
Извините, я чувствовал, что, вероятно, ошибся с кодом, который пытался выполнить, поэтому не хотел отправлять. Как я уже сказал, у меня есть аналогичная работа vba, которая получает первый лист, этот код представляет собой простое объединение с каким-то другим сценарием рабочей книги.   -  person Adam Mills    schedule 13.12.2011


Ответы (2)


vbs для запуска этого кода будет выглядеть примерно так .

  1. Файл vbs можно запустить из командной строки.
  2. Имя папки является избыточным, так как если файл существует (объект FSO проверяет это), то папка, в которой он находится, также должна существовать.
  3. Код автоматизирует Excel для разделения листов

два ключевых момента, которые следует отметить по сравнению с вашим VBA выше

  • вы не можете затемнить объект vbs как строку, рабочую книгу и т. д. (отсюда и ваша первоначальная ошибка). Вы можете только затемнить их
  • вы не можете использовать именованную константу, такую ​​​​как xlCSV, в vbscript, поэтому использование 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  
    
person brettdj    schedule 25.12.2011
comment
Это как раз то, что мне нужно, большое спасибо, очень хорошее объяснение, и спасибо, что дали мне понять, где я ошибаюсь. Я кое-чему здесь научился. - person Adam Mills; 12.01.2012
comment
Цените, если это можно изменить, чтобы прочитать любое имя файла вместо жесткого кодирования имени файла. - person RAP; 12.05.2021

Для начала:

Учитывая рабочую книгу 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|
-------------------------------

и ADODB.Connection с ConnectionString, например:

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 автоматически.

person Ekkehard.Horner    schedule 10.12.2011
comment
Большое спасибо, Эккехард, однако я не использую обычный язык, максимум, чего я могу добиться в своей среде, - это вызвать скрипт vbs с передачей необходимых параметров. Однако, если строку подключения можно запустить в VBA, я смогу переключаться между файлом xls, с которым я могу поддерживать соединение. - person Adam Mills; 13.12.2011
comment
Также я не вижу, как ваш пример работает с несколькими листами в книге, я что-то упустил? - person Adam Mills; 13.12.2011