Juxtaposition de plusieurs tableaux excel d un meme fichier, VBA [Résolu]

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour a tous,

Je suis novice en VBA et novice en Forum...

J aurais souhaite grace a une macro, juxtaposer sur un onglet deux tableaux excel presents dans un meme fichier excel mais sur des onglets differents.

Ces tableaux ont les memes intitules en ligne, c est la raison pour lqauelle je veux ensuite les juxtaposer...

Pour exemple, un tableau de 7 colonnes en Sheet1 et un autre de 8 colonnes en Sheet2, a juxtaposer en sheet 3.

J'aimerais pouvoir selectionner pour chaque feuille presente, les colonnes a selectionner.

Merci d avance pour vos reponses


Ps: J espeere ne pas m etre trompe dans le theme... et je precise ne pas avoir trouve de messages sur ce topic. Uniquement des message pour combiner les lignes les unes apres les autres....

35 réponses


Hum,

le lien fait pour etre colle sur les forums n'a pas l'air de fonctionner, voici un autre lien pour recuperer le fichier.

http://www.filedropper.com/synthsesearemplirgraceauxinformationsdesautresfeuilles

Cordialement,
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Je viens de jeter un oeil sur tes images.
Ce n'est pas celles que je t'ai demandées !
Applique-toi à me relire :
Je t'ai dit plus haut que je ne voulais pas de ton classeur xls.
Rien ne t'empêche par contre de déposer sur un site ad-hoc de partage les images suivantes :
- images de tes feuilles à traiter (avec des données pour plusieurs "projets" et "colis"
- image du résultat attendu
- en précisant ce que tu as choisi comme critère de "pertinence"

Si tu ne veux pas prendre les choses avec plus dé sérieux, je vais te laisser.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Ucfoutu,

Je suis dsl encore une fois Ucfoutu, je fais vraiment de mon mieux, mais je crois que je ne comprends pas toujours ce que tu veux..

1) J'ai construit un fichier excel ac des donnees fictives, pour expliquer la logique de la macro dt j ai besoin et le resultat attendu

2)Je prends ca tres au serieux crois moi, et je ne me moque vraiement pas de toi

3) Voici le lien de ce que je viens de faire, dis moi si cela te va: http://www.filedropper.com/feuillesatraiteretresultatattendu

NB (Qu entends tu par critere de pertinence ? Je croyais l avoir deja defini, c est le fait de faire preceder mes titres de colonnes par la mention Synth)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
On commence enfin à peine à y voir à peu près clair.
Voilà ce que j'en conclus, à ce stade :
1) ton "critère de pertinence" est une chaîne de caractères par laquelle doit commencer un titre de colonne. Toutes les colonnes de chaque feuille répondant à ce critère sont concernées par le résultat à obtenir.
Est-ce bien cela ? === >> réponds par oui ou par non
2) j'observe que dans ton exemple, seule la feuil1 contient en sa colonne A un titre de colonne qui commence par "Synth", alors que tu fais de "Synth" ton "critère de pertinence". Est-ce un hasard ? Car sinon, je ne comprends pas car elle aurait pu avoir n'importe quel autre titre puisque la colonne A doit systématiquement être prise en compte dans ton récapitulatif ... de toutes manières !
3) j'observe que (mis à part ce que je viens de dire pour la colonne A de la feuil1, chacune des autres feuilles n'a, dans ton exemple, qu'une seule colonne concernée par ton "critère de pertinence". Est-ce toujours le cas (une seule colonne) ou peut-il y en avoir plusieurs par feuille ? Et si plusieurs possibles : forcément juxtaposées sur la dite feuille ou pouvant être séparées par d'autres colonnes non concernées par ton "critère de pertinence" ?

Tu commences à mesurer, je pense, l'importance de toutes ces précisions ! Les réponses précises et très claires à chacun de ces 3 points sont indispensables et déterminent le code (simple quel que soit le cas) à écrire.

Je les attends. J'écrirai ton code lorsque je les aurai !

Tu verras ensuite un petit texte : celui que tu aurais du rédiger dès ton premier message et qui, à lui seul, aurait permis de tout comprendre dès le départ, parce que rédigé de manière technique, sans même parler d'autre chose ... juste en me référant techniquement à des colonnes, des lignes, des tîtres

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Encore dsl ucfoutu

1) oui c est tt a fait cela...

2) non ce n est pas un hasard, les codes des feuilles 2 et 3 sont tous issus de la feuille 1 (=contenu de la cellule en feuille 1)

3)en effet dans mon document, dans chaque feuille il y a plusieurs colonnes concernees par mon critere de pertinence, ces dernieres ne sont pas forecement juxtaposees mais comme tu l as devine parfois separees par des colonnes non concernees.

