miércoles, 13 de mayo de 2015

VBA: Una macro con SQL para evitar dobles búsquedas verticales.

Tiempo atrás explicaba un par de formas para obtener información a partir de un doble id de registro (ver 1 y ver 2).
Las técnicas empleadas, por supuesto, eran válidas, pero tenían el inconveniente que para grandes volúmenes de información se ralentizaba el proceso de cálculo en exceso.

Hoy veremos, como continuación del post anterior, la forma en que utilizando una sentencia SQL dentro de nuestro código VBA de programación obtener de manera mucho más ágil, la misma información


Partimos de nuestra información en dos hojas distintas, en la que código de producto está partido en dos columnas, haciendo cada Id único la combinación de dos campos....

VBA: Una macro con SQL para evitar dobles búsquedas verticales.



No olvidemos habilitar la Referencia: Microsoft ActiveX Data Objects 6.x Library.
Insertamos el código de la función en un módulo estándar de nuestro proyecto de VBA desde el editor de VB:

Sub QueryDobleRelacion_SQL_Excel()
'Abrimos el editor de Visual Basic y en el menú de Herramientas clic en Referencias
'añadimos: Microsoft ActiveX Data Objects 6.x Library.
Dim sConn As String
Dim sSQL As String
Dim oQt As QueryTable
Dim sh As Worksheet
Dim origen As String

'limpiamos la hoja destino
Sheets("Resultado").Cells.ClearContents
'obtenemos la ruta completa y nombre del fichero de trabajo
'donde se encuentran los datos!!!
origen = Application.ThisWorkbook.FullName
'establecemos la Sentencia de conexión para ficheros de Excel
sConn = "ODBC;DSN=Excel Files;DBQ=" & origen & ";"
'escribimos el código SQL necesario para Relacionar según dos criterios la información de ambas tablas
sSQL = "SELECT [Ppal$].[Num Id], [Ppal$].[Producto], [Precios$].[Precio]" & _
"FROM [Ppal$] LEFT JOIN [Precios$] ON " & _
"([Ppal$].[Producto] = [Precios$].[Producto]) AND ([Ppal$].[Num Id] = [Precios$].[Num Id]);"

'Generamos la Tabla resultante en la hoja final 'Resultado'
Set sh = Sheets("Resultado")
Set oQt = sh.QueryTables.Add(sConn, sh.Range("A1"), sSQL)
'Refresca la conexión y vuelca los datos...
oQt.Refresh

End Sub



El resultado lo vemos en las hoja 'Resultado':

VBA: Una macro con SQL para evitar dobles búsquedas verticales.



La clave de la sentencia SQL empleada es la doble relación construida, que requiere la igualdad al mismo tiempo del campo 'Producto' y 'Num Id' para devolver el dato de Precio existente... (instrucción SQL LEFT JOIN.. AND).

No hay comentarios:

Publicar un comentario en la entrada