Ordre des dimensions d'un Array

Bonjour,

je viens de me pencher sur un exemple de retranscription d'une table provenant d'une feuille xl dans un MsgBox

Ceci m'amène à me pencher sur les dimensions d'un tableau et leur ordre d'apparition/nommage. Avec la fonction LBound, dans le fichier joint, on va identifier les lignes via l'argument "2" :

" For i = LBound(reponse, 2) To UBound(reponse, 2) 'afficher le contenu de la tablea
ligne = ligne & vbCrLf
For j = LBound(reponse) To UBound(reponse)
ligne = ligne & reponse(j, i) & vbTab
Next j
Next i "

alors que communément les lignes sont citées en premier lorsque l'on fait référence à une position déterminée sur la base ligne/colonne.

On peut meme constater ça sur cette page-ci Dimensions du tableau - Visual Basic | Microsoft Docs. (Après j'ai remarqué que les dimensions "table" peut être placé soit en 1er soit en 3ème selon les sources)

Donc je me suis demandé pourquoi l'ordre des dimensions de l'Array "reponse" voit arriver en premier celle des colonnes.

Est ce que cela n'est tout simplement pas du au fait que réponse est issu :

des champs [article] et [quantite] de la requete SQL "requete" + la méthode getrows de ces champs ?

4dbtestado.xlsm (16.68 Ko)

Ce qui fait que la dimension ligne dans le processus arrive en deuxième puisque tiré à partir d'une dimension de deux valeurs.

Bref, je n'arrive pas à expliciter plus clairement mon questionnement ...

Auriez-vous quelques éclaircissements ou confirmations à proposer ?

Merci :)

Bonjour,

.... Avec la fonction LBound, dans le fichier joint, on va identifier les lignes via l'argument "2" ...

La réponse est non... LBound(reponse, 2) ne permet pas d'identifier les lignes du tableau reponse via l'argument "2". Cette fonction renvoie le plus petit indice d'un tableau (ici reponse) pour la dimension indiquée (ici 2)

Dans For i = LBound(reponse, 2) To UBound(reponse, 2), (reponse, 2) indique la 2ème dimension du tableau reponse donc les "colonnes"

Cette boucle va donc parcourir les colonnes du tableau reponse

Avec For j = LBound(reponse) To UBound(reponse) on va parcourir les lignes. reponse sans indication de la dimension désigne par défaut la première.

Dans ligne = ligne & reponse(j, i) & vbTab, on retrouve bien comme vous le dites, ligne en premier et colonne en second :

... reponse(ligne j, colonne i) ...

A+

tableaureponse valeurs

Bonsoir,

Je suis assez étonné car pourtant les indices de "i" s'incrémentent de 0 jusqu'à 4 contre de 0 jusqu'à 1 pour "j"; ce qui correspond bien à 5 lignes et 2 colonnes.

Ce qui laisse a supposer que LBound(reponse, 2) donne bien la plus petite valeur de réponse mais dans sa dimension de ligne.

Ci-joint des captures de la console de débogage qui montrent que :

"requete_fields.png" -> le requete comporte 2 items dans Fields, portant respectivement les nom "articles" et "quantite".

"tableauReponse_elements.png" -> l'Array reponse comporte deux éléments qui sont reponse(0) et reponse(1)

"tableauReponse_valeurs.png" - > les valeurs qui composent cet array sont listées.

Si, pour exemple, on prend reponse(0,1), on obtient comme valeur "b". Ce qui correspond à la valeur se trouvant première colonne/deuxième ligne du tableau.

Que l'on m'arrête si je me trompe mais là je suis quasi sûr de mon coup quant à ça ^^

Ce que je remarque c'est que l'on obtient des lignes (via reponse); et que ces lignes sont obtenus via requete, qui est composé de deux noms de colonnes.

Donc je me pose toujours la meme question l'argument "2" de LBound fait il référence aux lignes de la table puisqu'il "préexiste" à celles-ci les deux champs "articles" et "quantite" contenus dans requete ? .. :/

requete fields

Bonjour,

