Macro vba-pblm d'écrasement de données !
ML2000
Messages postés
13
Statut
Membre
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
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:
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:
Je vous remercie par avance pour votre aide,
Et à bientôt, j'espère.
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.
A voir également:
- Macro vba-pblm d'écrasement de données !
- Fuite données maif - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Effacer les données de navigation sur android - Guide
- Trier des données excel - Guide
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
6 réponses
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
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
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
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
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
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
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 = ...
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 = ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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):
D'avance merci si vous avez une prtite solution à me proposer.
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.