Recherche par plage de données - excel vba

Signaler
Messages postés
57
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
26 mai 2010
-
Messages postés
57
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
26 mai 2010
-
Salut les Kracks,

J'ai des données dans une liste déroulante en colonne (O10:O) ce chacune de mes feuilles, données qui correspond aux noms "exact" de mes feuilles.
Souvent il n'y a aucune information (cellule vide)
Mais lorsqu'il y a une donnée, je souhaiterai obtenir une copie de la ligne entière et qu'elle aille se reloger dans la feuille portant le même nom:
Pour expliquer le but de la manoeuvre, chacun des départements investiguent sur chacunes des lignes correspondant à un Item spécifique, mais parfois il n'est pas pour eux. En investiguant, ils arrivent définir que c'est pour un autre département. Aussi, il me l'indique en colonne O par le biai d'une liste déroulante permettant d'avoir toujours les mêmes données.
FYI:  le menu déroulant est obtenue avec Data/Validation/list/...
J'ai nommé cette liste Listsec et elle contient une vingtaine de choix possible (donc vingt feuilles également), mais, souvent il n'y a pas de donnée du tout 'si le travail a bien été fait, ce qui complique.
Ci-dessous mes idées pour y parvenir:

Sub Distribution
Dim c as variant
Dim O as variant
Dim Listsec as variantPlage de données comportant tous les noms des feuilles et le menu déroulant en colonne O
O = Range("O10:O & Range("h6").value + 10)'il y a un count dans h6 qui me donne le nombre exact de ligne de A10: Ax dans lesquels il n'y a aucune ligne vide possible :-(</strike>
Dim n as Byte'
For n = 010:0 & range(h6).value+10) Boucle à créer pouvant être limiter par (O10:O & Range("h6").value + 10) évitant de checker toute la colonne
Sheet("Intel 1 ").select' feuille de démarrage, pas de problème
For each c in O                 ' ????<strike>
</strike>ActiveCell.entirerow.copy
Sheets(c).select                 'problème : comment récupérer la variable c en nom de feuille
Cells(Range("A65536").End(xlUp).Row + 1, 1).Select
ActiveSheet.Paste
Sheet("intel 1").select' feuille de retour pour Next si il y a plusieurs données
Next

Sheet("intel 2").select ' Peut-être possibilité de prendre une variable qui ira choisir les feuilles dans Listsec qui est une plage de données comportant tous les noms de feuilles
For each c in O                 ' ????<strike>
</strike>ActiveCell.entirerow.copy
Sheets(c).select                 'problème : comment récupérer la variable c en nom de feuille
Cells(Range("A65536").End(xlUp).Row + 1, 1).Select
ActiveSheet.Paste
Sheet("intel 2").select
Next
 'etc....
End Sub

Vous comprenez que si il n'y a aucune donnée en colonne O10:0 & range("H6").value +10 il faut passer à une autre feuille

D'avance merci pour votre éclaircissement

Douraka outchit, chto mièrvavo litchit .

5 réponses

Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
Salut,

Sub Distribution
Dim c as Range
Dim O as Range
With Sheet("Intel 1 ")  ' attention tu as mis un espace apres le 1 du nom de la feuille
   set O = .Range("O10:O" & Range("h6").value + 10)
End With
For each c in O
   If Not c.value = "" then
      With Sheets(c.Value)
         c.entirerow.copy Destination:= .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
      End With
   End if
Next

May be something like that ...
Messages postés
57
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
26 mai 2010

Salut bigfish_le vrai, ça faisait longtemps...(mais t'es une valeur sûr!)

Merci, effectivement elle marche super bien, mais comme je suis exigeant et surtout "faignant", j'aurai souhaité intégrer également un automatisme pour les onglets, défini par ListSec (une plage de données dans une feuille de contrôle).

Pour te donner ma pensée:
With each Sheet(dansmaplageListSec) 
' et puis ta procédure qui fonctionne bien
J'attire ton attention sur le fait qu'il puisse y avoir une boucle sans fin (bug) du fait que si je bouge de la feuille1 vers la feuille2 correspondant à la valeur de la cellule en O, une fois que la macro passera sur la feuille2 elle va devoir prendre la valeur dans O qui correspond à elle même, et donc continuer à se copier dessus indéfiniment (65536-10)  :-(
Il faudrait donc également trouver un système expliquant que si la valeur dans colonne O = au nom de la Sheet passer à la suivante...

J'espère t'être assez compréhensible et te remercie encore et d'avance

Douraka outchit, chto mièrvavo litchit .

With Sheet("Intel 1 ")  ' attention tu as mis un espace apres le 1 du nom de la feuille ''''Merci
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
Salut,

tu en es ou ?

A+
Messages postés
57
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
26 mai 2010

Salut,

La distribution se fait sans problème, mais comme je l'explique plus haut, il faut passer ensuite aux autres onglets et faire la même chose. Cependant, il me faudrait afin d'éviter les boucles, une formule me disant que si le message en colonne O est égale au nom de la feuille, ne pas en tenir compte et Next...
J'ai 28 onglets dispersés dans le file, aussi, j'ai créé une plage de donnée avec les noms des onglets signifiant.
Je ne sais pas si tu as une solution du genre:
For each nom dans ma plage
Selectionner onglet portant le même nom...
Même à écrire c'est difficile alors à traduire en vba... je te laisse faire!

D'avance merci (je ne suis pas au boulot aujourd'hui et je ne pourrais donc pas vérifier, mais mercredi je te tiendrai au courant. Cependant, ta première formulation marche super!)

Bonne journée


Douraka outchit, chto mièrvavo litchit .
Messages postés
57
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
26 mai 2010

Re,
Désolé pour la couleur, erreur d'emplacement de ma signature...

Pour rectification de mes mauvaises explications, ce n'est pas un
c.entirerow.copy Destination:= .Cells(.Range("A65536").End(xlUp).Row + 1, 1) mais un
c.entirerow.cut Destination:= .Cells(.Range("A65536").End(xlUp).Row + 1, 1) 'cut
Cependant, aurais-tu un moyen permettant de virer la ligne directement car en faisant cut une fois la copie effectuer, en revenant sur la sheet on a une ligne vide, mais moi je ne veux aucun espace entre les lignes contenant le texte.
Peut-être as-tu une astuce à ce sujet...
@+


Douraka outchit, chto mièrvavo litchit .