Dupliquer X lignes si une condition
Bonjour,
Je suis entrain de me prendre la tête sur un problème depuis plusieurs jours et si quelqu'un pouvait m'éclairer ce serait top!
J'aimerais faire une macro qui devrait effectuer les tâches suivantes:
1- Sélectionner aléatoirement un nombre X de lignes qui remplissent toutes une même condition (dans mon cas que chaque ligne ait une colonne contenant un caractère spécifique).
NB: Ce nombre X doit faire référence à un nombre se trouvant dans une cellule de mon excel
2- Les dupliquer et coller à la suite de ma base de données (en détectant la première ligne vide)
J'arrive bien à trier aléatoirement mes lignes mais je n'arrive pas à sélectionner les X premières qui renvoie avec X le nombre de ma cellule reliée.
Merci d'avance!
Salut et bienvenue sur le Forum.
Peux-tu nous fournir ton fichier ou tout au moins un fichier modèle, s'il te plait ? Celui-ci devrait contenir tes macros actuelles, en tout cas celles en rapport avec ton problème.
Cordialement.
Merci pour cette réponse!
Je joins un fichier exemple qui illustre mon problème. A savoir j'ai une liste de données et comme expliquée précédemment je veux dupliquer des lignes puis les coller à la première ligne non vide. Le nombre de ligne doit être fixé par une cellule "Xième valeur", Les lignes que je choisi de coller sont choisies aléatoirement parmi les différentes lignes remplissant la condition "mission partant du 75".
Je n'ai justement pas de macro actuellement car je n'arrive pas à SELECTIONNER aléatoirement le nombre de ligne que je désire...
Merci encore!
Salut,
Ta demande n’est vraiment pas très clair, spécialement car tu ne fais pas références aux noms des objets Excel (noms des feuilles concernées, références aux cellules, aux lignes, aux colonnes, etc.).
J'arrive bien à trier aléatoirement mes lignes
Comment fais-tu cela si tu n’as pas de macro dans ton fichier ?
J’ai vaguement compris que tu voulais prendre X lignes au hasard dans ton tableau de la feuille ‘’Data’’, pour autant qu’il y ait le chiffre 75 dans la colonne C de cette feuille.
J’ai également compris que le X indiqué ci-dessus devait correspondre à la valeur inscrite dans la cellule J4 de la feuille ‘’Feuil1’’. Je n’ai alors pas compris ce qui se passerait si le nombre en place dans cette cellule renvoyait un chiffre avec virgule (par exemple 4.5 s’il n’y a plus que 90 missions listées).
Ensuite, ces X lignes choisies au hasard doivent bien être reportées en dessous du tableau de la feuille ‘’Data’’, non ? Ce serait à ce moment-là, si on réactualise ton TCD de la feuille ‘’Feuil1’’ que serait modifié selon moi ton chiffre en J4 de cette même feuille ‘’Feuil1’’.
Et combien de fois veux-tu pouvoir réaliser ce rajout de lignes ? Indéfiniment ? En laissant les premières données rajoutées en place ou en revenant à ton tableau de base (donc en effaçant les dernières lignes ajoutées) ?
A te relire.
Bonjour et encore merci pour ta réponse, je vais essayer d'être plus claire.
"J’ai vaguement compris que tu voulais prendre X lignes au hasard dans ton tableau de la feuille ‘’Data’’, pour autant qu’il y ait le chiffre 75 dans la colonne C de cette feuille."
J’ai également compris que le X indiqué ci-dessus devait correspondre à la valeur inscrite dans la cellule J4 de la feuille ‘’Feuil1’’. Je n’ai alors pas compris ce qui se passerait si le nombre en place dans cette cellule renvoyait un chiffre avec virgule (par exemple 4.5 s’il n’y a plus que 90 missions listées).
Tu as en effet raison de t'interroger sur ce qui se passerait pour un nombre décimal et désolé de ne pas l'avoir explicité, il me suffira de dire que ce Xième chiffre de la cellule J4 correspond tout simplement à un entier naturel (pas une grande importance de savoir si on ajoutera X ligne ou bien X+1 ligne dans la mesure où ma base de donnée contient plus de 4000 lignes donc la perte d'information d'une ligne est négligeable).
Ensuite, ces X lignes choisies au hasard doivent bien être reportées en dessous du tableau de la feuille ‘’Data’’, non ? Ce serait à ce moment-là, si on réactualise ton TCD de la feuille ‘’Feuil1’’ que serait modifié selon moi ton chiffre en J4 de cette même feuille ‘’Feuil1’’.
Encore une fois c'est complètement cela que je cherche à faire en effet! Afin d'être très clair, le but n'est pas de faire varier ce chiffre J4, J4 est juste un indicateur qui montre combine de lignes je vais devoir dupliquer pour faire augmenter de 5% le nombre de missions ayant lieu dans le 75 par exemple.
Et combien de fois veux-tu pouvoir réaliser ce rajout de lignes ? Indéfiniment ? En laissant les premières données rajoutées en place ou en revenant à ton tableau de base (donc en effaçant les dernières lignes ajoutées) ?
J'aimerais pouvoir rajouter des lignes en effet toujours en laissant celles d'origines et cela de manière infini. J'aimerais également pouvoir revenir à l'état "initial" en faisant le processus inverse, et non plus rajouter 5% des lignes (qui correspond au 5 de la cellule J4) mais les enlever en utilisant semblablement une macro très similaire à celle que j'aurais trouvé précédemment afin d'ajouter mes lignes mais qui fera l'opération inverse. Je ne souhaite donc pas que le tableau soit contraint de revenir à l'état initial mais que si je le décide cela soit possible. J'espère que c'est un peu plus clair!
Je te joins le fichier précédent qui est un peu plus clair à comprendre je l'espère! Et merci vraiment de l'aide
Salut,
Si tu changes continuellement de fichier, ce n’est pas facile à te suivre. De plus, ne place pas d’informations à mon attention dans le fichier car il est difficile de savoir si les informations inscrites dans les fichiers Excel sont à mon attention ou à l’attention de l’utilisateur de ton fichier.
Place tes instructions à mon attention exclusivement sur le fil, en faisant référence aux noms des objets Excel.
Je ne me suis intéressé nouvellement qu’à ton tableau de la plage K15:P18 de la feuille ‘’TBCD’’ (uniquement des rajouts de lignes). Si tu veux traiter les cas partant de 75 et arrivant en 94, il n’y en a qu’un seul et il ne représente donc que le 1 % de tous les cas possibles sur la feuille ‘’Data’’. Pour arriver à un rajout de 5, 10 ou 15 %, comment veux-tu faire ? Ajouter proportionnellement 5, 10 ou 15 fois ce même cas ??
J’ai bien tenté de dupliquer 40 fois tes 100 lignes afin d’en avoir 4000, mais alors la seule ligne 75/94 dupliquée 40 fois ne représente toujours que le 1 % de 4000
N’arrivant toujours pas à comprendre la logique et le but de ta demande, j’ai un peu de peine à t’aider rapidement.
Bonjour! Merci encore de ta réponse et désolé de mon manque de clarté, je modifiais le document justement pour essayer d'être plus claire...
Pour contextualiser le but de tout ceci, est que je cherche à étudier différents scénarios, à savoir que se passe t-il si le nombre de missions allant du 75 au 94 augmentent de 5, 10 ou 20% par exemple. Etant donné qu'il serait bien trop compliqué d'inventer de toutes pièces de nouvelles missions n’apparaissant pas dans mes données, pour simuler cette apparition de nouvelles missions je dois sélectionner le bon nombre de missions déjà existantes et les dupliquer afin d'avoir le pourcentage du scénario désiré.
Exemple: Si je veux regarder la tendance de mes missions partant du 75 au 95 sachant qu'on projette qu'il y aura une augmentation de 5% de ces mêmes missions, je vais devoir d'une part trier mes missions qui réponde au critère "commençant dans le 75 et se terminant dans le 95" puis en choisir un nombre suffisant afin d'avoir 5% des missions totales puis les dupliquer et les coller à la suite de mes lignes déjà existantes. Je pourrais le faire à la main mais cela serait extrêmement fastidieux, je pense qu'une macro serait idéale.
Ces différentes données seront ensuite extraites sur python et vont tourner sur un logiciel qui va les traiter pour un certain besoin mais cela n'est pas ici mon problème. Le but final de ce projet est de voir comment l'algorithme sur python va tourner si on modifie les données qu'on lui donne (ce que j'essaye de faire sur excel).
Peut-être cela fait plus de sens?
"Je ne me suis intéressé nouvellement qu’à ton tableau de la plage K15:P18 de la feuille ‘’TBCD’’ (uniquement des rajouts de lignes). Si tu veux traiter les cas partant de 75 et arrivant en 94, il n’y en a qu’un seul et il ne représente donc que le 1 % de tous les cas possibles sur la feuille ‘’Data’’. Pour arriver à un rajout de 5, 10 ou 15 %, comment veux-tu faire ? Ajouter proportionnellement 5, 10 ou 15 fois ce même cas ??" Oui complètement!
Merci encore de prendre le temps de s'intéresser à mon problème!
Mais alors pourquoi ne pas ajouter à chaque coup 5, 10, ........ fois un cas quelconque (mais bien entendu répondant aux critères tel que 75/95) ?
Ou autrement dit, pourquoi se casser la tête dans certains cas à ajouter un certain nombres de cas tirés au sort ? Si tu veux simuler un cas 75/95, pourquoi ne pas prendre simplement le premier cas 75/95 trouvé (ou inventé s'il n'y en a aucun ??) ?
Bonsoir,
Car ici je n'ai fourni qu'un échantillon des données de ma base, il y a en vérité bcp plus de colonnes et les missions se différencient par pleins d'autres critères. Ainsi si je ne copie que la même mission ma tendance ne sera pas crédible...
Merci ,
J'espère pouvoir te proposer quelque chose d'ici lundi ou mardi soir. Bon dimanche.
J'espère pouvoir te proposer quelque chose d'ici lundi ou mardi soir. Bon dimanche.
J'ai un peu avancé et finalement je suis plus très loin je pense! Je joins mon fichier excel avec mes avancés qui te facilitera peut-être la compréhension de ce que je veux faire.
Je suis désormais bloqué sur une chose toute bête à savoir comment sélectionner des lignes entre la première ligne du tableau et entre la valeur d'une cellule: je m'explique.
Dans ma cellule "O7" de ma feuille "TBCD" j'ai un chiffre qui va varier. Il a pour l'instant la valeur 5. Comment faire pour sélectionner dans ma feuille "data" les lignes allant de la deuxième ligne du tableau (pour ne pas prendre en compte l'entête jusqu'à la ligne ayant le numéro contenu dans O7?
J'ai essayé cela mais ça ne marche pas:
Dim xlignexpourcent As Long
xlignexpourcent = Worksheets("TBCD").Range("O6")
Range("2, xlignexpourcent").SpecialCells(xlVisible).Select
Une idée?
Bonjour vejaboy7,
Je te propose ce code VBA :
Sub Essai()
Worksheets("data").Select: Rows("2:" & Cells(Rows.Count, 1).End(xlUp).Row).Select
End SubNB : ça marche depuis la feuille "TBCD" ou depuis la feuille "data".
Cordialement,
dhany
Bonjour vejaboy7,
Je te propose ce code VBA :
Sub Essai() Worksheets("data").Select: Rows("2:" & Cells(Rows.Count, 1).End(xlUp).Row).Select End SubCordialement,
dhany
Bonjour,
Merci pour cette réponse mais j'ai peur qu'elle ne répond pas à ma question car ici le code va sélectionner la totalité des lignes. Or je cherche à sélectionner de la seconde ligne jusqu'à la Xième ligne avec la valeur X qui correspond au chiffre contenu dans la cellule O7 de mon autre feuille...
Désolé ! j'ai complètement oublié la cellule O6 !!!
Sub Essai()
Worksheets("data").Select: Rows("2:" & [TBCD!O6]).Select
End Sub⚠ ça sélectionne bien ce qu'il faut, de la ligne 2 à la ligne 5, mais les lignes 4 et 5 sont masquées par le filtre actuel !
NB : c'est O6 qui contient 5, pas O7 !
dhany
Désolé ! j'ai complètement oublié la cellule O6 !!!
rectification : Sub Essai() Worksheets("data").Select: Rows("2:" & [TBCD!O6]).Select End Sub⚠ ça sélectionne bien ce qu'il faut, de la ligne 2 à la ligne 5, mais les lignes 4 et 5 sont masquées !
NB : c'est O6 qui contient 5, pas O7 !
dhany
ça m'aide bcp merci! Et si j'aimerais avoir les lignes de la 2 ème à celle de la valeur de la cellule O7 mais cette fois en ne sélectionnant que les cellules visibles suite au filtre?
J'ai essayé de rajouter "SpecialCells(xlVisible)" mais ça m'affiche une erreure
Si, si, t'as eu une très bonne idée d'utiliser SpecialCells(xlVisible) !
Sub Essai()
Worksheets("data").Select: Rows("2:" & [TBCD!O7]).SpecialCells(xlVisible).Select
MsgBox "Nombre de lignes de la sélection : " & Selection.Rows.Count
End Sub⚠ Si la cellule O7 contient 0 (zéro) ça plantera car la ligne 0 n'existe pas !!!
Tu peux alors faire ceci :
Sub Essai()
If [TBCD!O7] = 0 Then Exit Sub
Worksheets("data").Select: Rows("2:" & [TBCD!O7]).SpecialCells(xlVisible).Select
' ici, suite de ton code VBA (qui est supposé marcher seulement si la sélection a réussi !)
End Subdhany
Si, si, t'as eu une très bonne idée d'utiliser SpecialCells(xlVisible) !
essaye maint'nant comme cela : Sub Essai() Worksheets("data").Select: Rows("2:" & [TBCD!O7]).SpecialCells(xlVisible).Select MsgBox "Nombre de lignes de la sélection : " & Selection.Rows.Count End Sub⚠ Si la cellule O7 contient 0 (zéro) ça plantera car la ligne 0 n'existe pas !!!
Tu peux alors faire ceci :
Sub Essai() If [TBCD!O7] = 0 Then Exit Sub Worksheets("data").Select: Rows("2:" & [TBCD!O7]).SpecialCells(xlVisible).Select ' ici, suite de ton code VBA (qui est supposé marcher seulement si la sélection a réussi !) End Subdhany
Excuse moi je voulais bien dire O6 haha tu as raison la cellule O7 est vide... Ton code j'ai bien l'impression ne marche pas comme je le souhaite car il ne sélectionne que deux lignes alors qu'il devrait en sélectionner 5 dans la configuration actuelle. :/
Dans ce cas, tu peux faire ainsi :
Sub Essai()
Worksheets("data").Select: Rows("2:" & [TBCD!O6]).SpecialCells(xlVisible).Select
MsgBox "Nombre de lignes de la sélection : " & Selection.Rows.Count
End SubPour le nombre de lignes sélectionnées, j'comprends plus :
1) la 1ère version sans .SpecialCells(xlVisible) sélectionnait bien 4 lignes, de 2 à 5 mais ne montrait que les 2 premières, car le filtre actif masquait les 2 autres (relis mon message de 15:22).
2) la 2ème version avec .SpecialCells(xlVisible) sélectionne les lignes 2 et 3, car pour les lignes 2 à 5, ce sont les seules visibles ... et c'est bien ce que tu avais demandé ensuite, non ?
Pour le 2ème code VBA, ça donne :
Sub Essai()
If [TBCD!O6] = 0 Then Exit Sub
Worksheets("data").Select: Rows("2:" & [TBCD!O6]).SpecialCells(xlVisible).Select
' ici, suite de ton code VBA (qui est supposé marcher seulement si la sélection a réussi !)
End Sub⚠ dans ce 2ème code, il y a 2× O6, donc 2 changements à faire !
Je te laisse vérifier tout ça ; à te lire.
dhany
Dans ce cas, tu peux faire ainsi :
Sub Essai() Worksheets("data").Select: Rows("2:" & [TBCD!O6]).SpecialCells(xlVisible).Select MsgBox "Nombre de lignes de la sélection : " & Selection.Rows.Count End SubPour le nombre de lignes sélectionnées, j'comprends plus :
1) la 1ère version sans .SpecialCells(xlVisible) sélectionnait bien 4 lignes, de 2 à 5 mais ne montrait que les 2 premières, car le filtre actif masquait les 2 autres (relis mon message de 15:22).
2) la 2ème version avec .SpecialCells(xlVisible) sélectionne les lignes 2 et 3, car pour les lignes 2 à 5, ce sont les seules visibles ... et c'est bien ce que tu avais demandé ensuite, non ?
Je te laisse vérifier tout ça ; à te lire.
dhany
Salut merci encore de tes réponses!
Le problème de la première solution est qu'elle sélectionne bien 5 missions comme désirées mais elle sélectionne également des missions qui ne respectent pas la condition du filtre en présence
Le problème de la seconde solution est qu'elle ne sélectionne pas 5 missions! Elle sélectionne bien que des missions respectant le filtre mais je pense que ce que fait excel est qu'il compte 5 missions entre la deuxième ligne et le chiffre indiqué de la cellule O6. Sauf qu'entre ces cellules certaines ne sont pas sélectionnées car ne respecte pas la condition (ce qui est une bonne chose!). Mais je n'ai au final pas 5 missions sélectionnées qui respectent le filtre.
Je pense qu'une solution serait d'utiliser une boucle for pour compter le nombre de missions cachées entre la deuxième ligne et la valeur de 06 une fois le filtre appliqué et de sélectionner les lignes de la deuxième à la valeur de O6 + le compteur de lignes masquées?
Ou alors un while qui dit qu'il faut continuer à sélectionner des lignes tant qu'on en a pas le nombre désiré à savoir tout simplement la valeur de O6...
Qu'en penses-tu?
Merci encore!