[VBA] Test de chaine de caractère sur une collection

Test de chaine de caractère sur une collection [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 23-08-2010 à 15:34:59    

Voila mon souci j'ai un extract de plusieurs DB stockées sur différentes feuilles de mon tableau excel.
Mon objectif est de vérifier si les intitulés de mes colonnes correspondent entre mes differentes feuilles et de récupérer ces intitulés sur une feuille de synthèse.
Mes contraintes sont
      - Si l'intitulé de ma colonne existe deja dans ma collection alors passer a la colonne suivante  
      - Si la colonne matchée n'existe pas dans la collection alors l'ajouter en bout de collection
 
Mon souci:
Je n'arrive pas à parcourir ma collection pour verifier si ma chaine de caractère est dejà présente à l'interieur.
J'ai essayé en faisant une boucle for avec un MaCollection.count en paramètre mais ca ne sort une erreur d'index
 
Voici le code sans la fonction de test

Code :
  1. Dim cursor As Integer, compteur As Integer, compteurFeuille As Integer, i As Integer
  2. Dim MesCollonnes As New Collection
  3. For compteurFeuille = 2 To Worksheets.Count
  4. cursor = 1
  5.     Do While Worksheets(compteurFeuille).Cells(1, cursor).Value <> ""
  6.    
  7.         MesCollonnes.Add Worksheets(compteurFeuille).Cells(1, cursor).Value
  8.        
  9.         'Remplissage des intitulés de colonnes pour le tableau de synthèse
  10.         Worksheets("Synthèse" ).Cells(5, cursor).Value = MesCollonnes.Item(cursor)
  11.         cursor = cursor + 1
  12.     Loop
  13.    
  14. Next compteurFeuille
  15. 'Affichage du contenu de la collection pour deboggage
  16. 'For compteur = 1 To MesCollonnes.Count
  17. '    MsgBox MesCollonnes(compteur)
  18. 'Next compteur


 
Merci pour votre aide


Message édité par spolnix le 23-08-2010 à 15:37:50

---------------
L’impossible est déjà fait, pour les miracles prévoir un délai.
Reply

Marsh Posté le 23-08-2010 à 15:34:59   

Reply

Marsh Posté le 24-08-2010 à 09:57:17    


 
 
   J'ai testé ton code sous Excel 2003, il marche sans plantage. Le seul problème, c'est que tu ne changes pas de ligne dans la feuille 'Synthèse' lorsque tu changes de feuille à traiter, si bien que seuls les résultats de la dernière feuille apparaissent.
 

Code :
  1. Worksheets("Synthèse" ).Cells(5, cursor).Value = MesCollonnes.Item(cursor)


 

Reply

Marsh Posté le 24-08-2010 à 10:29:25    

Ah oui effectivement tu as raison je n'avais pas encore remarqué ce bug.
En revanche aurais tu une solution pour tester si mon  
 

Code :
  1. Worksheets(compteurFeuille).Cells(1, cursor).Value


 
est déjà présent dans ma collection :
 

Code :
  1. Dim MesCollonnes As New Collection


---------------
L’impossible est déjà fait, pour les miracles prévoir un délai.
Reply

Marsh Posté le 24-08-2010 à 11:21:50    

J'ai essayé ça pour tester mes valeurs mais ca ne fonctionne pas ...  
 
Un coup de main serait le bienvenu ...
 

Code :
  1. Dim cursor As Integer, compteurCollection As Integer, compteurFeuille As Integer, i As Integer
  2. Dim MesCollonnes As New Collection
  3. For compteurFeuille = 2 To Worksheets.Count
  4. cursor = 1
  5.     Do While Worksheets(compteurFeuille).Cells(1, cursor).Value <> ""
  6.    
  7.         'Enregistreement de la première entrée de la collection
  8.         If MesCollonnes.Count = 0 Then
  9.         MesCollonnes.Add Worksheets(compteurFeuille).Cells(1, cursor).Value
  10.         End If
  11.        
  12.         'Affectation du nombre d'element de la collection à la variable pour décrementation
  13.         compteurCollection = MesCollonnes.Count
  14.        
  15.         Do While compteurCollection > 0
  16.             'Comparaison des valeurs de la collection avec la valeur de la cellule courante
  17.             If Worksheets(compteurFeuille).Cells(1, cursor).Value = MesCollonnes.Item(compteurCollection) Then
  18.                 cursor = cursor + 1 'Si la valeur "cursor" est égale à la valeur "compteurCollection" alors on passe a la colonne suisvante
  19.             Else
  20.                 compteurCollection = compteurCollection - 1 'Sinon on décremente pour parcourir le reste de la collection
  21.             End If
  22.         Loop
  23.        
  24.         'Si on est arrivé à 0 sans trouver de valeur égale dans la collection alors on ajoute l'intitulé de colonne en fin de collection
  25.         If compteurCollection = 0 Then
  26.         MesCollonnes.Add Worksheets(compteurFeuille).Cells(1, cursor).Value
  27.         cursor = cursor + 1
  28.         End If
  29.     Loop
  30.    
  31. Next compteurFeuille
  32. 'Remplissage des intitulés de colonnes pour le tableau de synthèse
  33. 'Worksheets("Synthèse" ).Cells(5, cursor).Value = MesCollonnes.Item(cursor)
  34. 'Affichage du contenu de la collection pour deboggage
  35. For compteur = 1 To MesCollonnes.Count
  36.     MsgBox MesCollonnes(compteur)
  37. Next compteur


---------------
L’impossible est déjà fait, pour les miracles prévoir un délai.
Reply

Marsh Posté le 24-08-2010 à 14:10:01    


Trace des variables:

Code :
  1. Do While Worksheets(compteurFeuille).Cells(1, cursor).Value <> ""
  2.  
  3.         MesCollonnes.Add Worksheets(compteurFeuille).Cells(1, cursor).Value
  4.         Debug.Print MesCollonnes.Count
  5.         Debug.Print MesCollonnes.Item(cursor)
  6.      
  7.         'Remplissage des intitulés de colonnes pour le tableau de synthèse
  8.         Worksheets("Synthèse" ).Cells(5, cursor).Value = MesCollonnes.Item(cursor)
  9.         cursor = cursor + 1
  10.     Loop


 
Le résultat s'affiche dans la fenetre execution. (Ctrl + G).
 
Il faut voir si cette variable est bien remplie.
 

Reply

Marsh Posté le 24-08-2010 à 15:30:01    

Ok effectivement avec ton astuce j'ai vu que je sortais pas de mon while quant il fallait :)  
J'ai rajouté un booléen pour répondre à cette contrainte.
 
Merci pour ton aide
 

Code :
  1. 'Affectation du nombre d'element de la collection à la variable pour décrementation
  2.         compteurCollection = MesCollonnes.Count
  3.         sortieBoucle = False
  4.        
  5.         Do While compteurCollection > 0 And sortieBoucle = False
  6.             'Comparaison des valeurs de la collection avec la valeur de la cellule courante
  7.             If Worksheets(compteurFeuille).Cells(1, cursor).Value = MesCollonnes.Item(compteurCollection) Then
  8.                 cursor = cursor + 1 'Si la valeur "cursor" est égale à la valeur "compteurCollection" alors on passe a la colonne suisvante
  9.                 sortieBoucle = True
  10.             Else
  11.                 compteurCollection = compteurCollection - 1 'Sinon on décremente pour parcourir le reste de la collection
  12.             End If
  13.         Loop


---------------
L’impossible est déjà fait, pour les miracles prévoir un délai.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed