VBA - recordset avec un seul enregsitrement

zoummuoz

XLDnaute Nouveau
RESOLU - VBA - recordset avec un seul enregsitrement

Bonjour a tous,
Merci de votre interret.
Je suis sous excel 2003. Je manipule des recordset via ADO et sur MySQL.
Tout fonctionne à merveille, mes requêtes sont bien exécutées. Mes listbox, combo et autre se remplissement.
Mon seul soucis est lorsque la requête me retourne un seul enregistrement.
Ma fonction de requêtage passe le recordset à un tableau (variant) via .getrows. Un application.transpose est fait ensuite.
Il apparait que lorsque le recordset ne contient qu'un seul enregistrement, le tableau n'a plus de dimension. Toutes mes données retournées se retrouvent en colonne.
ex :
dans la BD : Nom, Prenom, Age
dans le tableau (variant) : nom
prenom
age

Meme un application.transpose(tableau) ne change rien.
C'est extrement gènant et je ne trouve toujours pas de solutions.
Toutes mes fonctions (generiques) traitent ces tableau avec des Ubound(tableau,2) et j'ai systematiquement des messages d'erreurs.

Avez vous deja été confronté a ce problème ?

suite du message :
https://www.excel-downloads.com/threads/alimentation-de-controles-combo-listview-listbox.118424/
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : VBA - recordset avec un seul enregsitrement

Bonsoir zoummuoz,

Pourquoi ne pas faire un recordset.Count
si le nombre d'enregistrement est >1 alors tu fais le transpose, sinon rien

Ou alors je n'ai pas tout saisi :p

A+
 

ledzepfred

XLDnaute Impliqué
Re : VBA - recordset avec un seul enregsitrement

bonsoir zoummuos,

inutile de créer un second post sur le même sujet, un petit up suffit. D'autre part si tu n'as pas eu de réponses (chose rarissime sur XLD) à ton premier post, c'est parce qu'il n'est pas facile de t'aider sans fichier (perso j'ai pas eu le courage de lire jusqu'au bout ton premier message, désolé).

Je suis pas un expert en la matière mais la solution est peut-être de compter le nb d'enregistrements retournés et si ce nombre est de 1, alimenter tes combo et listbox avec les données de ton recordset et une donnée virtuelle (comme des espaces), comme ça tes tableaux seraient toujours en 2 dimensions.
Mais je dis peut-être une connerie (vu que j'ai pas lu jusqu'au bout:D)

A+

edit: bonsoir Bruno M45
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : VBA - recordset avec un seul enregsitrement

Bonsoir à tous
Le problème est réel et je ne vois que deux solutions (en attendant que les experts donne LA solution).
Soit, comme le préconisent BrunoM45 et ledzepfred, traiter spécialement le cas d'un enregistrement unique, soit d'augmenter de un la dimension du tableau récepteur en lui donnant une ligne de titre (qui peut rester vide).
Dans le deuxième cas, les traitements du tableau se feront en utilisant
Code:
For i = [COLOR="Red"]2[/COLOR] To Ubound(TABLEAU, 1)
   [COLOR="SeaGreen"]' Code[/COLOR]
au lieu de
Code:
For i = [COLOR="Red"]1[/COLOR] To Ubound(TABLEAU, 1)
   [COLOR="SeaGreen"]' Code[/COLOR]
Cela peut-il s'adapter à votre problème ?​
ROGER2327
 

zoummuoz

XLDnaute Nouveau
Re : VBA - recordset avec un seul enregsitrement

Merci a tous pour votre intérêt.
Oui j'ai bien reposté le message et m'en excuse, mais n'ayant pas de réponse au bout de tout ce temps et connaissant le forum, je me suis dis que mon message n'était peut être pas très clair.
Je l'ai donc reformulé, et surtout raccourci.

Pour vous répondre BrunoM45 :
J'en suis arrivé bien sur à faire un test pour connaitre le nombre d'enregistrements dans le recordset. Mais application.transpose ne fonctionne pas sur le tableau !

Ajouter une ligne d'espace dans un combo est un peu dangereux a mon sens, car on connait le user final, la première chose qu'il va faire c'est sélectionner cette ligne et lancer une fonction - faudra alors traiter le cas etc etc...

La solution donnée ensuite par ROGER2327 me parait pas bête du tout et je m'en vais la tester!.

N'empêche que je ne comprend toujours pas pourquoi un recordset avec un seul enregistrement, récupéré dans un tableau via .getrow donne un tableau sans dimension,même si on lui applique autant de transpose que l'on veux. Si j'ai un recordset avec :
TOTO TITI TATA
je lui fait un tableau=rst.getrow, je vais avoir dans tableau :
TOTO
TITI
TATA
Ce qui et normal !. Mais je peu ensuite faire des application.transpose etc etc mon tableau restera
TOTO
TITI
TATA

Alors que si j'ai 2 lignes mini ans le recordset cela fonctionne...

Merci encore à tous et je vous donne mes avancées demain car je retourne sur le projet.
 

zoummuoz

XLDnaute Nouveau
Resolu : VBA - recordset avec un seul enregsitrement

Voila voila, pas d'autre solution trouvée ... :cool:
Mais toujour pas compris pourquoi ce besoin.:(:confused:


Code:
If dbRecset.RecordCount = 1 Then
        Dim Tableau() As String 'Tableau de sortie de la fonction
        ReDim Preserve Tableau(1 To 1, 1 To dbRecset.Fields.Count) 'Que l'on redimensionne suivant le nb de champs retournés
        Dim col As Integer 'Nb de champs a traiter (pour la boucle suivante)
        col = 1 
            While col < dbRecset.Fields.Count + 1
                'MsgBox dbRecset.Fields.Item(col - 1), vbCritical, "valeur"
                Tableau(1, col) = dbRecset.Fields.Item(col - 1)
                col = col + 1
            Wend
            
         MysqlTableau = Tableau 'La fonction s'appelle MysqlTableau (elle prend un requete et retourne un tableau (array)
         Exit Function
    End If

Merci a tous pour votre soutient.
 
Dernière édition:

Statistiques des forums

Discussions
312 545
Messages
2 089 471
Membres
104 174
dernier inscrit
Jeanpy NGUVUMALI SAIDI