Excel

Genere un CSV a partir de una columna de datos de Excel

De vez en cuando, recibo datos del cliente en Excel y quiero usar esa información en SQL (SSMS, MySQL,…) para crear alguna cláusula WHERE en una consulta. Así que voy y vengo, copio y pego, una y otra vez. ¡Es tedioso y lleva mucho tiempo!

Tiene que haber un mejor enfoque.

Ahora, si está ejecutando Excel 365, hay una nueva función que puede emplear TextJoin(), pero no voy a discutir eso aquí.

Quería, necesitaba, una solución universal para cuando estoy en el sitio de los clientes, algunos de los cuales ejecutan Excel 2003.


La solución es una función VBA muy simple que simplemente recorre las filas de una columna especificada y concatena los valores en una lista CSV (valores separados por comas) y así se creó lo siguiente:

'---------------------------------------------------------------------------------------
' Procedure : MakeCSVListingFromColumnValues
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : 
' Purpose   : Generate a CSV from the specified column of data in Microsoft Excel
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - 
' Req'd Refs: None required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sColumnLetter : Column to create a CSV listing from
' sDelim        : Delimiter to use around the values
' lStartRowNo   : Starting row of data
'
' Usage:
' ~~~~~~
' ? MakeCSVListingFromColumnValues("C")
'   Returns ->
'
' ? MakeCSVListingFromColumnValues("C", "'")
'   Returns ->
'
' ? MakeCSVListingFromColumnValues("C", "'", 2)
'   Returns ->
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2024-10-29              Initial Public Release
'---------------------------------------------------------------------------------------
Public Function MakeCSVListingFromColumnValues(sColumnLetter As String, _
                                               Optional sDelim As String = "", _
                                               Optional lStartRowNo As Long = 1) As String
    On Error GoTo Error_Handler
    Dim lLastRow              As Long
    Dim i                     As Long
    Dim sOutput               As String

    lLastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, Columns(sColumnLetter).Column).End(xlUp).Row

    For i = lStartRowNo To lLastRow
        sOutput = sOutput & sDelim & Range(sColumnLetter & i).Value & sDelim
        If i < lLastRow Then sOutput = sOutput & ", "
    Next
    MakeCSVListingFromColumnValues = sOutput

Error_Handler_Exit:
    On Error Resume Next
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: MakeCSVListingFromColumnValues" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function

Entonces, para valores numéricos, simplemente haría:

? MakeCSVListingFromColumnValues("C")

pero para valores textuales/de cadena haría:

? MakeCSVListingFromColumnValues("C", "'")

Retomando el caso anterior, si las primeras 2 filas fueran un encabezado y los valores solo comenzaran en la 3ª fila, entonces haría:

? MakeCSVListingFromColumnValues("C", "'", 3)

en todos los casos, podría copiar/pegar de una sola vez todo el CSV desde la ventana inmediata de VBA/VBE.

Ejemplos formales

Dada la columna de Excel

Podríamos extraer una lista haciendo:

? MakeCSVListingFromColumnValues("A", "'")

que daría salida:

'Name', 'Alec', 'Pearl', 'Palmer', 'Noelani', 'Ila', 'Clarke', 'Dorothy', 'Ferris', 'Jenette', 'Regan', 'Ivy', 'Lysandra'

Ahora, para omitir la primera fila que es el encabezado de una columna, simplemente haríamos:

? MakeCSVListingFromColumnValues("A", "'", 2)

que daría salida:

'Alec', 'Pearl', 'Palmer', 'Noelani', 'Ila', 'Clarke', 'Dorothy', 'Ferris', 'Jenette', 'Regan', 'Ivy', 'Lysandra'

y si no quisiéramos que los valores estuvieran entre comillas simples, simplemente haríamos:

? MakeCSVListingFromColumnValues("A", , 2)

que daría salida:

Alec, Pearl, Palmer, Noelani, Ila, Clarke, Dorothy, Ferris, Jenette, Regan, Ivy, Lysandra

Piense en complemento

Este es un pequeño gran bloque de código para agregar a un complemento, por lo que dicha funcionalidad está a solo un clic de distancia. ¡Al menos eso es lo que he hecho yo!

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba