rechercher des données, les copier et les coller dans une autre feuille

Wawa07

XLDnaute Nouveau
Bonjour,
je viens vous trouver car j'ai besoin d'aide pour réaliser une macro qui est, pour moi, assez compliquée.

Voici ma situation:
Je dispose de trois feuilles: une qui regroupe tout les postes que je dois traiter (cpteposte); puis deux autres feuilles plus spécifiques (l'un pour le personnel (rapevenper personnel), l'autre pour le matériel (rapevenmat matériel)) que je dois intégrer à la première feuille.

Précédemment j'ai réussi à récupérer le numéro des postes dans la colonne A de chaque feuille pour pouvoir les comparer.

Pour mieux expliquer, je donne un exemple:
dans la feuille "rapevenper personnel", pour le poste "INSTALLATION PRINCIPALE (001)" (donc compte 001), il y a 58 lignes de données que je dois insérer dans la feuille "cpteposte" au poste "POSTE : 001 - INSTALLATION PRINCIPALE" (toujours compte 001).

Il y a une contrainte supplémentaire:
+ la colonne "Libellé" doit correspondre à la colonne "LIBELLE" sur la feuille cpteposte
+ la colonne "Qté Mat." doit correspondre à la colonne "Qté" sur la feuille cpteposte
+ la colonne "Tx.Loc.." doit correspondre à la colonne "P.U." sur la feuille cpteposte
+ la colonne "Montant" doit correspondre à la colonne "Montant H.T." sur la feuille cpteposte


J'ai pensé qu'il serait mieux de se placer dans la feuille "cpteposte" et de prendre les comptes, et un à un vérifier dans les deux fichiers si ils n'apparaissent pas. Si ils y sont, alors copier les données, et les coller au bon endroit dans la feuille cpteposte.

Voila ce que j'ai commencé à faire:
VB:
  Sub complete()
  With Sheets("cpteposte")
  Sheets("cpteposte").Select
  Dim l As Long, m As Long, n As Long, compte As String
  l = 0
  m = 0
  n = 0
  compte = ""


    For l = 1 To .Range("A" & Rows.Count).End(xlUp).Row
    
      If IsEmpty(.Range("A" & l)) = False Then
        compte = Range("A" & l)
      'si il trouve une valeur dans la colonne A, alors on l'enregistre dans "compte"
      'et on va regarder dans les deux autres feuilles si elle y est aussi

        For m = 3 To 4
 
          With Sheets(m)
            Sheets(m).Select
            For n = 1 To .Range("A" & Rows.Count).End(xlUp).Row 'on parcourt la colonne A a la recherche de numeros de comptes
              If IsEmpty(.Range("A" & n)) = False And .Range("A" & n) = compte Then  'si il trouve un numéro ET qu'il est égal à "compte"
'                .ActiveCell.Offset(1, 1).Select '....
'sélectionne toutes les données de ce compte et va les insérer dans la feuille cpteposte
              End If
            Next n
          End With
        Next m

      End If
    Next l

  End With
End Sub

Comme ce n'est pas évidant à expliquer, je joins le fichier (dont les données sont modifiées).

Voila, la je suis arrivé à un point ou je bloque, c'est la raison pour laquelle je viens vous demander de l'aide: comment faire la suite?

De plus, j'ai l'impression qu'il y a un problème avec les boucles, car ça trouve le code "001" sur les trois feuilles, et puis plus rien....

Je vous remercie par avance pour votre aide.
Cordialement.
A bientôt

Edition: J'ai oublié de joindre le fichier :eek:
 

Pièces jointes

  • TEST.xlsm
    203 KB · Affichages: 63
  • TEST.xlsm
    203 KB · Affichages: 73
  • TEST.xlsm
    203 KB · Affichages: 70
  • TEST_xls.xls
    466.5 KB · Affichages: 66
  • TEST_xls.xls
    466.5 KB · Affichages: 72
  • TEST_xls.xls
    466.5 KB · Affichages: 61
Dernière édition:

Excel-lent

XLDnaute Barbatruc
Re : rechercher des données, les copier et les coller dans une autre feuille

Bonsoir Wawa07,

N'ayant pas Excel 2007, ni 2010, je ne peux voir ton fichier, mais en parcourant ta macro une petite chose m'a surpris!

