Recherche par plage de données - excel vba

Djrome Messages postés 57 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 26 mai 2010 - 18 juin 2009 à 12:13
Djrome Messages postés 57 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 26 mai 2010 - 22 juin 2009 à 11:02
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

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
18 juin 2009 à 13:41
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 ...
0
Djrome Messages postés 57 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 26 mai 2010
18 juin 2009 à 16:08
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
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
22 juin 2009 à 10:26
Salut,

tu en es ou ?

A+
0
Djrome Messages postés 57 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 26 mai 2010
22 juin 2009 à 10:55
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 .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Djrome Messages postés 57 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 26 mai 2010
22 juin 2009 à 11:02
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 .
0
Rejoignez-nous