bah, je t'arrête dans ce cas.
L'explication d'algo est correcte.
Dans un tableau à 2 dimensions, la 1 est pour les lignes, la 2 pour les colonnes.
Ton tableau fait 2 lignes de 5 colonnes.
Ce n'est pas parce que ta boucle sur les colonnes est avant celle des lignes que ça en fait des lignes.
reponse(0,1) c'est ligne 1 colonne 2

Fais-toi sur feuille un tableau 5x5 d'aléatoires et compare ces 2 tableaux dans vba :

Sub test()
    Dim tabl1, tabl2
    tabl1 = [A1:E2].Value
    tabl2 = [A1:B5].Value
    Stop
End Sub

eric

Bonjour eriic

Merci pour ta réponse.

Cependant comme le montre la capture l'indice i va de 0 a 4 et c'est bien lui qui permet la progression via LBound(reponse, 2) To UBound(reponse, 2)

Et j lui ne va que de 0 à 1 via LBound(reponse) To UBound(reponse)

Je suis désolé mais je ne comprends pas du tout là oO

De plus, c'est juste après le " For i = LBound(reponse, 2) To UBound(reponse, 2) " que l'on ajoute un vbCrlf.

Et on peut aussi constater avec l'outils "variables locales", que c'est dans la boucle :

"For j = LBound(reponse) To UBound(reponse)
ligne = ligne & reponse(j, i) & vbTab
Next j"

qu'apparaissent dans la variable "ligne" les valeurs horizontales "a" VbTab "1" ....

indice i et indice j

Oh attends .... tu dis que mon tableau fait deux lignes et 5 colonnes. C'est de là que vient l'incompréhension :

Pour moi il fait deux colonnes et 5 lignes ... oO je ne comprends plus rien là XD

Je joins de nouveau le fichier. Là peut être qu'il y a quelque chose d'évident pour vous mais qui m'est compl

5dbtestado.xlsm (16.68 Ko)

ètement inconnu pour en arriver à considérer, en ne me basant que sur le visuel de la feuille excel, que le tableau fait 5 colonnes et deux lignes.

Est ce que la methode .getrows recupere les informations situées sous les noms de champs ''articles'' & ''quantite'' sous forme de ligne?

en gros ce que l'ont perçoit comme deux colonnes dans le tableau xcel prend la forme de deux lignes avec .getrows ?

je pose cette question car je pensais que ce qui definissait une colonne c'est qu'elle comporte une entete... Un nom de champs

Si tu avais fait l'effort de faire le test que je te proposais, tu aurais admis l'évidence et n'aurais plus de questions à ce sujet.
Rien d'autre à ajouter pour ma part.
eric

bonjour Eriic

Ca n'etait pas un manque de volonté de ma part , je suis en deplacement depuis hier sans mon pc :/

mais j'avais toujours cette question en tete par rapport a cette notion de ligne/colonne qui semblent s'inverser.

Je regarderai donc attentivement ton exemple vendredi soir a mon retour.

Merci a toi,

Bonjour Eriiic,

Je viens d'effectuer le test que tu m'as proposé effectivement on peut voir clairement dans la console de variables locales ce qui est admis comme étant lignes et colonnes; et j'ai bien pu voir la dimension des lignes en premier.

Ce que je ne comprenais pas c'est que la méthode ".getrows" renvoie une table dont chaque Fields trouvé dans la requete sql devient, a priori, une ligne.

C'est cet inversement que je ne comprenais pas. Mais quelque part j'en comprends un peu la logique, dans le sens où à partir d'un nom de champs on demande de capter toutes les valeurs qui se trouvent à sa suite. Donc cette suite de valeurs devient en quelque sorte une ligne, même si visuellement dans la feuille Excel on voit une colonne. Enfin c'est ce que je déduis à partir de ce que je vois de "reponse" dans la console; ce qui suit les champs captés par la requete sql devienne des lignes avec .getrows

Merci de votre aide à tous les deux !

Bonjour,

je ne connais pas .getrows et ne pratique pas le SQL, je ne pourrais t'en dire plus à ce sujet.
Peut-être qu'un autre pourra...
eric

Rechercher des sujets similaires à "ordre dimensions array"