Au début de ta macro tu écris :
With Sheets("cpteposte")
Sheets("cpteposte").Select

Lorsqu'on écrit With ... End With, c'est pour dire à Excel, lorsque je vais rajouter un point devant ma cellule, cela signifiera que je parle de CETTE feuille. Evitant ainsi de sélectionner la feuille et gagner du temps en durée d'éxécution.

Lorsqu'on écrit Sheets("cpteposte").Select, c'est pour dire à Excel, sauf contre-ordre, à chaque fois que je travaillerais sur une cellule, ce sera forcément sur cette cellule.

Bref, c'est deux méthodes sont redondantes!

De plus, plus loin dans ton code tu refais la même erreur (c'est pas vraiment une erreur, puisque cela ne génère aucun bug dans la macro - mais ce n'est pas jolie et surtout inutile ;)) :

With Sheets(m)
Sheets(m).Select

Astuce : sauf erreur, tu travail sur deux onglets? L'onglet : cpteposte et l'onglet m

Dans ce cas, personnelement je sélectionne l'une des deux feuilles au début de ma macro. Et pour la seconde j'utilise l'astuce : With ... End With. Ainsi, lorsque je veux parler de la première feuille, je met rien devant ma cellule (dans le code). Et lorsque je veux parler de la seconde feuille : je met un point devant.

Sauf erreur (car je ne peux tester ma correction sur ton fichier), voici ta macro corrigé :

VB:
Sub complete()

Dim l As Long, m As Long, n As Long, compte As String
l = 0
m = 0
n = 0
compte = ""

Sheets("cpteposte").Select


For l = 1 To Range("A" & Rows.Count).End(xlUp).Row
    
   If IsEmpty(Range("A" & l)) = False Then
          compte = Range("A" & l)
          'si il trouve une valeur dans la colonne A, alors on l'enregistre dans "compte"
          'et on va regarder dans les deux autres feuilles si elle y est aussi

       For m = 3 To 4
 
          With Sheets(m)
              For n = 1 To .Range("A" & Rows.Count).End(xlUp).Row
              'on parcourt la colonne A a la recherche de numeros de comptes
                   If IsEmpty(.Range("A" & n)) = False And .Range("A" & n) = compte Then
                      'si il trouve un numéro ET qu'il est égal à "compte"
                      '.ActiveCell.Offset(1, 1).Select ....
                      'sélectionne toutes les données de ce compte et va les insérer dans la feuille cpteposte
                  End If
             Next n
         End With
      Next m

   End If
Next l

End Sub

Bonne continuation
 

Wawa07

XLDnaute Nouveau
Re : rechercher des données, les copier et les coller dans une autre feuille

Bonjour,
tout d'abord merci beaucoup pour votre aide, grâce à vous la boucle fonctionne maintenant.

Toutefois, je suis toujours confronté au même problème, je ne sais pas comment insérer les nouvelles lignes dans les colonnes précises ...

Je joins le nouveau fichier, au format xls cette fois-ci ;)

Cordialement.
 

Pièces jointes

  • TEST_xls.xls
    466.5 KB · Affichages: 64
  • TEST_xls.xls
    466.5 KB · Affichages: 73
  • TEST_xls.xls
    466.5 KB · Affichages: 70

Excel-lent

XLDnaute Barbatruc
Re : rechercher des données, les copier et les coller dans une autre feuille

Bonjour Wawa07,

Wawa07 à dit:
Toutefois, je suis toujours confronté au même problème, je ne sais pas comment insérer les nouvelles lignes dans les colonnes précises ...

Je ne comprend pas tout. Tu veux insérer des lignes dans des colonnes? C'est techniquement possible (mettre les colonnes en lignes et vice versa - bref retourner le tableau), mais je ne vois comment étant donné la structure de tes tableaux.

Wawa07 à dit:
Pour mieux expliquer, je donne un exemple:
dans la feuille "rapevenper personnel", pour le poste "INSTALLATION PRINCIPALE (001)" (donc compte 001), il y a 58 lignes de données que je dois insérer dans la feuille "cpteposte" au poste "POSTE : 001 - INSTALLATION PRINCIPALE" (toujours compte 001).

