No desenvolvimento de soluções VBA para bancos de dados, frequentemente há a necessidade de agrupar informações de diferentes registros em uma única linha. Isso é particularmente útil quando se deseja exibir múltiplos valores relacionados a uma chave primária de forma concatenada, como listar todos os membros de uma família em uma só célula de uma consulta. A função ConcatenateFieldValues
permite exatamente isso.
Essa função tem como base uma consulta SQL (Structured Query Language) que seleciona os valores de um campo específico. O código percorre todos os registros retornados e concatena os valores, separando-os por um delimitador definido pelo usuário — que, por padrão, é uma vírgula. Isso torna o uso da função flexível e aplicável a diversas situações em que diferentes separadores podem ser exigidos, como ponto-e-vírgula ou até mesmo uma quebra de linha.
Public Function ConcatenateFieldValues(pstrSQL As String, _
Optional pstrDelim As String = ", ") As String
' Criado por Duane Hookom, 2003
' Este código pode ser incluído em qualquer aplicação, desde que
' esta declaração seja mantida.
'
' Exemplo de uso:
' tblFamily com FamID como chave primária numérica
' tblFamMem com FamID, FirstName, DOB,...
' Retorna uma lista separada por vírgulas de FirstNames para um FamID
' Exemplo: John, Mary, Susan
' Em uma consulta:
' SELECT FamID,
' ConcatenateFieldValues("SELECT FirstName
' FROM tblFamMem WHERE FamID =" & [FamID]) AS FirstNames
' FROM tblFamily;
' ---------------------
' Modificado por Ken Snell 29 October 2005
'
' *** ESTA FUNÇÃO CONSTRÓI UMA STRING CONCATENADA QUE CONTÉM OS
' *** VALORES DE UM CAMPO PARA CADA REGISTRO EM UMA TABELA OU
' *** CONSULTA, SEPARADOS POR UM DELIMITADOR ESPECIFICADO.
Dim strConcat As String ' String que armazenará os valores concatenados
' Comentário sobre o uso de DAO
Dim db As DAO.Database
Dim rs As DAO.Recordset ' Objeto Recordset que será utilizado para armazenar os resultados da consulta
On Error Resume Next ' Ignora erros
strConcat = "" ' Inicializa a string concatenada
' Abre o banco de dados atual e executa a consulta passada como parâmetro (pstrSQL)
Set db = CurrentDb
Set rs = db.OpenRecordset(pstrSQL)
' Verifica se o Recordset não está vazio e processa os resultados
With rs
If Not .EOF Then ' Se não estiver no final do Recordset
.MoveFirst ' Move para o primeiro registro
Do While Not .EOF ' Continua até o final dos registros
strConcat = strConcat & .Fields(0) & pstrDelim ' Concatena o valor do campo com o delimitador
.MoveNext ' Move para o próximo registro
Loop
End If
.Close ' Fecha o Recordset
End With
Set rs = Nothing ' Libera a memória utilizada pelo Recordset
db.Close ' Fecha a conexão com o banco de dados
Set db = Nothing ' Libera a memória utilizada pelo objeto Database
' Remove o último delimitador da string concatenada
If Len(strConcat) > 0 Then strConcat = _
Left(strConcat, Len(strConcat) - Len(pstrDelim))
' Retorna a string concatenada final
ConcatenateFieldValues = strConcat
Exit Function
End Function
Um dos grandes diferenciais desta função é sua aplicabilidade em consultas dentro do Microsoft Access. Um exemplo clássico seria uma tabela que armazena os nomes de membros de uma família, vinculada a outra tabela que armazena as informações da própria família. Utilizando a função ConcatenateFieldValues
, é possível gerar uma consulta que retorne os nomes dos membros separados por vírgulas, tudo em um só campo, para cada família.
Que tal aprender estes códigos também:
- MS Access | Aplicando Função Concatenação de Valores nos Campos das Consultas
- MS Access | Utilizando SendKeys de Forma Eficiente
- MS Access | Automatizando a Compactação do Bancos de Dados
- MS Access | Como Gerenciar Links das Tabelas
- MS Access | Quebra de Texto em Linhas com Comprimento Máximo
- MS Access | Monitoramento de Conexões de Usuários
- MS Access | Mapeando 3.500 Erros com a Criação de Tabelas de Erros
- MS Access | Código para Registro de Logs
- MS Access | 17 Passos Essenciais para Melhorar seu Código VBA
- MS Access | Código VBA para Backup de Todas as Tabelas Comentado
A função também é extremamente eficiente, aproveitando o mecanismo de objetos DAO (Data Access Objects) para trabalhar diretamente com os registros no banco de dados. Além disso, a função foi projetada para que possa ser facilmente modificada para trabalhar com ADO (ActiveX Data Objects), caso o desenvolvedor precise acessar dados de fontes externas ao Access. Essa flexibilidade permite que a função seja aplicada em diferentes contextos, desde bancos de dados locais até conexões remotas.
Outro ponto importante é o tratamento de erros. Embora o código original utilize a instrução On Error Resume Next
, que ignora erros, é recomendável adicionar um tratamento de erros mais robusto em ambientes críticos. Isso ajudaria a capturar possíveis falhas de execução, como consultas malformadas ou falta de conexão com o banco de dados, proporcionando mais segurança e controle sobre o comportamento do aplicativo.
Em suma, a função ConcatenateFieldValues
resolve um problema comum em bancos de dados relacionais e é uma excelente ferramenta para gerar relatórios dinâmicos. Sua flexibilidade, eficiência e simplicidade a tornam uma função valiosa para desenvolvedores que buscam agregar dados de forma elegante e intuitiva, sem a necessidade de recorrer a técnicas mais complexas de programação.
Clique aqui e nos contate via What's App para avaliarmos seus projetos