Macro VBA Excel: Guardar hoja de cálculo como archivo CSV

VBA - Visual Basic for Application

VBA es excelentemente adecuado para automatizar ciertas tareas recurrentes en el área de Microsoft Office. Por ejemplo, es posible que desee guardar los datos de un archivo Excel o una hoja de cálculo como archivo CSV o simplemente exportarlos como CSV para su posterior procesamiento. Aquí hay varias opciones, dependiendo de sus necesidades y aplicación.

Por supuesto, los ejemplos de código que se muestran a continuación deben adaptarse a cada aplicación. También puede haber diferentes requisitos de formato en el archivo CSV y el separador. En caso necesario, los valores también deben colocarse entre comillas si el separador, como una “comma“, también puede aparecer dentro de los valores.

Ejemplo de archivo Excel

Los siguientes ejemplos de código se basan en un pequeño archivo Excel que contiene varios datos formateados sobre productos y sus precios. Esto también muestra lo que puede ocurrir con el formato al exportar a un archivo *.csv.

Ejemplo de hoja de cálculo Excel con datos de productos para guardar en un archivo CSV
Ejemplo de hoja de cálculo Excel con datos de productos

En todos los ejemplos de código se inserta un tratamiento de errores (Application.DisplayAlerts) para suprimir los mensajes de error durante el guardado. Sin embargo, también puede omitir el código.

El archivo CSV se guarda en la misma ruta que el archivo Excel (fileNameCSV = ThisWorkbook.Path). Sin embargo, esto se puede adaptar como se desee.

Guardar hoja de cálculo como archivo CSV

El siguiente código VBA guarda una hoja de cálculo completa como un nuevo archivo CSV. Esto es conveniente y hace que el código VBA relativamente delgado.

Código

En nuestro ejemplo, la hoja de cálculo se llama “ListaProductos“. Por lo tanto, la activamos con este nombre antes de la exportación.

La función principal en este caso la cumple el método SaveAs. Con el parámetro FileFormat:=xlCSV especificamos que se debe guardar como CSV. En este caso, el parámetro Local también es importante. Si no establecemos este parámetro, el valor por defecto es false y se utiliza la configuración de idioma y país del editor VBA, que son Inglés/Estados Unidos por defecto. Esto puede llevar a que si la moneda tiene formato Euro, el fichero CSV contendrá dólares.