Il y a une contrainte supplémentaire:
+ la colonne "Libellé" doit correspondre à la colonne "LIBELLE" sur la feuille cpteposte
+ la colonne "Qté Mat." doit correspondre à la colonne "Qté" sur la feuille cpteposte
+ la colonne "Tx.Loc.." doit correspondre à la colonne "P.U." sur la feuille cpteposte
+ la colonne "Montant" doit correspondre à la colonne "Montant H.T." sur la feuille cpteposte

Les noms de colonnes (en rouge ci-dessus) ne sont pas présente dans ton onglet rapevenper personnel. Par contre elles sont présentent dans l'onglet : "Rapevenmat matériel".

Si je pars du principe que tu as inversé les noms d'onglet dans ton explication, j'ai toujours quelques soucis de compréhension.

Pour résumer, si j'ai bien compris, tu veux recopier sur l'onglet "CptePoste" toutes les données figurant dans les onglets "RapevenMat Matériel" et "RapevenPer Personnel".

De plus, tu veux insérer ces lignes à un endroit bien précis : juste en-dessous ou au-dessus de la ligne qui aura le même Libellé, même quantité, même ...

Dans ce cas, je ne comprend pas tout car si l'on parle concrètement :
Onglet "Rapevenmat Matériel" : ligne n°12 nous avons :
-> colonne A : 1
-> colonne B "libellé" : "Matériel (P365)"
-> colonne C "Qté Mat" : rien
-> colonne D "Tx. Loc." : rien
-> colonne E "Montant" : rien

