Requête et tableau VBA
Comment transférer le contenu d’une requête dans un tableau Visual Basic ?
Avant de démarrer, il faut savoir qu’une requête se manipule en VBA à l’aide d’un objet Recordset
(DAO.Recordset
ou ADODB.Recordset
). Cet objet est déjà une forme de tableau en lui-même. Ce qui veut dire qu’il n’est généralement pas nécessaire de le transférer spécifiquement dans un tableau VBA.
Si malgré tout vous avez besoin de transférer le résultat d’une requête, voici une méthode (parmi d’autres) qui peut faire l’affaire. Dans l’exemple, une requête Analyse croisée est transférée dans un tableau VBA nommé avarValeurs
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Sub TransfertRequete() Dim rst As DAO.Recordset Dim avarValeurs As Variant Dim intLignes As Integer, intColonnes As Integer Dim intLig As Integer, intCol As Integer ' Ouvrir la requête Set rst = CurrentDb.OpenRecordset( _ "rqt Analyse croisée CA par rayon et client", _ dbOpenSnapshot) ' Lire le contenu de la requête ' et le transférer dans un tableau VBA avarValeurs = rst.GetRows(20) ' Les indices minimum démarrent à 0 ' Lire les indices maximum intColonnes = UBound(avarValeurs) + 1 intLignes = UBound(avarValeurs, 2) + 1 ' Afficher quelques infos Debug.Print "Nombre de colonnes/champs : " & intColonnes Debug.Print "Nombre de lignes/enregistrements : " & intLignes Debug.Print "-----" ' Afficher les titres des colonnes For intCol = 0 To intColonnes - 1 Debug.Print rst.Fields(intCol).Name & " | "; Next Debug.Print ' Afficher le contenu du tableau VBA For intLig = 0 To intLignes - 1 For intCol = 0 To intColonnes - 1 Debug.Print avarValeurs(intCol, intLig) & " | "; Next Debug.Print Next ' On ferme ! rst.Close Set rst = Nothing End Sub |
Quelques remarques supplémentaires :
- Le programme se contente d’afficher les résultats dans la fenêtre Exécution (
[Ctrl]
+G
). A vous d’améliorer selon vos besoins… - L’objet
Recordset
expose une méthodeGetRows()
qui lit un certain nombre de lignes dans une requête (ou une table), et qui construit automatiquement un tableau à 2 dimensions en fonction des résultats. - La variable qui reçoit les données doit être de type Variant ; elle devient un tableau bi-dimensionnel après avoir été alimentée par
GetRows()
. - Le nombre fourni à
GetRows()
précise le nombre de lignes à extraire du Recordset. Restez raisonnable : un grand nombre de lignes risque d’occuper pas mal de place en mémoire ! - La taille du tableau VBA est variable, en fonction du nombre de colonnes et de lignes de la requête. La fonction
UBound(avarValeurs)
donne l’indice maximum de la première dimension du tableau. Donc si vous avez 12 colonnes/champs,UBound(avarValeurs)
renvoie 11. Idem pour les lignes, mais il faut interroger la 2ème dimension du tableau, doncUBound(avarValeurs, 2)
. - Seules les données de la requête sont transférées dans le tableau VBA. Ce qui explique le bout de code spécifique destiné à afficher les noms des colonnes.
Bonjour,
Je debute en VBA access et j’avoue je bloque. j’ai besoin de faire appel depuis un bouton a une requete et apres l’afficher dans un tableau de mon formulaire et lui passer 2 paramètres mais je n’en suis pas la…
simplement quand j’appelle ma requête il genere déjà une erreur;
Argument non valide
Private Sub ventilation_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset(« facture_sfr_ventil », dbopsnapshot)
Pouvez vous m’aider ?
Pour que ce code fonctionne, il faut tout d’abord que la référence « Microsoft DAO » soit cochée dans le menu Outils/Références (elle peut s’appeler différemment selon la version d’Access).
Ensuite, l’ouverture de la requête est plutôt :
Il faut du coup qu’une requête « facture_sfr_ventil » existe dans la base.
Par contre, si c’est pour afficher des résultats à l’écran, je ferais différemment : les Recordsets sont pratiques pour le traitement de données en arrière-plan, moins pour l’affichage.
J’utiliserais plutôt un sous-formulaire, basé sur la requête, et placé sur le formulaire principal.
Ouala !
jabal > Merci de ton intérêt pour le site. Il ne s’agit pas vraiment d’un club, mais d’un ensemble de ressources autour d’Access. Si tu es intéressé, voici quelques adresses :
J’espère que ça peut aider.
Je veux etre membre de votre Club
MERCIIIIIIII ! ! ! ! !
ça marche, et en plus j’ai compris.
Il ne me reste plus qu’à mettre tout ça dans les cellules.
Merci pour toutes ces informations , il est super votre site !!