Chargé directement une Listbox sans doublon

Bonjour,

J'ai vraiment du louper iune étape dans mon appretissage VBa,

J'ai actuellement une requette qui recupere les données dans un BD. j'ecris ses données sur un onglet puis je charge ma listebox sans doublon avec les donnée ecrite.

je pense que je dois pouvoir faire ca directement sans avoir à les ecrires dans un onglet...

Dim oShR As Worksheet
    Dim Requete As String
    Dim oRS As Recordset
    Dim iCol As Integer

    'connexion à la base
    ConnectionDB
     Requete = "SELECT toto.nom_link "
     Requete = Requete & " from thermo.parametres as toto"
    'onglet destination
    Set oShR = Sheets(2)
    'exécute la requête, résultat dans un RecordSet
    Set oRS = oConnect.Execute(Requete)

    'copie les données du recordset dans l'onglet
    oShR.Range("A2").CopyFromRecordset oRS

    'titres de colonnes
    For iCol = 0 To oRS.Fields.Count - 1
        oShR.Cells(1, iCol + 1).Value = oRS.Fields(iCol).Name
    Next iCol

    Set oRS = Nothing

    Set oShR = Nothing

    'fermeture de la connexion
    oConnect.Close
    Set oConnect = Nothing

puis dans dans ma listbox

     On Error Resume Next
    'boucle sur les cellules de la colonne A
    For Each Cell In Range("A2:A" & i)
        'Stocke les données dans une collection
        '(La collection n'accepte que des données uniques et permet donc
        ' de filtrer facilement les doublons).
        Unique.Add Cell, CStr(Cell)
    Next Cell
    On Error GoTo 0
    For Each Valeur In Unique
        Me.ListBox1.AddItem Valeur
    Next Valeur

Avez vous une idée car mes tentatives de ne pas passer par l'ecriture sur une feuille est purement catastrophique ! ( j ose même pas vous montrer le code)

Merci a vous

Bonjour,

peut-être voir cette discussion :

https://forum.excel-pratique.com/viewtopic.php?f=2&t=124492

A+

Merci Algoplus,

Je regarde ca

Bonjour le forum , Merci pour lien j'ai pu faire une petite avancer sur mon code

Donc du coup je charge bien l'ensemble des données dans ma listbox et c'est là mon probleme je n'arrive plus à avoir que des elements uniques ( au lieu d'avoir 15 occurence j'en ai 450)

Dim oRS As Recordset

ConnectionDB

    Requete = "SELECT toto.nom_link "
    Requete = Requete & " from thermo.parametres as toto"

    'exécute la requête, résultat dans un RecordSet
    Set oRS = oConnect.Execute(Requete)

    Dlsit = oRS.GetRows
    ListBox1.List = Application.Transpose(Dlsit)
    oRS.Close
    Set oRS = Nothing

Comment faire pour récuperer les donnée sans doublons ??

Merci

peut-être en modifiant la requête , du style Select Unique ...

malheuresement non,

peut etre au moment de le charger dans la listebox mais j'ai pas trouver la solution

je me suis fourvoyé, pas Unique ! , mais Distinct .

