Si vous avez déjà eu besoin de générer une liste délimitée de valeurs de champs/requêtes, ainsi que d'autres informations issues de votre base de données, vous savez que cela peut s'avérer complexe, voire impossible pour la plupart des gens. Par exemple, si l'on vous demande de générer un rapport indiquant les 5 meilleurs vendeurs (par ordre décroissant) pour chaque mois de l'année, ou les 3 magasins les plus proches de chaque client, vous risquez de devoir manipuler des requêtes croisées ou de combiner manuellement les résultats en dehors d'Access. Mais grâce à un peu de code VBA, vous obtiendrez des résultats comme ceux-ci en quelques minutes…
| Janvier | Jean, Sally, Bill |
| Février | Sally, Adam, John |
| mars | Adam, Sally, Bill |
Il serait souvent utile de pouvoir afficher une liste délimitée de résultats dans le cadre d'une requête plus large - une liste des 3 principaux clients les plus importants pour chaque représentant commercial, les 5 magasins les plus proches de chacun de vos clients les plus dépensiers. , la liste continue.
Arrêtez d'assembler votre rapport
Bien qu'il soit plus que possible d'obtenir les détails pour créer ce type de rapport, vous devrez généralement assembler manuellement les résultats en dehors d'Access dans le cadre d'une feuille de calcul ou d'un rapport.
Le code suivant évite d'avoir à manipuler les résultats de la requête en dehors d'Access et vous permet à la place de produire facilement le type de résultats indiqué ci-dessus.
Tout d'abord, décrivons ce que nous voulons que le code soit capable de faire :
"Étant donné une requête, renvoie x nombre de résultats, combinés en une seule chaîne délimitée par y"
Avant de commencer
Avant d'examiner le code, il est important de noter que s'il est possible de créer une fonction VBA plus générique et capable de gérer n'importe quelle combinaison de requêtes, cela entraînerait un code assez long, donc ce que nous allons faire dans cet article est de définir un exemple de cas et d'écrire la fonction pour gérer ce cas. En procédant de cette façon, il vous sera beaucoup plus facile de recréer le code pour répondre à vos besoins spécifiques.
Le cas de l'échantillon
Nous avons une base de données des ventes qui stocke les détails des achats des clients, ainsi que la catégorie de produit à laquelle appartient l'achat. Nous voulons produire un rapport qui montre, par mois, les 3 premières catégories par ordre décroissant.
Pour plus de simplicité, nous garderons l'exemple sur une seule table, bien que le principal fonctionnera quelle que soit votre configuration. Le tableau que nous allons utiliser est configuré comme suit :
| Sales |
| Nom du client |
| Date de la transaction |
| Valeur de transaction |
| Catégories |
Évidemment, il s'agit d'une configuration trop simplifiée, mais vous voyez l'idée.
Maintenant - le code
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
Le code – expliqué

Vous remarquerez que nous vérifions si nous devons ou non ajouter un délimiteur à la chaîne ou non - sans cette vérification, vous vous retrouveriez avec une chaîne de résultat mal formatée, ou vous devriez ajouter du code pour supprimer les délimiteurs indésirables - de cette façon, les choses restent belles et bien rangées dès le départ.
La fonction elle-même peut bien sûr être appelée depuis une requête, un rapport ou n'importe où depuis Access.
Réparer la base de données d'accès corrompue
Si vous rencontrez bases de données Access corrompues lorsque vous exécutez le code ci-dessus, il est préférable d'utiliser un outil spécialisé pour les réparer et récupérer toutes les tables des bases de données corrompues.
Introduction de l'auteur:
Mitchell Pond est un expert en récupération de données dans DataNumen, Inc., qui est le leader mondial des technologies de récupération de données, y compris réparer le problème SQL et des produits logiciels de récupération Excel. Pour plus d'informations, visitez www.datanumen.com