Oui je commence a prendre la mesure de l ensemble des precisions dont tu as besoin.... Je suis vraiment dsl d avoir ete aussi gauche ...

Merci d avance...

Ps: oui je scruterai ce petit texte afin d'en prendre note..
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Excuse le retard (j'ai été occupé ailleurs).
Alors essaye ceci, donc :
tes données sur feuilles Feuil1, Feuil2, Feuil3 et Feuil4
Tes résultats affichés sur une feuille nommée resultat
Regarde les commentaires dans le code ===>> il te permettent de modifier ces noms et la chaîne de caractères retenue comme "critere" ===>>

Dim f As Worksheet, plage_a_copier As Range, titre_A1 As String, critere As String
  Dim feuilles_a_traiter
  Dim feuille_finale As Worksheet, i As Integer, j As Long, dercol As Long, derlig As Long
  
  Set feuille_finale Worksheets("resultat") '>> remplace par ton nom à toi, si tu veux
  titre_A1 "ce que tu veux" '>> le titre voulu en A1 sur ta feuille resultat
  critere "aa-" '>>> dans ton exemple, ce serait "synth-", si j'ai bien vu
  
  feuilles_a_traiter = Array("Feuil1", "Feuil2", "Feuil3", "Feuil4") ' mets ici tes feuilles à toi
  
  feuille_finale.Cells.ClearContents
  
  Application.ScreenUpdating = False
  For i = 0 To UBound(feuilles_a_traiter)
    Set f = Worksheets(feuilles_a_traiter(i))
    With f
      f.Activate
      ActiveSheet.UsedRange
      dercol = .Cells.SpecialCells(xlCellTypeLastCell).Column
      derlig = .Cells.SpecialCells(xlCellTypeLastCell).Row
      If i = 0 Then .Range("A1:A" & dercol).Copy Destination:=Worksheets("resultat").Range("A1")
      For j = 2 To dercol
        If .Cells(1, j).Value Like critere & "*" Then
          If plage_a_copier Is Nothing Then
            Set plage_a_copier = f.Range(.Cells(1, j), .Cells(derlig, j))
          Else
            Set plage_a_copier = Union(plage_a_copier, f.Range(.Cells(1, j), .Cells(derlig, j)))
          End If
        End If
      Next
      If Not plage_a_copier Is Nothing Then
        feuille_finale.Activate
        ActiveSheet.UsedRange
        dercol = feuille_finale.Cells.SpecialCells(xlCellTypeLastCell).Column
        plage_a_copier.Copy Destination:=feuille_finale.Cells(1, dercol + 1)
        Set plage_a_copier = Nothing
      End If
     End With
   Next
   feuille_finale.Range("A1") = titre_A1
   Application.ScreenUpdating = True


Lance et dis-moi si c'est bien cela, que tu attendais.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Bonjour et merci UCFOUTU,

Cela marche...

J ai juste un petit pb. Lorsque je lance la macro la premiere fois tout va bien.

Mais les fois suivantes (Lorsque je veux plus ou moins rafraichir les donnees) au lieu de venir remplacer les anciennes donnees sur la meme plage de la

feuille "resultat", les donnees rappatriees se decalent sur la droite et ainsi de suite..

Suis-je clair ?

Merci d'avance
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Je vois ce que c'est : probablement dû au fait que certaines de tes cellules ont, chez toi, été mises en forme.
On va alors modifier deux lignes :

la ligne disant :
dercol = .Cells.SpecialCells(xlCellTypeLastCell).Column

à remplacer par
dercol = .Cells(1, Columns.Count).End(xlToLeft).Column

et celle disant :
dercol = feuille_finale.Cells.SpecialCells(xlCellTypeLastCell).Column

à remplacer par :
dercol = feuille_finale.Cells(1, Columns.Count).End(xlToLeft).Column

Dis-moi si cela va maintenant bien chez toi.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
En attendant ta réponse et comme je te l'avais promis, voilà ce que tu aurais du dire simplement depuis le tout début :

J'ai plusieurs feuilles ainsi constituées :
- un nombre variables de colonnes, chaque colonne étant titrée
- un nombre variable, mais toujours le même pour chaque feuille, de lignes
- en colonne A de chaque feuille : à partir de la ligne 2 : toujours les mêmes articles, toujours classés dans le même ordre
Je souhaiterais pouvoir afficher sur une feuille nommée "resultat" :
- ma colonne A (puisque commune) en n'en modifiant que le titre
- toutes les colonnes (titre inclus), à la suite les unes des autres, dont le titre commencerait par une chaîne de caractères de mon choix


Clair, concis, technique et ne laissant planer aucun doute sur les tenants et aboutissants.
Tu constatera que cette rédaction se contente de parler de colonnes, lignes et titres, sans autres détails qui ne regardent que toi.
Une telle rédaction aurait permis d'emblée d'arriver à une solution que tu n'as pu avoir qu'après une série de questions/réponses qui n'ont fait qu'alourdir la discussion et gêner le développement.

Voilà : une telle rédaction ne fait appel, comme tu le vois, à aucune connaissance en développement. Elle n'est que l'expression claire d'une pensée claire.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Bonjour UCFOUTU,

Oui, en effet rien que des lignes et des colonnes.... J'en prends bonne note !

Sinon j'ai remplace les deux lignes comme tu me le preconisais, mais ca ne marche plus...la macro bloque en feuille 3 constamment et ne me ramene plus les

donnees dans la feuille resultat

J ai colle et essaye tour a tour la macro en n'en collant qu'une...et a ce que je vois je crois que c est la nouvelle premiere ligne qui ne va pas...

Car en changeant uniquement la deuxieme ligne dans la macro, la nouvelle logique marche mais cela ne rapatrie uniquement que les donnees de la feuille 3..

Merci d'avance
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Tu as dû faire quelque part une mauvaise manip ou renommer mal une feuille, car j'ai beau tester et retester chez moi ===>> aucun souci.
Renomme tes feuilles, ré-essaye ===>> si encore blocage : avec quel message d'erreur et sur quelle ligne ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Plus là ?
Si ne marche toujours pas, voici un code répondant à une autre philosophie qui, lui, va se "moquer" des pièges éventuels résultant de mises en forme.
Tous les chemins menant à Rome ===>>
Dim titre_A1 As String, critere As String, ou As Long, c As Range, a_supprimer As Range
  Dim feuille_finale As Worksheet, i As Integer, feuilles_a_traiter
  
  Set feuille_finale Worksheets("resultat") '>> remplace par ton nom à toi, si tu veux
  titre_A1 "ce que tu veux" '>> le titre voulu en A1 sur ta feuille resultat
  critere "aa-" '>>> dans ton exemple, ce serait "synth-", si j'ai bien vu
  feuilles_a_traiter = Array("Feuil1", "Feuil2", "Feuil3", "Feuil4") ' mets ici tes feuilles à toi
  
  Application.ScreenUpdating = False
  feuille_finale.Cells.ClearContents
  ou = 1
  For i = 0 To UBound(feuilles_a_traiter)
    With Worksheets(feuilles_a_traiter(i))
      If .Range("A1") <> "" Then
        .UsedRange.Copy Destination:=feuille_finale.Cells(1, ou)
        ou = ou + .Cells.SpecialCells(xlCellTypeConstants).Columns.Count + 1
      End If
    End With
  Next
  With feuille_finale
    For Each c In .UsedRange.Columns
      If c.Column > 1 Then
        If Not .Cells(1, c.Column).Value Like critere & "*" Then
          If a_supprimer Is Nothing Then
            Set a_supprimer = c
          Else
            Set a_supprimer = Union(a_supprimer, c)
          End If
        End If
      End If
    Next
    .Range("A1") = titre_A1
    If Not a_supprimer Is Nothing Then a_supprimer.EntireColumn.Delete
  End With
  Application.ScreenUpdating = True


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Et zut (pas assez prudent).
Remplace

ou = ou + .Cells.SpecialCells(xlCellTypeConstants).Columns.Count + 1


par

ou = ou + .UsedRange.Columns.Count + 1


Comme ça : je fais également face à d'autres présences éventuelles (formules, etc ...)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Ucfoutu,

Dsl pour le temps de reponse...

Oui c bon j ai reassaye tout marche comme tu me le disais. Cela venait de moi, mais

je ne sais pas d'ou !!

Je te remercie encore pour tout, ta patience et de t etre preocuppe de mon pb, c etait

vraiment tres sympa de ta part..

Aurais -tu des conseils pour se lancer dans l'apprentissage du VBA ? ( Livres, cours sur

internet ?)

Merci d'avance
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
238
Clos ce sujet en cliquant sur le tag "Réponse acceptée" là où réponse adéquate.
Ce geste permettra de libérer cette discussion, mais également de faciliter des recherches ultérieures.

Aurais -tu des conseils pour se lancer dans l'apprentissage du VBA ? ( Livres, cours sur internet ?)


Je suis bien le dernier à pouvoir te donner un conseil sur des cours, livres, etc ... puisque moi-même ne me suis formé qu'à l'aide de la lecture de l'aide VBA ! Je n'ai acheté qu'un seul livre, que j'ai immédiatement jeté à la poubelle tellement je l'ai trouvé contre-productif en matière d'apprentissage.
L'intérêt de ma démarche d'apprentissage ? ===>> en décortiquant, faisant des petits tests, etc ... j'ai évité d'être pollué par les approches d'autres. C'est peut-être là la raison de mes approches, souvent très personnelles, de chaque problème. Je m'en porte fort bien.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