Si alguna vez ha necesitado generar una lista delimitada de valores de campos/consultas junto con otra información de su base de datos, sabrá que puede ser, en el mejor de los casos, un desafío, y una tarea que la mayoría de la gente cree imposible. Si, por ejemplo, le han pedido que genere un informe sobre quiénes fueron los 5 mejores vendedores (en orden descendente) para cada mes del año, o las 3 tiendas más cercanas a cada cliente, entonces probablemente tendrá que lidiar con consultas de tabla cruzada o combinar manualmente los resultados fuera de Access. Pero con la ayuda de un poco de código VBA, podrá generar resultados como los siguientes en cuestión de minutos…
| Ene | Juan, Sally, Bill |
| Feb | Sally, Adán, John |
| Mar | Adán, Sally, Bill |
Hay muchas ocasiones en las que sería útil poder mostrar una lista delimitada de resultados como parte de una consulta más grande: una lista de los 3 principales clientes más importantes para cada representante de ventas, las 5 tiendas más cercanas a cada uno de sus clientes que más gastan. , la lista continua.
Deja de coser tu informe
Si bien es más que posible obtener los detalles para crear ese tipo de informe, generalmente terminaría teniendo que unir manualmente los resultados fuera de Access como parte de una hoja de cálculo o informe.
El siguiente código elimina la necesidad de jugar con los resultados de la consulta fuera de Access y, en cambio, le permitirá producir el tipo de resultados que se muestran arriba con facilidad.
Primero, describamos lo que queremos que el código pueda hacer:
"Dada una consulta, devuelve x número de resultados, combinados en una sola cadena delimitada por y"
Antes de que comencemos
Antes de mirar el código, es importante tener en cuenta que si bien es posible crear una función VBA que sea más genérica y capaz de manejar cualquier combinación de consulta, hacerlo daría como resultado un código bastante largo, así que lo que haremos en este artículo es definir un caso de ejemplo y escribir la función para manejar ese caso. Si lo hace de esta manera, será mucho más fácil para usted poder recrear el código para satisfacer sus necesidades específicas.
El caso de muestra
Tenemos una base de datos de ventas que almacena detalles de las compras de los clientes, junto con la categoría de producto al que pertenece la compra. Queremos producir un informe que muestre, por mes, las 3 categorías principales en orden descendente.
Para simplificar, mantendremos el ejemplo en una sola tabla, aunque el principal funcionará independientemente de su configuración. La tabla que usaremos está configurada de la siguiente manera:
| Ventas |
| Nombre del cliente |
| Fecha de Transacción |
| Valor de la transacción |
| Categoría |
Obviamente, esta es una configuración demasiado simplificada, pero entiendes la idea.
Ahora - el código
Public Function CategoryList(Month As String, NumResults As Integer, SortAscending As Boolean, Delimiter As String) As String
Dim sSql, resultString As String
Dim rst As Recordset
Dim firstLine As Boolean
'Create our SQL string using the supplied parameters
sSql = "SELECT TOP " & NumResults & " [category] FROM sales GROUP BY Format([TransactionDate],""mmm""), sales.Category HAVING (((Format([TransactionDate], ""mmm"")) = """ & Month & """))"
If SortAscending Then sSql = sSql & " ORDER BY Sum(sales.TransactionValue) DESC;"
Set rst = CurrentDb.OpenRecordset(sSql)
firstLine = True
'Loop through the results, and create the string to return
With rst
Do While Not .EOF
If Not firstLine Then
resultString = resultString & Delimiter & .Fields("category")
Else
resultString = resultString & .Fields("category")
firstLine = False
End If
.MoveNext
Loop
End With
Set rs = Nothing
CategoryList = resultString
End Function
El código - explicado

Notará que verificamos si debemos agregar un delimitador a la cadena o no; sin esta verificación, terminaría con una cadena de resultado con un formato deficiente o tendría que agregar código para eliminar delimitadores no deseados. De esta manera, las cosas se mantienen ordenadas y agradables desde el principio.
Por supuesto, la función en sí se puede llamar desde una consulta, un informe o desde cualquier lugar que desee desde Access.
Reparar la base de datos de acceso corrupta
Si te encuentras bases de datos de Access corruptas cuando ejecuta el código anterior, es mejor usar alguna herramienta especializada para repararlos y recuperar todas las tablas de las bases de datos corruptas.
Introducción del autor:
Mitchell Pond es un experto en recuperación de datos en DataNumen, Inc., que es el líder mundial en tecnologías de recuperación de datos, incluyendo reparar problema de SQL y productos de software de recuperación de Excel. Para más información visite www.datanumen.com