VBA copie de 6 feuil grouper dans un autre fichier

Bonjour, il y a quelques mois je vous avais demandé de l'aide pour une formule similaire et grâce au membres du forum, j'avais trouvé la solution.

mon nouveau problème est similaire mais un peu différent:

j'ai le classeur du nom de "RECAP.xlsm" ou il y a environ 13 feuilles. dedans il y a 6 feuilles qui m’intéresse : "LIASSE75", "LIASSE78".... Les autres sont pour des stat ex: la feuille "stat2015".

Le classeur "TABLEAU A3.xlsm" quand a lui a une feuille "A3" dont je vais remplir des informations tous les jours et une feuille "Liste" ou je veux que soit coller les données de "RECAP".

je voudrai pouvoir récupérer les 6 feuilles qui m’intéresse et les mettre dans le classeur "TABLEAU A3.xlsm" dans la feuille "Liste" de façon a avoir une feuille avec la liste de tout ce qui y a dans les feuilles liasse.

Les feuilles LIASSE on toute la même base a savoir que les deux première ligne sont faite pour définir mes colonnes et à la ligne 5 commence les donner a déplacer. et je voudrai prendre de la colonne A à la colonne H.

N'étant pas un expert, je voulais creer des feuilles dans le classeur "TABLEAU A3.xlsm" avec le meme nombre de feuille "75", "78", "92", "93", "94", "95" et faire un copié/collé des données du classeur "RECAP" pour ensuite les assembler ensembles dans la feuille "Liste".

je voulais utiliser ca pour faire marcher le fichier, mais de toute évidence je suis encore moins bon qu'avant vu que cela ne marche pas :C .

Private Sub CommandButton1_Click()
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
 Application.CutCopyMode = False

Application.Workbooks.Open "C:\Users\tarik\Desktop\cfe\RECAP.xlsm"

Workbooks("RECAP.xlsm").Sheets("LIASSE75").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("75").Range("A1")
Workbooks("RECAP.xlsm").Sheets("LIASSE78").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("78").Range("A1")
Workbooks("RECAP.xlsm").Sheets("LIASSE92").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("92").Range("A1")
Workbooks("RECAP.xlsm").Sheets("LIASSE93").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("93").Range("A1")
Workbooks("RECAP.xlsm").Sheets("LIASSE94").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("94").Range("A1")
Workbooks("RECAP.xlsm").Sheets("LIASSE95").Cells.Copy Workbooks("TABLEAU A3 PAYANT.xlsX").Sheets("95").Range("A1")

Workbooks(RECAP.xlsm).Close SaveChanges:=False
'(pour copier dans le classeur désiré, mais ne marche déjà pas)

