Macro vba-pblm d'écrasement de données !

Fermé
ML2000 Messages postés 9 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 8 juin 2010 - Modifié par ML2000 le 7/05/2010 à 14:25
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 - 7 mai 2010 à 18:44
Bonjour à tous,

Je recherche une aide précieuse pour réaliser au mieux une macro vba.
Ma macro me permet de faire une sorte de recherchev pour récupérer les infos d'une colonne par rapport à un identifiant.
Seul hic, sur cette colonne, un même identifiant peut avoir plusieurs réponses. (Ex: 1-A, 1-B, 1-C, 2-A, 3-A, 3-B, 3-C,...) Les réponses à la recherche sont copiées dans une seule cellule ce qui écrase donc les précédentes et je ne récupère alors que la derniere info. J'aimerais pouvoir récupérer toutes les lignes correspondant à l'identifiant recherché(la liste complète en fait). Le problème doit se situer au niveau de cette ligne de code:

If sDepart1 = MaFeuille.Cells(iLigne2, 10).Value Then 
             </MaFeuille.Cells(iLigne1, 3).Value = MaFeuille.Cells(iLigne2, 11).Value 
             End If 


Je pense qu'il faudrait insérer une sorte de n+1 par rapport à la première cellule mais là, mes capacités sont trop réduites! C'est pour ça que je fais appels à vous et à vos nombreuses connaissances.

Pour vous aider à comprendre, voici mon code en entier:
Public MonClasseur As Workbook 
Public MaFeuille As Worksheet 

'--------------------------------------- 
'## RECHERCHE ## 
'--------------------------------------- 

Sub RECHERCHEV() 
    'Déclaration des variables 
    Dim iLigne1 As Long 
    Dim iLigne2 As Long 
    Dim sDepart1 As Long 
   
    Set MonClasseur = ThisWorkbook 
    Set MaFeuille = MonClasseur.Sheets("EQE") 
     
    'Initialisation du compteur 1 
    iLigne1 = 2 

    'Exécute jusqu'à ce que la dernière cellule soit vide 
    Do Until MaFeuille.Cells(iLigne1, 1).Value = "" 
     
'$ $ $ Test le bon format de l'info 
        If Len(MaFeuille.Cells(iLigne1, 1).Value) < 5 Then 
            sDepart1 = "0" & MaFeuille.Cells(iLigne1, 1).Value 
         
        Else 
            sDepart1 = MaFeuille.Cells(iLigne1, 1).Value 

        End If 
         'Fin de l'hypothèse 
'$ $ $ 

        iLigne2 = 2 
         'Initialisation du compteur Loop 2 
         
        'Exécute jusqu'à ce que la dernière cellule de la colonne 10 soit vide 
        Do Until MaFeuille.Cells(iLigne2, 10).Value = "" 
             
            'Si la valeur de sDépart est égal à la cellule(ligne iLigne2, Colonne10) alors 
            'on écrira dans la cellule (ligne iLigne2, colonne 3) la valeur de la cellule (ligne iLigne1, colonne 11) 
             If sDepart1 = MaFeuille.Cells(iLigne2, 10).Value Then 
             MaFeuille.Cells(iLigne1, 3).Value = MaFeuille.Cells(iLigne2, 11).Value 
             End If 
              
             'Compteur boucle 2 
             iLigne2 = iLigne2 + 1 
            
         'Fermeture de la boucle 2 
         Loop 
          
          'Compteur boucle 1 
         iLigne1 = iLigne1 + 1 
                     
    'Fermeture de la boucle 1 
    Loop 

End Sub


Je vous remercie par avance pour votre aide,
Et à bientôt, j'espère.

6 réponses

eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
7 mai 2010 à 14:44
Bonjour,

En fait tu veux concatener (mettre bout à bout) des chaines.
Il faut en plus les séparer par un caractère.
Ex avec , comme séparateur :
MaFeuille.Cells(iLigne1, 3).Value = MaFeuille.Cells(iLigne1, 3).Value & "," & MaFeuille.Cells(iLigne2, 11).Value

Je n'ai pas regardé la logique de ton code complet...
eric
0
ML2000 Messages postés 9 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 8 juin 2010
7 mai 2010 à 14:56
Bonjour eriiic,

C'est pas tout à fait ça. J'essaie de mieux réexpliquer.
J'ai 2 colonnes. La première avec les identifiants:
eleve1
eleve1
eleve1
eleve2
eleve2
eleve3

Et une deuxième avec les données:
noteA
noteB
noteC
noteA
noteB
noteA

Et ce que je voudrais bien faire, c'est quand je recherche l'identifiant 'eleve1', dans ma colonne de résultats, ma macro devrait me sortir sur une colonne:
noteA
noteB
noteC

Alors qu'actuellement, elle m'inscrit dans la première cellule 'noteC' en écrasant 'noteA' et 'noteB'. Au lieu d'écrire sur les cellules du dessous!

J'espère que c'est plus compréhensible.
Merci
0
Utilisateur anonyme
7 mai 2010 à 15:42
Bonjour,
J'ai un peu de mal à suivre ton truc, mais je pense que tu as seulement une petite inversion au moment de l'écriture :

MaFeuille.Cells(iLigne1, 3).Value = MaFeuille.Cells(iLigne2, 11).Value

devrait en fait être :

MaFeuille.Cells(iLigne2, 3).Value = MaFeuille.Cells(iLigne1, 11).Value

car l'incrément de ta deuxième boucle se fait sur iLigne2 et non sur iLigne1.

...

Manu
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
7 mai 2010 à 15:47
alors tu peux utiliser .offset(lig,col) qui te décale ta référence de lig lignes et col colonnes
Dans ton cas, en se servant de ton compteur de boucle 2 (?), ça donnerait qcq chose comme :
MaFeuille.Cells(iLigne1, 3).offset(iLigne2-2,0).Value = ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ML2000 Messages postés 9 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 8 juin 2010
7 mai 2010 à 16:02
MERCI! et encore MERCI!!!

Vos deux réponses ont résolu mon problème.
0
ML2000 Messages postés 9 Date d'inscription jeudi 6 mai 2010 Statut Membre Dernière intervention 8 juin 2010
7 mai 2010 à 16:58
Re-bonjour,

Encore une petite chose, svp...
Le problème a été résolu mais j'ai juste un problème d'affichage.
Toutes les valeurs cherchées sont bien affichées les unes à la suite des autres mais j'ai plus de 5000 lignes.

Et quand on fait une recherche sur un identifiant, l'affichage des résultats se fait au niveau des lignes de la colonne 'données'. Par exemple, si un identifiant se trouve vers la 1000ème ligne dans la colonne 'données', les résultats s'afficheront dans la colonne 'résultats' mais vers la 1000ème ligne aussi.

N'y a t il pas un moyen pour les remonter en haut du tableau???
Ce serait plus pratique pour la lecture.

Revoici le code qui fonctionne très bien (mais avec le petit soucis d'affichage):

If sDepart1 = MaFeuille.Cells(iLigne2, 10).Value Then
             MaFeuille.Cells(iLigne1, 3).Offset(iLigne2 - 2, 0).Value = MaFeuille.Cells(iLigne2, 11).Value
             End If


D'avance merci si vous avez une prtite solution à me proposer.
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
7 mai 2010 à 18:44
Si tu veux connaitre la ligne de la 1ère cellule libre de la colonne C par exemple alors :
lig=[C65536].end(xlup).row+1

Je ne sais pas où tu veux en venir mais connais-tu le filtre automatique (menu données) ?
Tu peux filtrer sur une colonne pour n'avoir que les valeurs que tu veux voir...
0