Copie données triées depuis classeur fermé - PasteSpecial → 1004 aléatoire
Bonjour à tous,
je cherche à copier des données d'un classeur fermé.
C'est données sont d'abord triées pour ne sélectionner que ce qui m'intéresse.
Je fais ensuite un copier coller mais régulièrement le PasteSpecial échoue avec une erreur 1004
Le sujet est bien sûr traité de nombreuses fois sur internet mais je ne parviens toujours pas à trouver une solution fonctionnelle.
Je n'ai pas trouvé d'autres méthodes que le PasteSpecial pour copier depuis un classeur fermé.
Auriez vous une idée ?
Sub CopieDonnees()
Application.ScreenUpdating = False
'On Error Resume Next 'Ignore les erreurs, relancer la macro au besoin
Dim XLApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim NOM As String
Dim lastfilterRow As Integer
Sheets("DonnéesBrutes").Cells.Clear 'On vide le classeur pour éviter d'afficher des projets terminés
'Ouvrir le classeur dont on a besoin avec tout le chemin...
NOM = "JD"
Set xlBook = XLApp.Workbooks.Open(Environ("USERPROFILE") & "\chemin\vers\monfichier.xlsm", ReadOnly:=True)
Set xlSheet = xlBook.Sheets("TAB BORD") ' si on veut utiliser une feuille en particulier
With xlSheet
If .FilterMode Then xlSheet.ShowAllData 'Supprime l'ensemble des filtres
End With
lastfilterRow = xlSheet.Range(["B65535"]).End(xlUp).Row ' récupère la dernière ligne non vide. Colonne B car arrive que colonne soit vide
xlSheet.Range("$A$3:$AV$" & lastfilterRow).AutoFilter Field:=13, Criteria1:=NOM 'Filtre les lignes du chargé de projet
xlSheet.Range("$A$3:$AV$" & lastfilterRow).AutoFilter Field:=26, Criteria1:=Array("DEV", "PROSP", "="), Operator:=xlFilterValues 'Sélectionne uniquement les projets en cours
lastfilterRow = xlSheet.Range(["B65535"]).End(xlUp).Row 'récupère la dernière ligne non vide
Application.DisplayAlerts = False 'évite un bug du pasteSpecial
xlSheet.Range("A3:B" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 1).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("E3:E" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 3).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("Y3:Y" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 4).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AB3:AB" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 5).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AE3:AE" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 6).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AH3:AH" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 7).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AI3:AI" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 8).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AJ3:AJ" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 9).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AM3:AM" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 10).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AN3:AN" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 11).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AO3:AO" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 12).PasteSpecial Paste:=xlPasteValues
xlSheet.Range("AP3:AP" & lastfilterRow).Copy
Sheets("DonnéesBrutes").Cells(2, 13).PasteSpecial Paste:=xlPasteValues
Application.DisplayAlerts = True
Sheets("DonnéesBrutes").Range("A1").Copy 'Évite l'alerte de presse papier plein (la méthode Application.CutCopyMode = False ne fonctionnant pas)
xlBook.Close SaveChanges:=False 'Fermeture du Tableau de bord sans enregistrer
XLApp.DoEvents 'laisse le temps à excel de fermer le document/process
XLApp.quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set XLApp = Nothing
Application.ScreenUpdating = True
End SubAvec le On Error Resume Next, on a plus d'erreur qui s'affiche.
Si les données copiées semblent incomplète, on relance la macro à la main (c'est un bouton)
J'ai bien sûr essayé de compléter le PasteSpecial avec
, Operation:=xlNone, SkipBlanks:=False, Transpose:=FalseMais rien n'y change.
Auriez vous une idée pour m'aider ?
Merci d'avance.
Bonjour Trumter et
Avez-vous essayé de regarder du côté de PQ (Power Query)
A+
bonjour Trumter, un essai avec seulement un copie&colle, je pense qu'autrement vous devez freiner un petit peu avec "DoEvents"
Sub CopieDonnees()
Application.ScreenUpdating = False
'On Error Resume Next 'Ignore les erreurs, relancer la macro au besoin
Dim XLApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim NOM As String
Dim lastfilterRow As Integer
Sheets("DonnéesBrutes").Cells.Clear 'On vide le classeur pour éviter d'afficher des projets terminés
'Ouvrir le classeur dont on a besoin avec tout le chemin...
NOM = "JD"
Set xlBook = XLApp.Workbooks.Open(Environ("USERPROFILE") & "\chemin\vers\monfichier.xlsm", ReadOnly:=True)
Set xlSheet = xlBook.Sheets("TAB BORD") ' si on veut utiliser une feuille en particulier
With xlSheet
If .FilterMode Then xlSheet.ShowAllData 'Supprime l'ensemble des filtres
End With
lastfilterRow = xlSheet.Range(["B65535"]).End(xlUp).Row ' récupère la dernière ligne non vide. Colonne B car arrive que colonne soit vide
xlSheet.Range("$A$3:$AV$" & lastfilterRow).AutoFilter Field:=13, Criteria1:=NOM 'Filtre les lignes du chargé de projet
xlSheet.Range("$A$3:$AV$" & lastfilterRow).AutoFilter Field:=26, Criteria1:=Array("DEV", "PROSP", "="), Operator:=xlFilterValues 'Sélectionne uniquement les projets en cours
lastfilterRow = xlSheet.Range(["B65535"]).End(xlUp).Row 'récupère la dernière ligne non vide
Application.DisplayAlerts = False 'évite un bug du pasteSpecial
xlSheet.Range("C1:D1,F1:X1,Z1:AA1,Ac1:AD1,AF1:AG1,AK1:AL1").EntireColumn.Delete 'supprimer colonnes non-importantes
xlSheet.Range("A3:A" & lastfilterRow).Resize(, 12).Copy 'copier 12 colonnes importantes
Sheets("DonnéesBrutes").Cells(2, 1).PasteSpecial Paste:=xlPasteValues 'coller comme valeur
Application.DisplayAlerts = True
Sheets("DonnéesBrutes").Range("A1").Copy 'Évite l'alerte de presse papier plein (la méthode Application.CutCopyMode = False ne fonctionnant pas)
xlBook.Close SaveChanges:=False 'Fermeture du Tableau de bord sans enregistrer
XLApp.DoEvents 'laisse le temps à excel de fermer le document/process
XLApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set XLApp = Nothing
Application.ScreenUpdating = True
End SubEDIT: bonjour Bruno
Merci BsAlv et BrunoM45 pour ces réponses rapides.
@BrunoM45, e vais chercher du côté de PQ, merci.
@BsAlv
un essai avec seulement un copie&colle
Ça copie bien des données, mais la ligne de suppression ne fonctionne pas (erreur 1004), même en supprimant le ReadOnly:=True
Mais ce sont les bonnes lignes copiées.
xlSheet.Range("C1:D1,F1:X1,Z1:AA1,Ac1:AD1,AF1:AG1,AK1:AL1").EntireColumn.Delete 'supprimer colonnes non-importantesje pense qu'autrement vous devez freiner un petit peu avec "DoEvents"
Oui, mais c'est peu perceptible, j'avais le soucis de la non fermeture du fichier excel, l'idée était de laisser un peu le temps pour cette fermeture.
re,
le résultat, c'est quoi ? Les données sont bien copié ou il y a encore une erreur 1004 ?
autrement en ajoutant 2 DoEvents après chaque ligne ?
xlSheet.Range("A3:B" & lastfilterRow).Copy
doevents:doevents
Sheets("DonnéesBrutes").Cells(2, 1).PasteSpecial Paste:=xlPasteValues
doevents:doeventsMerci de m'avoir répondu, la bonne réponse propre et efficace était effectivement Power Query, très puissant et efficace.
J'ai ajouté un chemin relatif avec l'astuce d'une vidéo youtube : HStUR-SXPWA (pas le droit au liens)
En résumé :
Nommer une plage de cellule "EmplacementDuFichier" ou l'on écrit son chemin relatif en vba à l'ouverture avec Environ("USERPROFILE")
Dans Power Query, après avoir ajouté un fichier excel, modification avancé et mettre :
Chemin = Excel.CurrentWorkbook(){[Name="EmplacementDuFichier"]}[Content]{0}[Column1],
Source = Excel.Workbook(File.Contents(Chemin), null, true),Mon VBA à quasiment disparu, reste 2 lignes pour des filtres automatiques quand je change le nom du chargé de projet.