Sinon on peut utiliser un dictionary ( si on n'est pas sur Mac !) sur le tableau Dlsit :

.../...
Dim Dico, i as long
Dlsit = oRS.GetRows
Set Dico = CreateObject("Scripting.Dictionary")

For i = Lbound( Dlsit ) to Ubound( Dlsit )
     Dico(Dlsit (i))=""
Next

ListBox1.List = Dico.keys  '(ou peut-être      ListBox1.List = Application.Transpose(Dico.keys ) )
.../...

Non testé

A+

Distinct c'est parfait

Merci je valide !

Je me permet de rouvrir car j'avais oublier un detail de taille...

Je dois recuperer les données sur deux serveurs du coup je boucle sur chaque serveur, ma listebox ne garde en memoire que le dernier serveur requetté....

evidemment add.item ne fonctionne pas ou j'ai un encore un pb de syntaxe.

avec ca j'ai que le dernier serveur stocker

For NS = 1 To 2
ConnectionDB

    Requete = "SELECT Distinct app.nom_link "
    Requete = Requete & " from thermo.parametres as app"

    'exécute la requête, résultat dans un RecordSet
    Set oRS = oConnect.Execute(Requete)

    Dlsit = oRS.GetRows
    ListBox1.List = Application.Transpose(Dlsit)
    oRS.Close
    Set oRS = Nothing

Next NS

J'ai essayé un truc comme ca mais bon c'est pas l'idée du siecle

If NS = 1 Then Dlsit = oRS.GetRows
    If NS = 2 Then Dlsit2 = oRS.GetRows

    ListBox1.List = Application.Transpose(Dlsit) & Application.Transpose(Dlsit2)

Si tu as une idée ...

Le but est alors de n'avoir qu'un tableau pour initialiser la listbox. Il faut donc mettre les deux tableau "bouts à bout".

Une solution à tester :

For NS = 1 To 2
ConnectionDB
Dim TT, Taille as long, j as Long, Ind as long, XX as long, YY as long
    Requete = "SELECT Distinct app.nom_link "
    Requete = Requete & " from thermo.parametres as app"

    'exécute la requête, résultat dans un RecordSet
    Set oRS = oConnect.Execute(Requete)

    Dlsit = oRS.GetRows

    If NS = 1 Then
        TT = Dlsit
        XX=Ubound(Dlsit )
    End If
    If NS = 2 Then
        YY=Ubound(Dlsit )
        ReDim Preserve TT(1 To XX + YY)
        For j = 1 To YY
            Ind = XX + j
            TT(Ind) = Dlsit (j)
        Next
    End If

    oRS.Close
    Set oRS = Nothing
Next NS    

ListBox1.List = TT
'ou bien
'ListBox1.List = Application.Transpose(TT)

A+

Bonsoir et merci encore pour ta reponse si rapide,

Je vois bien le principe mais j'ai une erreur " l'indice n'appartint pas à la selection"

du coup j'ai essayé de trouver le probleme, selon mes tests :

lorsque je met ReDim Preserve TT(1 To XX + YY) en commentaire j'ai deux valeurs de qui remontent du serveur 1 et rien de serveur deux. Le plus etrange c'est qu'il crée une " colonne" j'ai l'impréssion

capture

Si je fait mon ancienne macro j'ai :

capture2

Etrange non ?

J'ai poussé un peu en me perdant sur le très bon site de JBOisgontier mais je n'ai pas la solution

Le seul truc v'est que je remet les valeurs sur 1 colonne mais c'est tous

si

 ReDim Preserve TT(XX + YY, 35)

le 35 est un chiffe aléatoire pour avoir toute les lignes mais je remonte pas les valeurs du 2 meme comme ca!

je recupere bien tout le server 1 sur colonne

Pour info

Serveur 2 :

serveur 2

Serveur 1 :

server 1

Bonne soirée

Peut être le tableau Dlsit crée à chaque itération est à 2dimensions ?

J'étais parti sur une solution de tableau 1dimension, puisque la requête ne ramène qu'un champ.

Pas facile de tester sans les données réelles !!

Ce tableau : 1 ou 2 dimensions ?

Haha bonne question

tous ce que j'ai trouvé qui pourrait nous aider à compter les ligne afin de savoir la taille du tableau c'est le RecordCount

 

  Set rsTtresfaible= New ADODB.Recordset
      rsTtresfaible.Open SQL_tersfaible , , adOpenKeyset, adLockOptimistic

      Msgbox rsTtresfaible.RecordCount

mais ors.recordcount =-1

je dirai que dans ce cas précis c'est 1 dimension, mais par la suite je travaille sur 6 colonnes donc 2 dimension non ?

je continue de regarder les cours pour comprendre comment ca fonctionne

je ne parle pas du nombre de ligne, mais du nombre de "colonnes" ( 1 colonne => 1 dimension, plusieurs colonnes => 2 dimensions)

c'est bien ca on tavaille que sur 1 colonne dans ce cas, mais par la suite mes requettes seront sur 6 colonnes.

Pour te remettre dans le contexte cette requette sert juste à l'utilisatuer à generer son fichier en selectionnant les groupes d'enceintes ( frigo congelo). Lorsque l'utilisateur a ses groupes predefini je genere les fichier et je ramenne 6 champs sur les 47 et qui correspondent aux selections faite dans le userform ( ceux que l'on fait actuellement).

