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"
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 !