Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2662 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2018497
spolnix
Posté le 23-08-2010 à 15:34:59  profilanswer
 

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.
mood
Publicité
Posté le 23-08-2010 à 15:34:59  profilanswer
 

n°2018594
Arcbitre
J'aime ben ça moi, c'est bon!
Posté le 24-08-2010 à 09:57:17  profilanswer
 


 
 
   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)


 

n°2018610
spolnix
Posté le 24-08-2010 à 10:29:25  profilanswer
 

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.
n°2018645
spolnix
Posté le 24-08-2010 à 11:21:50  profilanswer
 

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.
n°2018693
Arcbitre
J'aime ben ça moi, c'est bon!
Posté le 24-08-2010 à 14:10:01  profilanswer
 


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.
 

n°2018708
spolnix
Posté le 24-08-2010 à 15:30:01  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
Constante chaîne non terminéeTableau croisé dynamique VBA
Conversion de type c pour une utilisation de dll VBAVBA - Userform - Pb de superposition des images et des labels
[RESOLU] Remplacement d'une chaine de caractères dans un fichier html[VBA/Excel] - Envoyer une selection variable dans une sous fonction ?
VBA Sélection aléatoire dans listeDécoder une chaine de caractère
VBA pour copier une cellule a une date determine chaque mois 
Plus de sujets relatifs à : [VBA] Test de chaine de caractère sur une collection


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR