2011-12-08 24 views
5

Necesito programáticamente vía un script VBA/VBS exportar todas las hojas de cálculo (4 en total y conozco los nombres) a la hoja de cálculo llamada archivos csv en la misma carpeta, sin cargar Excel y ejecutar el macro manualmenteExportar cada hoja a un archivo csv diferente

Idealmente, la secuencia de comandos tomaría en la ruta de archivo de origen/nombre de archivo.xls y la ruta de archivo de exportación como argumentos de línea de comandos.

He leído muchos scripts de Excel VBA para hacer justamente eso en Excel y he visto algunos para cargar un libro de Excel para exportar la primera hoja. Sin embargo cuando intento de mezclar los dos me sale este error:

(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

Bienvenido a Stackoverflow! Por favor, publique su código para que otros puedan ayudar a depurarlo. Mostrar esfuerzo siempre es apreciado (y esperado). – Excellll

+0

Disculpas, sentí que probablemente estaba muy lejos con el código que estaba tratando de ejecutar, por lo que no deseaba enviarlo.Como dije, tengo un vba similar que funciona y que obtiene la primera hoja, este código es una amalgama simple con alguna otra secuencia de comandos en el libro de trabajo. –

Respuesta

10

A para ejecutar este código se vería algo como esto.

  1. El archivo VBS se pueden ejecutar desde la línea de comandos
  2. El nombre de la carpeta es redundante, ya que si el archivo existe (las pruebas objeto del FOE para esto) a continuación, la carpeta que reside en el mosto también existe
  3. El código automatiza Excel para separar las hojas

dos puntos clave a destacar en comparación con su anterior VBA

  • se puede' t Atenúe un objeto vbs como una cadena, libro de trabajo, etc. (de ahí su error inicial). Sólo se puede atenuarlos
  • no se puede utiliza una constante llamada como xlCSV en VBScript, por lo tanto, el uso de 6 a continuación como el 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

Eso es justo lo que necesitaba, muchas gracias, una muy buena explicación y gracias por dejarme saber dónde me estaba yendo mal. He aprendido algo aquí. –

-1

Para empezar:

Dado un libro de Excel que contiene una demostración de hoja como

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

y un ADODB.Conexión con un ConnectionString como:

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

es una instrucción SELECT INTO como

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

llegar:

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" 

(configuración regional alemana)

comunicado

El SELECT INTO va a crear la sección correspondiente

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

en el archivo schema.ini automágicamente.

+0

Muchas gracias Ekkehard, sin embargo, no estoy usando un lenguaje convencional. Lo máximo que puedo lograr de mi entorno es llamar a un script vbs mientras paso los parámetros requeridos. Sin embargo, si la cadena de conexión se puede ejecutar en VBA, entonces podré cambiar el archivo xls al que puedo mantener una conexión. –

+0

Además, no veo cómo funciona tu ejemplo con varias hojas en un libro de trabajo, ¿me falta algo? –

Cuestiones relacionadas