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.

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.

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.

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.

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.

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.