Volcado de xls a csv con VBS

Volcado masivo con VBS

Si queremos volcar múltiples pestañas de un fichero Excel a fichero plano csv o dat con un separador que podemos elegir, haciendo la salvedad de no tener en cuenta la primera celda A1 o N(1,1). 
El código será como sigue, es un recorre pestañas con volcado a ficheros independientes con el nombre de cada pestaña y uso de la celda A1 como primer valor de cada registro. 
Ojo, al tener en cuenta la variante de tratamiento especial de A1, no podemos hacer ese famoso "volcado a todo trapo" que es un guardar as. En otra entrada contaremos eso, guardar como csv. Es más elegante, pero menos versátil. 
Con pequeñas variaciones en el código se puede realizar un volcado a un solo fichero o empezar a recorrer desde A2 o contemplar A1 como si fuese otro registro.
Para un fichero origen como este

Con unas pestañas como estas y misma estructura

Un código como este:

Bastará entonces, guardar el código como "convert_v.1.2.vbs" por ejemplo y ejecutar desde una consola de MSDOS o doble click desde escritorio, sin necesidad de instalar ningún programa y ni siquiera abrir el Excel en primer plano.
Se pueden parametrizar entradas para invocar como parámetros de entrada como fichero origen, destino, separador. Ojo que con R por supuesto también podemos hacerlo que menos! pero esto es un "más por menos" hacer algo con el mínimo de herramientas.

Dim folder_out_file
Dim extension 
Dim worksheetCount
Dim counter
Dim currentWorkSheet
Dim usedColumnsCount,usedRowsCount
Dim row,column
Dim top,left
Dim Cells,WriteStuff,f,name
Dim curCol,curRow
Dim word,separador,data_row
separador = ";"
excelPath = "C:\Users\adnent\Desktop\juan.xlsx"
folder_out_file = "C:\Users\adnent\Desktop\"
extension = ".dat"
WScript.Echo "Leemos datos de: " & excelPath
Set objExcel = CreateObject("Excel.Application")
objExcel.DisplayAlerts = 0
objExcel.Workbooks.open excelPath, false, true
workSheetCount = objExcel.Worksheets.Count
For counter = 1 to workSheetCount
 'WScript.Echo "Reading data from worksheet " & counter & vbCRLF
 Set currentWorkSheet = objExcel.ActiveWorkbook.Worksheets(counter)
 usedColumnsCount = currentWorkSheet.UsedRange.Columns.Count
 usedRowsCount = currentWorkSheet.UsedRange.Rows.Count
 top = currentWorksheet.UsedRange.Row
 left = currentWorksheet.UsedRange.Column
 name = currentWorksheet.name
 Set Cells = currentWorksheet.Cells
 Set WriteStuff = CreateObject("Scripting.FileSystemObject")
 Set f = WriteStuff.createTextfile(+folder_out_file & +name & +extension, True)
 For row = 0 to (usedRowsCount-1)
  data_row = ""
  For column = 0 to usedColumnsCount-1
   curRow = row+top
   curCol = column+left
   word = Cells(curRow,curCol).Value
   if curRow = 1 then
    'WScript.Echo "Pasamos a la siguiente fila, no tenemos en cuenta la primera fila" 
   else
    'WScript.Echo (word)
    if curCol = 1 then
     data_row = Cells(1,1).Value & +separador & +word 
    else
     data_row = +data_row & +separador & +word 
    end if
   end if
  Next 
  if curRow <> 1 then
   f.WriteLine +data_row
  end if 
  'WScript.Echo (+data_row)
 Next
 Set currentWorkSheet = Nothing
Next
objExcel.Workbooks(1).Close
objExcel.Quit
f.close
WScript.Echo ("Hemos terminado")
Set currentWorkSheet = Nothing
Set objExcel = Nothing

Obtenemos un resultado como este:

0 comentarios: