Remplacement plusieurs valeurs + recopier colonne sous condition
Résolu/Fermé
cletess
Messages postés
38
Date d'inscription
jeudi 10 janvier 2013
Statut
Membre
Dernière intervention
5 avril 2018
-
Modifié par cletess le 15/01/2013 à 13:01
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 16 janv. 2013 à 11:41
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 16 janv. 2013 à 11:41
A voir également:
- Remplacement plusieurs valeurs + recopier colonne sous condition
- Coco chat remplacement - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Déplacer une colonne excel - Guide
- Excel cellule couleur si condition texte - Guide
- Formule somme excel colonne - Guide
3 réponses
Heliotte
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
92
15 janv. 2013 à 13:13
15 janv. 2013 à 13:13
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"
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
15 janv. 2013 à 15:04
15 janv. 2013 à 15:04
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 ?
cletess
Messages postés
38
Date d'inscription
jeudi 10 janvier 2013
Statut
Membre
Dernière intervention
5 avril 2018
15 janv. 2013 à 15:12
15 janv. 2013 à 15:12
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
Modifié par michel_m le 15/01/2013 à 16:57
Modifié par michel_m le 15/01/2013 à 16:57
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
cletess
Messages postés
38
Date d'inscription
jeudi 10 janvier 2013
Statut
Membre
Dernière intervention
5 avril 2018
Modifié par cletess le 15/01/2013 à 20:56
Modifié par cletess le 15/01/2013 à 20:56
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
Heliotte
Messages postés
1491
Date d'inscription
vendredi 26 octobre 2012
Statut
Membre
Dernière intervention
28 janvier 2013
92
15 janv. 2013 à 22:38
15 janv. 2013 à 22:38
Bonsoir à tous,
Remplacer dans la déclaration (en début de procédure) :
Dim Cptr As Byte, Derlig As Integer, Nbre As Byte
par
Dim Cptr As Byte, Derlig As Long, Nbre As Byte
Remplacer dans la déclaration (en début de procédure) :
Dim Cptr As Byte, Derlig As Integer, Nbre As Byte
par
Dim Cptr As Byte, Derlig As Long, Nbre As Byte
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
16 janv. 2013 à 09:05
16 janv. 2013 à 09:05
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....
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
16 janv. 2013 à 09:46
16 janv. 2013 à 09:46
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
cletess
Messages postés
38
Date d'inscription
jeudi 10 janvier 2013
Statut
Membre
Dernière intervention
5 avril 2018
16 janv. 2013 à 10:34
16 janv. 2013 à 10:34
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 !
cletess
Messages postés
38
Date d'inscription
jeudi 10 janvier 2013
Statut
Membre
Dernière intervention
5 avril 2018
16 janv. 2013 à 11:33
16 janv. 2013 à 11:33
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 !
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
16 janv. 2013 à 11:41
16 janv. 2013 à 11:41
content pour toi :o)
et à bientôt pour de nouvelles aventures !
Cordialement
et à bientôt pour de nouvelles aventures !
Cordialement
15 janv. 2013 à 13:19
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
Modifié par Heliotte le 15/01/2013 à 13:58
Maintenant, la première partie:
Edit pour présentation.
Modifié par cletess le 15/01/2013 à 14:34
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 !
15 janv. 2013 à 14:58
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