Remplacement plusieurs valeurs + recopier colonne sous condition
Résolu
cletess
Messages postés
38
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
J'aurai deux questions à soumettre à la communauté:
1) Je cherche un moyen de rechercher et remplacer 28 valeurs différentes par une seule sans devoir faire les 28 remplacements à la main (j'ai 30 bases de données de plus de 300.000 lignes chacune, il faut faire du tri là-dedans ). Une idée ?
Dans le fichier joint en dessous, je dois remplacer 28 des valeurs en colonne D par PETIT et 28 autres valeurs par GRAND
2) Ensuite, j'aimerai construire une macro me permettant de recopier les données de la colonne P si les valeurs d'une colonne D sont égales à PETIT mais de recopier les données d'une colonne S si elles sont égales à GRAND.
Toute aide serait grandement appréciée,
Merci !
CL
Fichier exemple disponible ici: https://transvol.sgsi.ucl.ac.be/download.php?id=fc1e72550c816585
J'aurai deux questions à soumettre à la communauté:
1) Je cherche un moyen de rechercher et remplacer 28 valeurs différentes par une seule sans devoir faire les 28 remplacements à la main (j'ai 30 bases de données de plus de 300.000 lignes chacune, il faut faire du tri là-dedans ). Une idée ?
Dans le fichier joint en dessous, je dois remplacer 28 des valeurs en colonne D par PETIT et 28 autres valeurs par GRAND
2) Ensuite, j'aimerai construire une macro me permettant de recopier les données de la colonne P si les valeurs d'une colonne D sont égales à PETIT mais de recopier les données d'une colonne S si elles sont égales à GRAND.
Toute aide serait grandement appréciée,
Merci !
CL
Fichier exemple disponible ici: https://transvol.sgsi.ucl.ac.be/download.php?id=fc1e72550c816585
A voir également:
- Remplacement plusieurs valeurs + recopier colonne sous condition
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Déplacer colonne excel - Guide
- Trier colonne excel - Guide
- Excel cellule couleur si condition texte - Guide
3 réponses
Bonjour cletess,
Les deux points peuvent être fait par VBA (macro)
1° Remplacer 28 valeurs par "PETIT" + 28 valeurs par "GRAND" SI la cellule est égale à quoi ??
2° :
Où i est le numéro de ligne, 4 vaut pour la colonne "D", 16 pour "P" et 19 pour "S"
Les deux points peuvent être fait par VBA (macro)
1° Remplacer 28 valeurs par "PETIT" + 28 valeurs par "GRAND" SI la cellule est égale à quoi ??
2° :
Dim i As Long, PremiereLigne As Long, DerniereLigne As Long ' PremiereLigne =1: DerniereLigne =20 For i=PremiereLigne To DerniereLigne If(Cells(ligne,4).value = "PETIT") Then ValeurARecopier = Cells(ligne,16).value ElseIf (Cells(ligne,4).value = "GRAND") ValeurARecopier = Cells(ligne,19).value End If Next i
Où i est le numéro de ligne, 4 vaut pour la colonne "D", 16 pour "P" et 19 pour "S"
Bonjour
décidément !...
Est ce indispensable de passer par l'étape "petit " et "grand" ou peut on incorporer directement les valeurs des colonnes P et S dans D ?
décidément !...
Est ce indispensable de passer par l'étape "petit " et "grand" ou peut on incorporer directement les valeurs des colonnes P et S dans D ?
Bonjour (encore une fois) Michel :)
L'idée est de simplifier les analyses que je dois effectuer sur ces bases de données en créant la variable catégorielle Petit/Grand
Ensuite, en fonction de ça, qu'il me recopie directement les valeurs SmllObj Z (Petit) ou LgObj Z (Grand) dans une autre colonne tout en gardant leur label respectif repris en colonne D (Malgré que les deux colonnes P et S soient fusionnées, je saurais toujours lesquelles font référence à SmllObj Z et à LgObj Z).
Merci
L'idée est de simplifier les analyses que je dois effectuer sur ces bases de données en créant la variable catégorielle Petit/Grand
Ensuite, en fonction de ça, qu'il me recopie directement les valeurs SmllObj Z (Petit) ou LgObj Z (Grand) dans une autre colonne tout en gardant leur label respectif repris en colonne D (Malgré que les deux colonnes P et S soient fusionnées, je saurais toujours lesquelles font référence à SmllObj Z et à LgObj Z).
Merci
et voilà
dommage qu'il n'y ait que 2 frame pour mesurer la durée :o)
pour terminer: Dans quelle colonne faut il reporter les mesures P et S ?
dommage qu'il n'y ait que 2 frame pour mesurer la durée :o)
pour terminer: Dans quelle colonne faut il reporter les mesures P et S ?
Sub petitougrand() Dim Cptr As Byte, Derlig As Integer, Nbre As Byte Dim Debut As Integer, Fin As Integer, frame As Integer Application.ScreenUpdating = False Derlig = Columns("D").Find("*", , , , , xlPrevious).Row Nbre = Application.Max(Range("D2:D" & Derlig)) For Cptr = 1 To Nbre frame = Choose(Cptr, 0, 2, 3, 0, 5) ' a terminer (poil dans la main) Debut = Columns("D").Find(Cptr).Row Fin = Application.CountIf(Range("D2:D" & Derlig), Cptr) + Debut - 1 With Range(Cells(Debut, "D"), Cells(Fin, "D")) If frame = 0 Then .Value = "grand" Else .Value = "petit" End If End With Next End Sub
Bonjour Michel !
Pour ce qui est du report, la colonne V me semble toute indiquée !
"dommage qu'il n'y ait que 2 frames pour mesurer la durée " que veux-tu dire par là ? Si jamais, l'appareil qui prend ces mesures fonctionnent à du 240 Hrtz donc une nouvelle ligne est enregistrée toute les 1000/240 millisecondes (4,1666..). Je ne sais pas si c'est à ceci que faisait référence ton commentaire :)
Pour ce qui est de ta procédure, j'obtiens le message "dépassement de capacité" en référence à cette ligne ci
Merci encore
Pour ce qui est du report, la colonne V me semble toute indiquée !
"dommage qu'il n'y ait que 2 frames pour mesurer la durée " que veux-tu dire par là ? Si jamais, l'appareil qui prend ces mesures fonctionnent à du 240 Hrtz donc une nouvelle ligne est enregistrée toute les 1000/240 millisecondes (4,1666..). Je ne sais pas si c'est à ceci que faisait référence ton commentaire :)
Pour ce qui est de ta procédure, j'obtiens le message "dépassement de capacité" en référence à cette ligne ci
Derlig = Columns("D").Find("*", , , , , xlPrevious).Row. Des suggestions ?
Merci encore
Bonjour,
Probleme ce matin pour accéder: Google semble tout retarder avec son animation...
J'ai noté pour la colonne V, je regarde dans la journée
dommage qu'il n'y ait que 2 frames pour mesurer la durée.... Non c'est pour le temps que prend la macro pour exécuter le boulot comme dans la précédente discussion, tu avais 56 frames....
Probleme ce matin pour accéder: Google semble tout retarder avec son animation...
J'ai noté pour la colonne V, je regarde dans la journée
dommage qu'il n'y ait que 2 frames pour mesurer la durée.... Non c'est pour le temps que prend la macro pour exécuter le boulot comme dans la précédente discussion, tu avais 56 frames....
re,
création colonne V avec si "grand" valeur col S sinon col P
création colonne V avec si "grand" valeur col S sinon col P
Sub petitougrand()
Dim Cptr As Byte, Derlig As Integer, Nbre As Byte
Dim Debut As Integer, Fin As Integer, frame As Byte
Application.ScreenUpdating = False
Derlig = Columns("D").Find("*", , , , , xlPrevious).Row
Nbre = Application.Max(Range("D2:D" & Derlig))
For Cptr = 1 To Nbre
frame = Choose(Cptr, 0, 2, 3, 0, 5) ' a terminer (poil dans la main)
Debut = Columns("D").Find(Cptr).Row
Fin = Application.CountIf(Range("D2:D" & Derlig), Cptr) + Debut - 1
With Range(Cells(Debut, "D"), Cells(Fin, "D"))
If frame = 0 Then
.Value = "grand"
Range(Cells(Debut, "V"), Cells(Fin, "V")) = Range(Cells(Debut, "S"), Cells(Fin, "S")).Value
Else
.Value = "petit"
Range(Cells(Debut, "V"), Cells(Fin, "V")) = Range(Cells(Debut, "P"), Cells(Fin, "P")).Value
End If
End With
Next
End Sub
Bonjour à tous les deux,
Voilà ce que j'ai en final:
La macro tourne en 1,035 sec et effectue la tâche jusqu'au frame 41 (dépassement de capacité)
Des idées ?
Dans tous les cas, merci pour votre aide !
Voilà ce que j'ai en final:
Sub petitougrand() Dim Cptr As Byte, Derlig As Long, Nbre As Byte Dim Debut As Integer, Fin As Integer, frame As Byte Dim start As Single start = Timer 'pour essai rapidité à supprimer Application.ScreenUpdating = False Derlig = Columns("D").Find("*", , , , , xlPrevious).Row Nbre = Application.Max(Range("D2:D" & Derlig)) For Cptr = 1 To Nbre frame = Choose(Cptr, 0, 2, 3, 0, 5, 6, 7, 8, 0, 0, 0, 12, 0, 14, 0, 16, 0, 18, 0, 20, 0, 0, 23, 24, 0, 26, 0, 0, 0, 30, 31, 0, 0, 0, 35, 36, 37, 0, 39, 0, 41, 42, 0, 44, 0, 46, 47, 0, 49, 0, 0, 0, 53, 0, 55, 0) ' Debut = Columns("D").Find(Cptr).Row Fin = Application.CountIf(Range("D2:D" & Derlig), Cptr) + Debut - 1 With Range(Cells(Debut, "D"), Cells(Fin, "D")) If frame = 0 Then .Value = "grand" Range(Cells(Debut, "V"), Cells(Fin, "V")) = Range(Cells(Debut, "S"), Cells(Fin, "S")).Value Else .Value = "petit" Range(Cells(Debut, "V"), Cells(Fin, "V")) = Range(Cells(Debut, "P"), Cells(Fin, "P")).Value End If End With Next MsgBox Timer - start 'pour essai rapidité à supprimer End Sub
La macro tourne en 1,035 sec et effectue la tâche jusqu'au frame 41 (dépassement de capacité)
Des idées ?
Dans tous les cas, merci pour votre aide !
J'ai tenté de définir Debut et fin en temps que "As Long" au lieu d'integer et ça semble régler le problème. Le changement effectué n'a pas d'autres implications ??
ça semble fonctionner à merveille en tout cas: 19,2 seconde sur le fichier complet qui comporte 488 000 lignes, c'est magnifique !
Merci infiniment !
ça semble fonctionner à merveille en tout cas: 19,2 seconde sur le fichier complet qui comporte 488 000 lignes, c'est magnifique !
Merci infiniment !
Ensuite, si il est écrit PETIT dans la colonne D, que la macro recopie les valeurs de la colonne P et celle de la colonne S si il est écrit GRAND dans la colonne D !
Merci beaucoup pour ton aide
Maintenant, la première partie:
Edit pour présentation.
petits problèmes persistent dans la macro: dans la première partie de la macro, j'obtiens un message d'erreur "erreur d'exécution 9 : l'indice n'appartient pas à la sélection" avec la ligne
qui semble problématique.
Ensuite, il me note "Variable de contrôle For déjà utilisée", je suppose qu'il s'agit de la deuxième itération de la ligne qui cause le problème donc je l'ai supprimée et l'erreur n'apparaît plus.
Ensuite, je suppose que je dois rajouter un "Then" à la fin de
Est-ce correcte de procéder de la sorte ?
Et puis-je rassembler les deux parties de la macro en une seule ? Dois-je y apporter une quelconque modification ?
Merci pour tout !
1° "erreur d'exécution 9 : l'indice n'appartient pas à la sélection" avec la ligne
- If (Cells(i,4).Value = t(tElement)) Then ..
.. il faut faire For tElement = t(LBound(t)) To (t(UBound(t)-1))
2° J'ai omis la déclaration : Dim tElement As Long .. à ajouter en début de procédure
3° Ajouter ElseIf (Cells(ligne,4).value = "GRAND") Then