4v10-b.xlsm (223.96 Ko)

Je joint egalement l'ensemble de la table extrait du serveur 1

Je te donnerai bien la main pour tester en directe sur la base mais je sais pas faire

Encore merci pour ton aide

je ne comprend pas comment la requête ramène 6 colonnes avec un select sur un champ ?

Autre essai avec 6 colonnes:

Dim T(1 To 2), NS As Integer, TT, Taille(1 To 2),i as integer, j as integer
...
For NS = 1 To 2
ConnectionDB

    Requete = "SELECT Distinct app.nom_link "
    Requete = Requete & " from thermo.parametres as app"

    'exécute la requête, résultat dans un RecordSet
    Set oRS = oConnect.Execute(Requete)

    Dlsit = oRS.GetRows
    Taille(NS) = UBound(Dlsit ,1)
    T(NS) = Dlsit 
      msgbox Lbound(Dlsit ,2) & " " & Ubound(Dlsit ,2) ' donnera le plus petit et le plus grand indice du tableau
    oRS.Close
    Set oRS = Nothing
Next NS    

ReDim TT(1 To Taille(1) + Taille(2), 1 To 6)
For i = 1 To Taille(1)
    For j = 1 To 6
        TT(i, j) = T(1)(i, j)
    Next
Next
For i = 1 To Taille(2)
    For j = 1 To 6
        TT(Taille(1) + i, j) = T(2)(i, j)
    Next
Next

ListBox1.List = TT
End Sub

donne moi les indices affichés si erreur ou anomalie

Je me suis mal exprimer je ramene 6 champs apres, dans le commandbuttonclick

Non pour l'instant j'en suis toujours au meme point cf capture d'ecran d'hier soir je ne stock manifestement pas les valeurs du server2. C'est une fois l'userform charger et que l'utilisateur a selectionner les groupes "nom-link" que je requette 6 champs pour lui creer sont classeur avec juste ces enceintes(frigo). Donc pour l'instant tout mon code fonctionne bien avec 1 serveur....

J'espere que mes explication sont un peu plus claire. désolé pour les imprésisions.

pour les 6 colonnes j'ai compris en parcourant les classeurs.

Il reste cependant à déterminer les indices de la deuxième dimension (comme l'affiche la MsgBox de mon dernier code)

même avec une seule colonne, il faut parfois utiliser l'écriture 2 dimensions pour que ça marche.

Le fait d'avoir les indices permet de savoir si on démarre à l'indice 0 ou bien 1 .

Je ne m'étais pas penché sur la partie requête ( pas équipé pour), mais je ne vois pas la différence dans la boucle NS. les deux itérations amèneront la même connexion !?

Et je pense que si ne "remonte " du serveur 2 c'est pour ça !

Je ne suis certain de comprendre l'histoire des deux connections je sais juste qu'il ya deux serveur avec des ip diffentes, donc pour moi il faut deux connections une pour chaque serveur. j'ai jamais travailler sur des requettes vers une base de données, j'ai donc des grand trou dans mes connaissances.

Deplus le SI devrai acquerir un 3 eme serveur donc une 3 eme ip je suppose. Donc il faut que mon code puisse prendre en compte tous ca. car il distribue les groupe de facon anarchique sur les serveurs.... donc certain services se retrouvent avec des enceines sur deux serveurs differents. L'ancienne version pointait que sur un serveur et sur 1 groupe donc on multipliait les fichier excel. Pour mon cas j'en avais 8 pour suivre correctement toute mes enceintes donc pas tres pratique. Et comme le gas qui a pondue l'ancienne version et qu'il n'est plus et qu'il aproteger son code par mdp je repars de zero, mais c'est peut etre pas plus mal

Rechercher des sujets similaires à "charge directement listbox doublon"