'( et ca pour les réunir, c'est le code que j'utilise pour un autre fichier merci au personne du forum de excel-pratique  :D, meme si je pense que ce ne marchera pas pour ce que je veux faire notament pour exclure la feuille Liste et A3 du comptage) 
Dim dlgR As Integer, dlgi As Integer
Dim i As Byte
  For i = 1 To Worksheets.Count
    If UCase(Sheets(i).Name) <> "Liste", "A3" Then
      drL = Sheets("Liste").Range("A" & Rows.Count).End(xlUp).Row
      With Sheets(i)
        drLi = .Range("I" & Rows.Count).End(xlUp).Row
        .Range("A3":H" & drLi).Copy Sheets("Liste").Range("A" & drL + 1)
      End With
    End If
  Next

 Application.DisplayAlerts = True
 Application.ScreenUpdating = True
 Application.CutCopyMode = True
End Sub

j'aimerai aussi pouvoir supprimer les données copier car elle sont modifier au fur et à mesure, et ca j'y arrive pas.

je vous remercie d'avance de vos réponses

Bonjour

Pourrais-tu joindre tes 2 fichiers ?

Bye !

oui bien sur j'ai supprimer des données sinon y en aurait pour 23 Mo.

petite info y a des macro sur le classeur recap, mais je ne peut y toucher n'ayant pas le mot de passe et pour l'avoir je dois en faire la demande et ca prend environ un mois.

10recap.xlsm (143.46 Ko)

Un essai à tester. Te convient-il ?

Bye !

12asaroth-v1.zip (161.08 Ko)

Si seulement je comprenais ce que tu as fais.... la c'est trop compliquer pour que je puisse faire des transformation , bien que c'est cela que je cherchai.

Est ce que je peux t’embêter pour deux questions supplémentaires:

je sais que pour ouvrir le fichier tout seul il faut faire ca:

Application.Workbooks.Open "C:\Users\tarik\Desktop\cfe\RECAP.xlsm"

je voudrai l'implanter dans ce que tu as fais, mais je veux etre sur qu'elle est bien placer pour éviter des bugs

Option Explicit

Dim w As Workbook, f As Worksheet, liste, i&, j&, k&, n&
Dim tablo, tabloR()

Sub MiseAjourImports()
   Application.Workbooks.Open "C:\Users\tarik\Desktop\cfe\aide\RECAP.xlsm"
    Range("A4:H" & Application.Max(4, Range("A" & Rows.Count).End(xlUp).Row)).ClearContents
    On Error GoTo Ouvrir
    Set w = Workbooks("RECAP.xlsm")
    On Error GoTo 0

    liste = Array("LIASSE75", "LIASSE78", "LIASSE92", "LIASSE93", "LIASSE94", "LIASSE95")
    k = 0
    For n = 0 To 4
        Set f = w.Sheets(liste(n))
        tablo = f.Range("A3:H" & Application.Max(4, f.Range("A" & Rows.Count).End(xlUp).Row))
        For i = 1 To UBound(tablo, 1)
            For j = 1 To UBound(tablo, 2) - 1
                ReDim Preserve tabloR(8, k + 1)
                tabloR(j - 1, k) = tablo(i, j)
            Next j
            tabloR(7, k) = f.Name
            k = k + 1
        Next i
        Erase tablo
    Next n

[i][b]    Workbooks("RECAP.xlsm").Close True[/b][/i]

    Range("A4").Resize(UBound(tabloR, 2), 8) = Application.Transpose(tabloR)
Exit Sub

Ouvrir:
    MsgBox "Le fichier ''RECAP.xlsm'' doit être ouvert.", 16
End Sub

ma deuxième question est pour un test que j’essayai de faire, mais visiblement j'ai un problème il me dit que l'indice n'appartient pas à la sélection et je comprends pas pourquoi:

cette macro est dans le classeur arriver.

Sub importDonnée()

Application.Workbooks.Open "C:\Users\tarik\Desktop\cfe\test autre\Fichier Source.xlsm"

Workbooks("Fichier Source.xlsm").Sheets("SOURCE 1").Activate
Sheets("SOURCE 1").Range("A2:v" & Sheets("SOURCE 1").Range("A" & Rows.Count).End(xlUp).Row).Select
Selection.Copy

Windows("arriver.xlsm").Select

Sheets("feuil1").Range("A2:v" & Sheets("75").Range("A" & Rows.Count).End(xlUp).Row).Select
    ActiveSheet.Paste

Workbooks("Fichier Source.xlsm").Close True

End Sub

desolé après avoir fait le test avec le fichier original, il me donne une erreur : erreur d’exécution incompatibilité de type

sur cette ligne:

Range("A4").Resize(UBound(tabloR, 2), 8) = Application.Transpose(tabloR)

et ne copie pas les feuilles, mais vu la taille du vrai fichier, je pourrai pas te l'envoyer.

le nombre de ligne doit depasser les 50 000

je pourrai te l'envoyer par mail si tu le desires, mais a mon avis c'est le fichier qui comporte des erreurs et pas ta formule mais bon

asaroth a écrit :

je sais que pour ouvrir le fichier tout seul il faut faire ca:

C'est bien ça si ton fichier est sur ton bureau.

Pour ce qui est de placer cette instruction, je l'ai intégré au code précédent que j'ai adapté : à toi de le tester.

Si seulement je comprenais ce que tu as fais....

Pour t'aider, je t'ai commenté la nouvelle macro.

On peut faire plus simple mais la macro mettra alors beaucoup plus de temps à arriver au résultat...

OK ?

Bye !

j'ai toujours le meme probleme, il me dis qu'il y a la meme erreur

erreur d’exécution incompatibilité de type 13

sur cette ligne:

Range("A4").Resize(UBound(tabloR, 2), 8) = Application.Transpose(tabloR)

et ne copie rien alors que quand il y a peu de donnée ca marche...

est ce que je pourrais t'envoyer le fichier complet que tu puisse voir e qui se passe et si c'est pas à cause de la taille du fichier?

asaroth a écrit :

est ce que je pourrais t'envoyer le fichier complet que tu puisse voir e qui se passe et si c'est pas à cause de la taille du fichier?

Bien sûr !

S'il est trop gros, même compressé avec Zip, passe par http://www.cjoint.com

Bye !

Bonjour,

Désolé de m'immiscer ...

Accepter mes excuses si je suis au côté de la plaque ...

Le code mentionne ...

For n = 0 To 4 'On fait une boucle pour s'intéresser successivement aux 5 feuilles source

Mais n'y a-t-il pas 6 feuilles ? Donc For n= 0 To 5 ...

Gelinotte

gelinotte a écrit :

Mais n'y a-t-il pas 6 feuilles ? Donc For n= 0 To 5 ...

Bonjour gelinotte

Tu as tout à fait raison, c'est moi qui ai une tête de linotte...

Que n'est-elle de gélinotte !

Merci de ton intervention.

Bye !

j'ai reussi a le mettre en compresser sur le site que tu m'as donné :

https://www.cjoint.com/c/FHhtaFMyj4N

si tu comprends pourquoi ca ne fonctionne pas

Bonjour,

Effectivement, sur une grande quantité de données, les résultats inscrits dans la feuille ne correspondent pas aux données sources.

Mais n'étant pas bon en "tableau", moi non plus, je ne comprends pas ce qui se passe.

Gelinotte

je me demande si en décortiquant le truc du genre, mettre les donner dans des dossier séparer ca mettra pluse de temps mais peut etre cela fonctionnera.

j'ai peut etre acces au code et dans ces conditions, demain je remplacerai cette demande pour comprendre la macro pour faire la recherche qui m’intéresse ^^.

pke le principe était de tout assembler pour faire des recherche, mais peut etre en utilisant les donner tell quel on pourrait en faire quelques chose ^^.

bonne soirée et a demain, sauf si vous avez une idée pour arranger ca

Bonjour,

Décortiquer... décortiquer qu'il disait ... ce n'était pas fou du tout ...

J'ai décortiqué ... mais pas en plusieurs feuilles ... j'ai décortiqué le code ...

Le problème provient du trop grand nombre de données à traiter d'un coup. Car le code de gmb fonctionne correctement.

J'ai donc procédé en trois étapes.

1- Liasse75 = 46368 lignes

2- Liasse78 + Liasse92 = 25711 lignes

3- Liasse93 + Liasse94 + Liasse95 = 22374 lignes

Les 5 feuilles de Recap s'agglomèrent dans la feuille "Liste" du fichier joint et totalisent 94453 lignes.

Si gmb trouve une astuce pour le nombre d'enregistrement, ça fera un meilleur code ...

En attendant, ça fonctionne ...

Gelinotte

ca fonctionne et ce qui est bien, c'est que vu que t'as laisser le code fait avec la modif je comprends comment ca fonctionne encore mieux. dejà qu gmb m'a fait une explication sur le code qu'il avait fait mais avec toi en plus c'est cool.

je vous remercie pour vos réponse, je vais pouvoir travailler sur un pseudo moteur de recherche pour trouver des information sur ce listing.

si jamais l'envie vous prend de trouver une solution pour améliorer, je rouvrirai une nouvelle demande avec le même nom et le fermerai aussitôt, donc me l'envoyer en pm ou autre^^.

merci encore à tous ceux qui on aidé aussi bien que ceux qui regarder mon problème.

Bonjour à tous

En effet, le fichier RECAP est très gros : mon PC met 10 secondes à l’ouvrir…

Et tellement gros qu’il arrive à saturer ma mémoire tableau. Apparemment, elles ne peuvent pas contenir plus de lignes qu’il n’y a de colonne sur une feuille de calcul (16384 sur Excel 2007 et au-delà)

Alors, il faut ruser.

J’ai fait en sorte que dès que la mémoire tabloR atteint la valeur de 16380, ses données sont copiées à la suite sur la feuille Liste. Ses données sont alors effacées, et elle est réinitialisée pour recueillir les données suivantes.

Et ça a l’air de marcher.

A tester tout de même.

Au moment de poster, je lis le message de Gélinotte : Bravo pour tes recherches !

Mais, je n’ai pour ma part pas réussi à arriver au résultat même en ne prenant que la première feuille de plus de 46000 lignes, d’où ma conclusion et ma méthode de se limiter à 16380 lignes…

Si quelqu’un en sait plus sur les limites des variables tableau, je suis preneur.

Bye

Bonjour,

Un site mentionne :

L'instruction ReDim est utilisée pour définir (ou redéfinir), en cours de procédure, l'espace mémoire alloué à un tableau dynamique.

L'espace mémoire alloué ... ce qui me laisse penser que les variables tableaux se comportent comme les graphiques ... ils doivent impérativement être en mémoire vive ... ils ne peuvent être placés partiellement ou totalement en mémoire virtuel (swapfile).

Ce qui explique que sur ma machine (12 go Ram), je peux traiter trois feuilles (Liasse75,78 et 93) à la fois 46368, 8086 et 9730 = 64184 lignes ( mais pas plus ) et que la machine de gmb bloque sur la première feuille de 46368 lignes.

Il reste l'éventualité de la version de Excel qui pourrait aussi imposer une autre limite.

Je vais recherche une version de Excel 2007 pour tester cette éventualité.

Gelinotte

Bonjour à tous

@gelinotte

Tu as certainement raison ; rien à voir donc avec l'assimilation que j'avais faite avec le nombre de colonnes d'une feuille.

Sauf que je me suis basé la dessus pour trouver une astuce qui, au moins sur mon PC, m'a permis d'arriver au résultat souhaité.

Dommage que je ne puisse savoir si elle marche sur tous les PC.

Car c'est bien là ce qui m'intéresse le plus : trouver des solutions qui marchent pour tout le petit monde du forum

En tout cas, merci encore de ton travail et si trouve quelque chose d'autre sur le sujet, je serais ravi d'en prendre connaissance.

Bye !

Bonjour,

J'ai testé ta version "en boucle" et elle fonctionne correctement. Pour qu'elle soit compatible avec une grande majorité de machines, il faudrait faire une boucle d'un nombre de lignes ... étalonné sur la quantité de mémoire vive de ton ordi. i.e. Si ta machin a beaucoup de mémoire vive = diminuer le nombre de lignes dans la sous-routine ou si ta machine à 4 go Ram (ce qui est passablement la norme aujourd'hui, à part quelques vieilles bécannes).

J'ai trouvé dans mon stock une version de Excel 2007 que j'ai installé temporairement. Elle gère bien 64000 lignes avec ta macro d'origine. C'est donc bien la quantité de mémoire vive qui détermine ce que peut traiter une variable tableau. Ce qui est tout à fait logique avec son aspect premier : la rapidité d'exécution. Si les variables tableau pouvaient passer en mémoire virtuel, le traitement serait à la merci des performances du disque.

J'espère un jour comprendre suffisamment les variables tableau pour les composer moi-même. Car, présentement, je ne réussis qu'à adapter du code trouvé sur le Net.

Espérant que tout cela ait pu aider l'ami asaroth

Gelinotte

Rechercher des sujets similaires à "vba copie feuil grouper fichier"