Sub exportWorksheetToCSV()
    
    Dim fileNameCSV As String
    Dim myWorksheet As Workbook
    
    'utilícelo para suprimir los mensajes de error durante la ejecución de la macro
    Application.DisplayAlerts = False
    On Error GoTo errorhandling
    
    'defina aquí la ruta y el nombre del archivo csv
    fileNameCSV = ThisWorkbook.Path & "\" & "products.csv"

    'activar la hoja de trabajo correspondiente
    ThisWorkbook.Sheets("ProductList").Activate
    ActiveSheet.Copy
    Set myWorksheet = ActiveWorkbook
    'utilizar el parámetro Local para obtener la configuración local de Excel, 
    'el valor por defecto es falso '(VBA configuración local se utiliza que por defecto es Englisch (USA)
    myWorksheet.SaveAs Filename:=fileNameCSV, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    myWorksheet.Close
    
errorhandling:
    Application.DisplayAlerts = True
End Sub

Resultado

En las imágenes de abajo vemos que al guardar los datos CSV se intenta mantener el formato. Sin embargo, en este caso el parámetro Local estaba en False. Esto hace que los caracteres euro se conviertan de repente en caracteres dólar en el fichero CSV.

Archivo CSV con datos de Excel: toda la hoja de cálculo se exportó con el parámetro Local=False
hoja de cálculo exportada a archivo CSV con el parámetro Local=False

Si estableces Local a True entonces obtendrás la siguiente salida. Puedes ver que el signo del dólar ha desaparecido. En su lugar, ahora sale <0x80>, que según la tabla ASCII corresponde al símbolo.

Archivo CSV con datos de Excel: se ha exportado toda la hoja de cálculo
hoja de cálculo exportada a archivo CSV con el parámetro Local=True

Exportar sólo cierto rango de una hoja de cálculo como CSV

Esta variante es muy similar a la anterior, salvo que en lugar de guardar la hoja de cálculo completa, sólo se guarda un determinado rango (“Rango“) como CSV. Esto permite determinar con mayor precisión qué se exporta y qué se excluye.

Código

El rango se define a través de la variable miRango. Luego se copia el contenido de miRango en una nueva hoja de cálculo creada por VBA. El resto es entonces como en el ejemplo anterior simplemente guardar la nueva hoja de cálculo.

Sub exportRangeToCSV()
    
    Dim fileNameCSV As String
    Dim myWorkbook As Workbook
    Dim myRange As Range
    
    'utilícelo para suprimir los mensajes de error durante la ejecución de la macro
    Application.DisplayAlerts = False
    On Error GoTo errorhandling
    
    'defina aquí la ruta y el nombre del archivo csv
    fileNameCSV = ThisWorkbook.Path & "\" & "products_range.csv"
    'activar la hoja de trabajo correspondiente
    Set myRange = Range("A1:E5")
    myRange.Copy
    
    Set myWorkbook = Application.Workbooks.Add(1)
    myWorkbook.Sheets(1).Range("A1").PasteSpecial xlPasteValues
    'utilizar el parámetro Local para obtener la configuración local de Excel, 
    'el valor por defecto es falso '(VBA configuración local se utiliza que por defecto es Englisch (USA)
    myWorkbook.SaveAs Filename:=fileNameCSV, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    myWorkbook.Close
    
errorhandling:
    Application.DisplayAlerts = True
End Sub

Resultado

Sin embargo, el resultado se ve un poco diferente. Al copiar el rango en una nueva hoja de cálculo, se pierde el formato. Por eso aquí no se ven símbolos de moneda ni signos de porcentaje como salida, sino sólo los valores sin procesar.

El rango de una hoja de cálculo se exportó a CSV
Datos CSV de un rango de Excel

Compilar y dar salida a los datos CSV manualmente

En la siguiente variante de código, los datos CSV se compilan primero manualmente en una variable de cadena utilizando bucles For y luego se guardan en un archivo. Este método ofrece la mayor flexibilidad porque, por un lado, se pueden seleccionar exactamente los campos de Excel que se van a exportar y, por otro, porque insertando código adicional se pueden formatear los valores exactamente de la manera que se necesite más tarde en el CSV. Por ejemplo, usted mismo puede decidir si desea exportar un signo de moneda o un signo de porcentaje o si sólo desea exportar valores brutos.

En esta variante, también puede definir usted mismo el signo de separación.

Código

Sub exportRangeManuallyToCSV()
    Dim FSO As New FileSystemObject 'necesidad de establecer una referencia a la biblioteca de ejecución de secuencias de comandos VB "Microsoft Scripting runtime
    Dim fileNameCSV As String
    Dim myWorkbook As Workbook
    Dim myRange As Range
    Dim rowNum As Integer
    Dim colNum As Integer
    Dim csvText As String

    'utilícelo para suprimir los mensajes de error durante la ejecución de la macro
    Application.DisplayAlerts = False
    On Error GoTo errorhandling

    'defina aquí la ruta y el nombre del archivo csv
    fileNameCSV = ThisWorkbook.Path & "\" & "products_range_manuelly.csv"
    'define and copy range to new worksheet
    Set myRange = Range("A1:E5")
    rowNum = myRange.Rows.Count
    colNum = myRange.Columns.Count
    csvText = ""
    
    For i = 1 To rowNum
        For j = 1 To colNum
            csvText = csvText & Chr(34) & myRange(i, j).Value & Chr(34) & Chr(59)
        Next
        'eliminar el último signo separador
        csvText = Left(csvText, Len(csvText) - 1)
        csvText = csvText & vbCrLf
    Next
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FileToCreate = FSO.CreateTextFile(fileNameCSV)
    FileToCreate.Write csvText
    FileToCreate.Close
    
errorhandling:
    Application.DisplayAlerts = True
End Sub

Con este código, se recorre el rango de Excel deseado (variable miRango) columna a columna y fila a fila. Mediante Chr(34) se entrecomillan los valores Excel de una celda. Chr(59) es el carácter de separación, en este caso un punto y coma.

Ponerlos entre comillas puede ser importante si los valores contienen el mismo carácter que el de separación.

Resultado

Si a continuación ejecutamos esta macro VBA, obtendremos los siguientes datos CSV.

Los valores de los campos de Excel se escribieron manualmente en un archivo CSV
Datos CSV creados manualmente

Dado que sólo se accede a la propiedad de valor de la celda de Excel respectiva, aquí sólo tiene los valores en bruto, es decir, sin formato de moneda o porcentaje. Sin embargo, tiene la opción de especificar en el código qué formato se debe mostrar ajustando la cadena csvText en consecuencia.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *