2011-12-08 22 views
5

Ho bisogno di programmare tramite uno script VBA/VBS esportare tutti i fogli di lavoro (4 in totale e conosco i nomi) in foglio di lavoro denominato file csv nella stessa cartella, senza caricare Excel ed eseguire il macro manualmente.Esportare ogni foglio in un file CSV separato

Idealmente lo script dovrebbe contenere il filepath/filename.xls di origine e il percorso del file di esportazione come argomenti della riga di comando.

Ho letto molti script VBA di Excel per fare proprio quello in Excel e ne ho visto alcuni per caricare una cartella di lavoro Excel per esportare il primo foglio. Tuttavia quando provo a fondere i due ottengo questo errore:

(1,12) Expected End of Statement

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

Benvenuti a StackOverflow! Per favore pubblica il tuo codice in modo che altri possano aiutarti a eseguirne il debug. Mostrare lo sforzo è sempre apprezzato (e atteso). – Excellll

+0

Mi scuso, ho sentito che probabilmente ero fuori con il codice che stavo cercando di eseguire, quindi non volevo presentare.Come ho detto, ho un vba simile a quello che ottiene il primo foglio, questo codice è una semplice fusione con altri script di workbook. –

risposta

10

A per eseguire questo codice sarebbe simile a questo.

  1. Il file VBS può essere eseguito dalla linea di comando
  2. Il nome della cartella è ridondante come se il file esiste (test dell'oggetto FSO per questo) allora la cartella risiede nel mosto esistono anche
  3. Il codice automatizza Excel per separare i fogli

due punti fondamentale da notare rispetto a VBA sopra

  • si puo' t Dim un oggetto vbs come una stringa, cartella di lavoro ecc (da qui l'errore iniziale). Si può solo Dim loro
  • non è possibile utilizzare un nome costante come xlCSV in VBScript, quindi l'uso di 6 sotto come il formato 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 
    
+1

Questo è proprio quello che ho richiesto, molte grazie, un'ottima spiegazione e grazie per avermi fatto sapere dove stavo sbagliando. Ho imparato qualcosa qui. –

-1

per iniziare:

Dato una cartella di lavoro di Excel contenente un demo foglio come

------------------------------- 
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| 
------------------------------- 

ed un ADODB.Connection con una ConnectionString come:

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

tutto ciò che serve per .Execute è un'istruzione SELECT INTO come

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

arrivare:

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" 

(locale tedesco)

SELECT INTO creerà la sezione appropriata

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

nel file schema.ini automagicamente.

+0

Molte grazie Ekkehard tuttavia non sto utilizzando un linguaggio convenzionale il massimo che posso ottenere dal mio ambiente è quello di chiamare uno script VBS passando i parametri richiesti. Tuttavia, se la stringa di connessione può essere eseguita in VBA, potrei essere in grado di cambiare il file xls a cui posso mantenere una connessione. –

+0

Inoltre, non vedo come il tuo esempio funzioni con più fogli in una cartella di lavoro, mi manca qualcosa? –

Problemi correlati