Or si j'ai bien compris, tu veux insérer cette ligne sur l'onglet "CptePoste" au-dessus (ou en-dessous : c'est pas gênant), de la ligne ayant :
-> colonne A : 1
--------> jusque là ça va
-> colonne B "Rgrt" ou colonne C "Nat. Dép." : "Matériel (P365)"
--------> à partir de là ça bug! J'y comprend plus rien. Car "Matériel (P365)" ne figure NUL PART dans ton onglet "CptePoste"
-> idem pour les autres colonnes.

Peux-tu nous éclairer sur ces différents points?

Astuce : si cela te convient, il sera BEAUCOUP plus simple de procéder ainsi (si cela correspond à ton cahier des charges) :
-> aller sur l'onglet "Rapevenmat Matériel", prendre TOUTES les lignes du poste "INSTALLATION PRINCIPALE (001)" et les mettre dans l'onglet "CptePoste", dans le poste concerné

-> faire de même pour tous les autres postes.

-> faire ensuite de même pour l'onglet "RapevenPer Personnel" : poste par poste.

=> une fois toutes les lignes de tes deux onglets intégrés dans ton onglet "CptePoste" : trier POSTE par POSTE les lignes qui le compose. Ainsi toutes les lignes ayant le même "libellé", "Qté", ... seront regroupées ensemble et classées dans l'ordre (croissant ou décroissant : à ta convenance)

A te lire
Cordialement
 

Wawa07

XLDnaute Nouveau
Re : rechercher des données, les copier et les coller dans une autre feuille

Re bonjour,
Astuce : si cela te convient, il sera BEAUCOUP plus simple de procéder ainsi (si cela correspond à ton cahier des charges) :
-> aller sur l'onglet "Rapevenmat Matériel", prendre TOUTES les lignes du poste "INSTALLATION PRINCIPALE (001)" et les mettre dans l'onglet "CptePoste", dans le poste concerné

-> faire de même pour tous les autres postes.

-> faire ensuite de même pour l'onglet "RapevenPer Personnel" : poste par poste.

=> une fois toutes les lignes de tes deux onglets intégrés dans ton onglet "CptePoste" : trier POSTE par POSTE les lignes qui le compose. Ainsi toutes les lignes ayant le même "libellé", "Qté", ... seront regroupées ensemble et classées dans l'ordre (croissant ou décroissant : à ta convenance)

C’est exactement ça que je cherche à faire : regrouper les données de « Rapevenmat Matériel » et de « rapevenper personnel » dans la feuille « cpteposte » (dans les bon postes)
Envoyé par Wawa07
Pour mieux expliquer, je donne un exemple:
dans la feuille "rapevenper personnel", pour le poste "INSTALLATION PRINCIPALE (001)" (donc compte 001), il y a 58 lignes de données que je dois insérer dans la feuille "cpteposte" au poste "POSTE : 001 - INSTALLATION PRINCIPALE" (toujours compte 001).

Il y a une contrainte supplémentaire:
+ la colonne "Libellé" doit correspondre à la colonne "LIBELLE" sur la feuille cpteposte
+ la colonne "Qté Mat." doit correspondre à la colonne "Qté" sur la feuille cpteposte
+ la colonne "Tx.Loc.." doit correspondre à la colonne "P.U." sur la feuille cpteposte
+ la colonne "Montant" doit correspondre à la colonne "Montant H.T." sur la feuille cpteposte
Les noms de colonnes (en rouge ci-dessus) ne sont pas présente dans ton onglet rapevenper personnel. Par contre elles sont présentent dans l'onglet : "Rapevenmat matériel".

Ensuite, Effectivement, j’ai voulu aller trop vite et j’ai pas fait attention que les noms n’étaient pas les mêmes ^^’.
J’aurais du dire :
+ la colonne "Libellé" (des deux feuilles Rapevenmat matériel et Rapevenmat personnel) doit correspondre à la colonne "LIBELLE" sur la feuille cpteposte
+ la colonne "Qté Mat." de la feuille Rapevenmat matériel et la colonne « Qté Pers. » de la feuille Rapevenmat personnel doit correspondre à la colonne "Qté" sur la feuille cpteposte
+ la colonne "Tx.Loc.." de la feuille Rapevenmat matériel et la colonne « Taux » de la feuille Rapevenmat personnel doit correspondre à la colonne "P.U." sur la feuille cpteposte
+ la colonne "Montant" (des deux feuilles Rapevenmat matériel et Rapevenmat personnel) doit correspondre à la colonne "Montant H.T." sur la feuille cpteposte


Sinon j'ai essayé d'avancé un peut et j'ai changé des choses pour que la suite soit plus facile:
J'ai ajouté le numéro de poste devant chaque lignes devant être copiées dans les feuilles Rapevenmat matériel et Rapevenmat personnel.
J'ai ajouté une coloration aux lignes des feuilles Rapevenmat matériel et Rapevenmat personnel ayant deja été copiées pour ne pas les copier deux fois.
J'ai ajouté des colonnes vides sur les deux feuilles Rapevenmat matériel et Rapevenmat personnel pour qu'elle corresponde à la mise en forme du fichier cpteposte.


Mais la.... je ne sais pas comment faire pour insérer les lignes sur la feuille cpteposte dans le bon poste...
Je joins le nouveau fichier, et j'ai ajouté un exemple pour le premier poste.

Bien cordialement.
 

Pièces jointes

  • TEST_xls2.xls
    498 KB · Affichages: 49

Excel-lent

XLDnaute Barbatruc
Re : rechercher des données, les copier et les coller dans une autre feuille

Bonsoir Wawa07,

C'est beaucoup plus clair (en partie grâce à l'exemple que tu as mis dans ton fichier - les fameuses lignes rouges ;) ). De plus, l'utilisation de format identique entre les différents onglets (insertions de colonnes, ...) permet ainsi d'avoir une macro plus simple et plus rapide.

Ci-joint ta solution.

Il te reste plus qu'à faire la mise en forme et le trie.

D'après le code vu sur tes macros, tu semble maîtriser ce que j'ai utilisé. Mais si tu as besoin de plus d'explication, n'hésite pas.

Bonne soirée.

PS. : macro testée, ça fonctionne
 

Pièces jointes

  • TEST_xls3.xls
    502 KB · Affichages: 56
Dernière édition:

Wawa07

XLDnaute Nouveau
Re : rechercher des données, les copier et les coller dans une autre feuille

Super ! Vraiment merci beaucoup !
Tout fonctionne parfaitement, tu me sauve ;)
Je m'occupe de ce qui manque et puis c'est bon.
Encore merci et à bientôt !
 

Discussions similaires

Réponses
5
Affichages
421

Statistiques des forums

Discussions
314 588
Messages
2 110 988
Membres
111 002
dernier inscrit
Lolo73i