Problème PasteSpecial dans une copie d'un Classeur a un autre

Bonjour a tous,

Je suis débutant en VBA, je commence a piger mais là je ne sais plus quoi faire. Je suis sur Excel2016

Je suis entrain de créer un système de collecte automatique de données pour l'industrie. Les opérateurs entrent les données de production dans un classeur A (Qui comporte une feuille par machine).

Puis (idéalement), chaque jour a 23h59:59s, le fichier copie les données de production du jour du Classeur A pour les coller a partir de la première ligne vide d' un ClasseurB (Masterfile).

Tout marche bien jusqu'au PasteSpecial. L'erreur renvoyée est "Erreur d'éxécution 1004 : La méthode PasteSpecial de la classe Range a échoué."

Aucune de mes deux feuilles ne sont protégées ou en lecture seule.

Pourtant, ce même pastespecial (Copier les valeurs d'un formulaire de saisie puis les coller sur la premiere ligne vide de feuille registre) marche en "interne" sur mon classeur A.

Je ne peux malheureusement pas vous joindre les fichiers car ils sont trop lourds.

Voici le code

Sub MASTERFILE()

        Workbooks.Open Filename:="C:\Users\Maxime\Desktop\PerformanceAnalysis\APA_Yearly_MasterFile\FichierB.xlsm"

    Application.ScreenUpdating = False

    'Copy prod registry into masterfile
        Workbooks("FichierA.xlsm").Activate
        Sheets("CHM1000").Select
        Range("A6:I39").Copy
        Application.CutCopyMode = False
        Workbooks("FichierB.xlsm").Worksheets("MCHM1000").Activate
        Cells(65535, 1).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

    'Copy Failures modes registry into Masterfile
        Workbooks("FichierA.xlsm").Worksheets("CHM1000").Select
        Range("AN7:BH40").Copy
        Application.CutCopyMode = False
        Workbooks("FichierB.xlsm").Worksheets("MCHM1000").Select
        Cells(65535, 40).End(xlUp)(2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

[i][.....(Mêmes opérations mais avec feuilles différentes).....][/i]

    'Save MasterFile
        ActiveWorkbook.Save
        Workbooks.Close
        Workbooks("FichierB.xlsm").Close

    Application.ScreenUpdating = True

     

"CHM1000" est le nom d'une feuille de machine dans le fichier A, et "MCHM1000" est le nom de la feuille correspondante dans le masterfile B.

Le tableau du registre commence sur les deux feuilles en A6 et se finit en I39 pour le fichier A, et en I950 pour le fichierB. (J'ai essayé en ne copiant qu'une seule ligne, ca ne marche pas non plus.)

Merci d'avance pour vos conseils et vos solutions.

Bonjour Nysos,

A première vue, je dirais que le problème vient de ces lignes :

Range("AN7:BH40").Copy
          Application.CutCopyMode = False

Vous effectuez la copie d'une plage, mais juste ensuite, avec

Application.CutCopyMode = False

Vous supprimez ce qui vient d'être copier. C'est pour cela qu'il y a une erreur 1004.

Changez de place la 2ème ligne, pour la mettre après le collage et cela fonctionnera.

Cordialement,

Bonjour,

Je suis débutant en VBA

On voit bien que tu fais de l'"enregistreur" . Tu m'en excuseras mais j'ai tendance à ne pas considérer cela comme une vraie programmation mais comme le simple enregistrement de manipulations traduites en code inefficace.

Pour commencer à le rendre efficace il conviendrait de l'épurer drastiquement et le doter de quelques éléments...

Alors :

        Application.CutCopyMode = False

Ceci vide le presse-papier.

Si tu vides le presse-papier après une commande Copy, tu ne vas plus avoir grand chose à coller !

Comme je soupçonne que tu n'as pas fait de manipulation visant à vider le presse-papier, cette commande enregistrée est l'effet d'une manip involontaire (par exemple un appui sur Esc...). Tu dois donc savoir que quand tu vois cette commande dans du code enregistré, tu dois la supprimer à tout coup, c'est que tu n'en as pas besoin là car elle a été produite par une manip qui ne visait pas explicitement cet effet. Si tu en a besoin quelque part dans ton code (par exemple pour éliminer le scillement d'une plage copiée qui persiste après collage), c'est forcément à un endroit où elle n'a pu être enregistrée.

Cela te permet d'apprendre qu'Excel utilise pour le copier-coller de données le presse-papier de Windows, et c'est cette utilisation qui en fait une caractéristique. Mais apprends aussi qu'en VBA tu disposes d'autres méthodes pour transférer des données d'un emplacement à un autre que le copier-coller qui est lent.

Il suffit de faire :

    PlageCible.Value = PlageSource.Value

les plages cible et source étant dimensionnées de façon égale.

C'est à la fois plus simple, plus court à écrire, et nettement plus rapide. Ce que je conseillerais dans ton opération.

Cordialement.

Bonjour et d'abord merci pour vos réponses très rapides !

Effectivement c'était cette ligne là (Que je ne comprenais pas vraiment) la source du problème. Ce qui est bizzare c'est que ça marchait dans une autre macro mais en tout cas c'est bon ! Merci Iron Boule !

MFerrand, effectivement je fais de l'enregistreur mais parce que je n'ai absolument 0 connaissances en VBA, maintenant en naviguant sur les forums et après quelques jours passés sur mon fichier je commence a comprendre des trucs, mais c'est pas encore ça.

Pour ta commande, comment lui dire qu'il doit entrer ces valeurs a la suite des autres dans le fichier B ? Car si la plage des valeurs du fichier A ne changent pas, celle des fichiers B change car j'accumule les données tout au long de l'année.

Mais en tout cas merci, un peu d'optimisation ne fait pas de mal. Et je ne fais pas que de l'enregistreur sinon il y aurait des .select et des .activate partout

Merci encore a vous en tout cas !

Il en demeure pas mal des Select ou Activate !

Voilà ce qui est utile dans le code que tu cites pour opérer par copier-coller :

Sub MASTERFILE()
    Dim wsC As Worksheet
    With Workbooks.Open("C:\Users\Maxime\Desktop\PerformanceAnalysis\APA_Yearly_MasterFile\FichierB.xlsm")
        Set wsC = .Worksheets("MCHM1000")
    End With
    Application.ScreenUpdating = False
    With Workbooks("FichierA.xlsm").Worksheets("CHM1000")
        .Range("A6:I39").Copy
        wsC.Cells(65535, 1).End(xlUp)(2).PasteSpecial xlPasteValues
        .Range("AN7:BH40").Copy
        wsC.Cells(65535, 40).End(xlUp)(2).PasteSpecial xlPasteValues
    End With
    Workbooks("FichierA.xlsm").Close False
    Workbooks("FichierB.xlsm").Close True
End Sub

Cordialement.

C'est sûr !

Merci beaucoup pour ce code, je vais tâcher de tout comprendre et d'adapter toutes mes macros. C'est vraiment mon premier plongeon dans VBA et j'ai un truc assez chaud mine de rien pour quelqu'un qui n'y connait rien, mais au moins on apprends vite !

Merci et bonne continuation a vous.

Cordialement,

Et voilà ce que je préconiserais, sous réserve du reste de ton code non cité qui peut nécessiter quelques aménagements.

Sub MASTERFILE()
    Dim chD$, chm1, chm2
    chD = "C:\Users\Maxime\Desktop\PerformanceAnalysis\APA_Yearly_MasterFile\"
    With Workbooks("FichierA.xlsm").Worksheets("CHM1000")
        chm1 = .Range("A6:I39").Value
        chm2 = .Range("AN7:BH40").Value
    End With
    Application.ScreenUpdating = False
    With Workbooks.Open(chD & "FichierB.xlsm")
        With .Worksheets("MCHM1000")
            .Cells(.Rows.Count, 1).End(xlUp)(2).Resize(UBound(chm1, 1), _
             UBound(chm1, 2)).Value = chm1
            .Cells(.Rows.Count, 40).End(xlUp)(2).Resize(UBound(chm2, 1), _
             UBound(chm2, 2)).Value = chm2
        End With
        .Close True
    End With
    Workbooks("FichierA.xlsm").Close False
End Sub

Cordialement.

Re,

Effectivement ce code est très rapide. En revanche, mon deuxième tableau (Failures, celui de AN7:BH40) n'est pas reporté dans le fichier B, et je ne comprends pas trop pourquoi, vu que tout à l'air correct dans le code...

J'ai essayé en Pas à pas, effectivement le premier ubound marche mais le deuxième non.

Des pistes ? Même si tu as déjà fait beaucoup .

Cordialement,

Je ne vois pas de faute de frappe ou d'espace en trop ou manquant, éléments qui auraient pu passer inaperçus... Si l'une fonctionne et l'autre pas, il n'y a pas de raison dans le code, les deux manoeuvres ne se différencient que par l'adressage source et cible, et sont identiques sur la forme.

Il faut peut-être chercher la raison dans les fichiers...

edit: essaie de voir quelles sont les valeurs de UBound(chm2, 1) et UBound(chm2, 2) au moment de l'erreur. Elles devraient apparaître au survol lorsque tu es en mode arrêt.

NB- Demain je suis absent, et ne pourrait pas répondre en cours de journée...

C'est résolu, j'avais une cellule qui était remplie plus bas, sans doute un reste d'une copie que j'avais mal paramétrée et que j'avais oublié de supprimer.

Merci beaucoup MFerrand, grâce a toi je vais pouvoir optimiser toutes mes feuilles avec cette méthodes de transfert de données, ca sera bien plus rapide. C'est comme ça qu'on apprends

Bonne continuation a vous.

Bonne continuation à toi !

Rechercher des sujets similaires à "probleme pastespecial copie classeur"