Excel 2010 - Échec sur Déplacer/Copier une feuille d’un clas
Bonjour à tous.
Les recherches dans les forums autour des mots-clés ‘copier’, ‘déplacer’, ‘feuille’, ‘1004’ ont confirmé que
cette erreur se produisait ailleurs, mais sans que cela éclaire mon cas propre.
Merci donc d’avance à ceux qui me feront bénéficier de leurs lumières.
Contexte :
Des routines VBA pour Excel créées sous « Windows XP / Excel 2003 » fonctionnent sans souci sous « Windows XP / Excel 2003 ».
Je dois vérifier leur fonctionnement et éventuellement les adapter à « Windows 7 - Excel 2010 »
Objectif de la routine :
À partir des données d’une extraction d’une base de données, la routine VBA
- crée un classeur de travail,
- effectue des calculs et en mémorise le résultat dans un tableau,
- injecte la feuille supportant le tableau dans un fichier-cible existant,
- effectue d’autres calculs dans le fichier-cible,
- se félicite du résultat.
Objectif de la section de routine en cause :
Copier-Coller une feuille d’un classeur-source vers un classeur-cible.
Nom du classeur-source : ‘OC Sardi - 1305.xls’,
contenu dans la variable-chaîne ‘NomFichierAnalyseOc’.
Nom de la feuille : ‘Analyse’.
Nom du classeur-cible : ‘2013 - Tableau de Bord - Optimisation du Réseau - Annuel.xls’,
contenu dans la variable-chaîne ‘NomFichierTbord’.
Section de routine en cause :
Workbooks(NomFichierAnalyseOc).Activate
Sheets("Analyse").Copy After:=Workbooks(NomFichierTbord).Sheets("Bilan - Parc-HS")
Diagnostic :
Note : tests effectuées avec les mêmes classeurs, fermés sans enregistrer après essai.
Sous « Windows XP - Excel 2003 » : aucun problème d’exécution.
Sous « Windows 7 - Excel 2010 » : avortement sur diagnostic
‘erreur [...] '1004' [...] Excel ne parvient pas à insérer les feuilles dans le classeur destination
car il contient moins de lignes et de colonnes que le classeur source [...]’.
Tests "manuels" complémentaires sous « Windows 7 - Excel 2010 » :
0 - création de deux classeurs vierges.
1 - Déplacer/Copier de la feuille ‘Analyse’ dans le classeur-cible (‘2013 - Tableau de Bord […].xls’) :
échec 1004.
2 - Déplacer/Copier de la feuille ‘Analyse’ dans un classeur vierge :
échec 1004.
3 - Déplacer/Copier de la feuille ‘Analyse’ dans le même classeur-source (‘OC Sardi - 1305.xls’) :
OK.
4 - Déplacer/Copier de la feuille-copie créée par le test 3 dans le classeur-cible (‘2013 - Tableau de Bord […].xls’) :
échec 1004.
5 - Déplacer/Copier de la feuille-copie créée par le test 3 dans un classeur-cible vierge :
échec 1004.
5 - Copier-coller du tableau de résultat dans la feuille ‘feuil1’ du second classeur vierge
et Déplacer/Copier de la feuille ‘feuil1’ dans le classeur-cible (2013 - Tableau de Bord […].xls :
OK.
Remarque :
La feuille ‘Analyse’ est à l’origine une feuille-modèle vierge incluse dans le classeur qui supporte la routine.
Cette routine l’injecte par ‘Déplacer/Copier’ dans le classeur-source ‘OC Sardi - 1305.xls’
(après bien sûr avoir créé celui-ci).
Le section de code qui effectue cette action fonctionne correctement sous « Windows 7 - Excel 2010 ».
J’ai vérifié manuellement.
Analyse des tests :
Je crois pouvoir considérer que
- ni la feuille-modèle de ‘Analyse’, ni le classeur ‘2013 - Tableau de Bord - Optimisation du Réseau - Annuel.xls’
ne sont en cause ;
- Excel 2010 sait traiter les codes du type
Sheets("NomFeuille1").Copy After:=Workbooks("NomClasseur").Sheets("NomFeuille2") ;
- L’échec est lié à la feuille ‘Analyse’ après sa mise à jour.
Palliatif :
Sauf surprise 2010, le palliatif évident serait de
coder la création d'une feuille-cible dans le classeur-cible ainsi que le copier-coller du tableau de données...
Questions :
J'aimerais comprendre le sens du diagnostic d'échec, le pourquoi de sa survenance
et utiliser si nécessaire un code plus élégant que le palliatif évident cité ci-dessus.
Donc deux questions :
- Pourquoi ?
- Comment corriger ?
P.J. pour vos éventuels tests :
J’ai zippé les fichiers nécessaires (sous Windows 7).
Si vous en avez besoin... et si je trouve comment les envoyer :
Les dézipper dans un répertoire unique (son nom est indifférent).
Ouvrir le classeur ‘_ Outil de màj - TBord Optimisation.xls’.
Dans la feuille ‘Pilotage’, cliquer sur la zone de texte ‘Calcul du tableau de bord optimisation’.
Et à Dieu vat !
Merci à ce qui me liront.
Grand merci à ceux qui m'éclaireront.
André Blanquer
Salut et bienvenue sur le Forum,
J'ai tenté de lire ton texte et j'ai très vite été découragé par sa longueur
Alors un conseil : prends un problème après l'autre et tu auras probablement plus de succès.
Tu dis ne pas savoir comment placer un fichier sur le Forum (ce qui augmente tes chances d'obtenir une réponse par 1237), alors regarde déjà cette première possibilité :
Cordialement.
Bonjour,
excel 2003 : 65536 lignes
excel 2010 : 1048576 lignes
C'est comme chez le chausseur, tu fais du 46 et il n'a que du 39 fillette. Tu as beau essayer : ça ne rentre pas...
A moment donné tu as un fichier créé sur 2010 et tu essaies de copier une feuille (1048576 lignes) vers le classeur en mode de compatibilité (65536 lignes) : ça ne rentre pas...
Apparemment un classeur créé sous 2010 et enregistré en .xls et donc annoncé en Mode de compatibilité dans les informations, reste avec son million de lignes, à moins de le fermer et de le rouvrir. Je m'attendais à mieux mais bon.
Donc à essayer :
- copier la plage et non la feuille pour la coller dans une feuille du xls d'origine
- ou convertir les autres classeurs au format xls (par macro) et les rouvrir.
eric
Bonjour à, tous
et merci à Eriiic et à Yvouille de m’avoir lu,
malgré la longueur de ma description.
Je sais que vous n’avez pas beaucoup de temps à consacrer à une activité bénévole,
mais je me trouve là dans une situation amusante :
je vais chercher des infos dans les forums depuis de années
et on y supplie constamment les demandeurs
d’être précis et complet dans la description de leur problème
et de chercher à le résoudre avant de crier « Au Secours »
dans un post sobrement intitulé « Problème Excel urgent, aidez-moi »...
et je me fais gentiment reprocher d'être trop long.
J’avais fait un effort de complétude et de précision, je vais donc faire une effort de concision :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Une macro ‘Excel 2003’
travaillant sur des classeurs au format ‘Excel 2003’
dont les noms finissent par l’extension ‘.xls’
effectue la copie d’une feuille d’un classeur dans un autre classeur
par la commande ‘Déplacer/Copier’.
Sous ‘Windows 2003 - Excel 2003’, la macro s’exécute tous les mois depuis trois ans.
Sous ‘Windows 7 - Excel 2010’, lors du traitement des fichiers (j’insiste : au format ‘2003’ et non ‘2010’)
le code VBA appelant la commande ‘Déplacer/Copier’
avorte avec le message d’erreur:
‘erreur [...] '1004' [...] Excel ne parvient pas à insérer les feuilles dans le classeur destination
car il contient moins de lignes et de colonnes que le classeur source [...]’.
Je joins les fichiers traités et la macro pour ceux qui pourront prendre le temps de constater
si le problème se produit sur leur PC et sous ‘Excel 2010’
et de chercher à comprendre ce comportement.
Ils trouveront les détails éventuellement utiles dans mon premier message.
Le palliatif passant par la copie des données et non par la copie de la feuille
ne me pose aucun problème de codage.
Mais il pallie sans élégance et n’explique rien.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Zut ! C'est encore bien long ! Tant pis, plus ramassé, je ne connais que le style télégraphique.
Je plaisante, mais surtout j'espère n’avoir rien écrit que vous puissiez prendre pour l'expression d'un mécontentemnt
que je ne ressens nullement.
Je suis très reconnaissant aux intervenants des forums de l’aide indirecte ou directe
qu’ils ont toujours apportée au ‘programmeurs amateurs’ en général et à moi-même en particulier..
Je vous remercie par avance et très cordialement.
André Blanquer
Bonjour,
n’explique rien.
Ben si, tu n'as pas lu ?
Une feuille d'un million de lignes ne rentrera jamais dans un classeur xls, même avec un chausse-pied.
Je joins les fichiers traités et la macro pour ceux qui pourront prendre le temps de constater
Pas vus..
Et désolé pour le manque d'élégance de ma proposition...
eric
Bonjour Eriiic.
Merci de ta réaction rapide et désolé, je crains de t’avoir irrité avec l’expression ‘manque d’élégance’.
Elle ne méprisait pas la qualité de ta proposition.
Tu pourras lire dans mon premier post que cette solution était « évidente » pour moi,
mais que je la considérais comme un « palliatif » qui contournait le problème
sans le résoudre ni me permettre de le comprendre.
C’est en cela que cette « solution » me paraissait « inélégante ».
Je suis un littéraire avec une formation de matheux,
d’où l’importance que j’attache à l’élégance dans la langue ou les démonstrations…
Même si, hélas, je suis très loin de l’atteindre toujours.
Accepte mes excuses pour ma maladresse… que tu as pu trouver inélégante.
Maintenant passons si tu veux bien au fond du problème :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Je sais que les feuilles au format 2010 sont plus grandes que les feuilles au format 2003.
Je m’attendrais néanmoins à ce que la taille de la feuille soit liée aux dimensions qu’Excel donne au tableau.
Dans mon cas, la commande Ctrl+Fin adresse la cellule H47.
Je peux donc penser que la feuille n’est pas gigantesque.
Et de toute façon Excel 2003 s’en accommode.
Mais mon action n’est pas le déplacement d’une feuille au format 2010 dans un classeur au format 2003
mais bien exactement son contraire :
le but est un transfert de feuille au format 2003 entre classeurs au format 2003.
et ce en utilisant Excel 2003 (ça marche) ou Excel 2010 (ça boque).
Bien que tu n’aies pas trouvé mon message précédent bien sympathique,
tu as bien voulu jeter un œil aux fichiers… Fichiers que je n'avais pas réussi à te transmettre.
J’avais pourtant cliqué sur l’onglet ‘prévu pour’, choisi le fichier compressé ‘qui va bien’
et appuyé avec décision sur le bouton ‘Ajouter le fichier’.
Je n’ai pas vu de confirmation
(sinon l'affichage de l'adresse dans la plage prévue, puis le ré-affichage de la page)
et j’ai recommencé la manip, au risque de l’envoyer deux fois.
Peut-être le fichier ‘y Test 2010.7z’ est-il trop volumineux…
1 582 KB ne me paraîssent pourtant pas gigantesque.
Je vais recommencer la manip. en répondant à ton message.
Si la chose ne marche pas, propose-moi un palliatif que je te promets d’accepter sans commentaire.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cordialement
André Blanquer
P.S. Deux essais, je ne vois nulle part une avis de prise en compte.
Tu n'auras probalement rien reçu.
Quel autre moyen ? Mail direct ?
Bonjour,
Pour nous envoyer ton fichier :
Cdlt.
Bonjour le Forum
Erreur de ma part. Sujet différent
Bonjour Jean-Eric
Merci, je l'envoie tout de suite.
Si nécessaire, et tu es seul juge, je suis joignable au 01 4029 6160.
Cordialement
André Blanquer
Il faut coller le lien fourni dans un message...
Bonjour Eriiic.
J'aurais pu y penser tout seul !
Et en plus, ça doit bien être écrit dans les règles d'emploi du forum.
Merci pour le rappel à l'ordre.
Voilà le lien :
Cordialement
André
Bonjour collègue
Je n'ai pas eu l'erreur au point annoncé mais à :
'Activation du fichier TBord
Workbooks(NomFichierAnalyseOc).Activate
Sheets("Analyse").Copy After:=Workbooks(NomFichierTbord).Sheets("Bilan - Parc-HS")
ActiveSheet.Name = "Bilan - Suppressions " & MoisLettresdu module F.
Pour moi et0076900004.xls est un xlsx dont l'extension a été changée, il fait 1048576 lignes. Et tu l'enregistres sous OC Sardi - 1305.xls en 1million de lignes.
Sous réserve de tests, si cette extraction t'arrive toujours ainsi tu pourrais dans le Module D_ExtractionSardi :
'Renommage
activeworkbook.SaveAs Filename:=NomFichierAnalyseOc compléter avec FileFormat:=xlExcel8
Je pense que c'est une bonne piste.
Au passage dans Ra_RoutinesStandard Sub InitialisationXL() tu pourrais mettre :
'Gestion du répertoire
Répertoire = ThisWorkbooks.Path
'au lieu de
Répertoire = Workbooks("_ Outil de màj - TBord Optimisation.xls").Pathpour pouvoir renommer le fichier avec n° de version au cas où...
et :
NoSemaineISO = DatePart("ww", Date1, vbMonday, vbFirstFourDays)
pour éviter de le calculer dans la feuille.
eric
Bonjour Eriiic.
Merci d'avoir répondu si vite.
Ma lecture a été immédiate, si ma réponse a été différée d’une journée.
Et flatté de l'appellation 'Collègue'… dont je conclus abusivement que je ne code pas si mal que ça.
1) Dimensions ou format du classeur des données extraites :
À ma connaissance l'extraction fournit un fichier-texte - avec ‘le séparateur qui va bien’ -
que l’utilisateur ouvre avec son tableur obligé : Excel 2003.
Tu as trouvé 1 048 576 lignes dans le classeur ‘et0076900004.xls’,
ce qui m’a intrigué car je ne voyais pas bien d’où elles pouvaient sortir.
J’ai donc ouvert (en même temps) le dit classeur avec Excel 2003 et Excel 2010 :
la feuille compte 65 536 lignes dans le premier cas et 1 048 576 dans le second.
Les dimensions de la feuille dépendent directement de la version Excel employée,
ce qui paraît logique : un classeur Excel est essentiellement une série de données avec un séparateur.
Mais Excel 2010 sort un message d’alarme à l’ouverture du fichier :
« le format du fichier que vous tentez d’ouvrir est différent de celui spécifié par l’extension du fichier »
Donc ton diagnostic est exact : le format est anormal.
Je vais reprendre avec des extractions ‘neuves’, une nregistrée en Excel 2003, l'autre en Excel 2010.
2) Modifications du code :
Ta proposition de forcer le format est judicieuse.
Mais je vais la ‘prendre à l’envers’ : je vais forcer le format ‘Excel 2003’.
En effet le même code doit tourner sous 2003 cette année et 2010 en cours d’année prochaine,
alors que dans trois mois, je ne serai plus là pour maintenir cet outil (et les autres ).
Si cela ne marche pas : le palliatif ‘coller les données à déplacer dans une feuille crée pour les recevoir’
devrait résoudre définitivement le blocage.
Ta proposition d’utiliser
Répertoire = ThisWorkbooks.Path
est tellement judicieuse que je faisais comme cela dans un autre outil !
Je vais ‘normaliser’ celui-ci.
Quand à celle-ci :
NoSemaineISO = DatePart("ww", Date1, vbMonday, vbFirstFourDays),
dès que j’ai compris la syntaxe, je l’adopte !
Tes dernières remarques me montrent que tu as a pris du temps pour regarder mon travail, et que tu as regardé de près.
J’espère que tu n’as pas trop tiqué sur mon absence de prise en compte des recommandations de bon nommage des variables !
Je te remercie sincèrement pour tes avis.
Très cordialement
André Blanquer
PS :
Je ne pourrais utilise le PC « Windows 7 » que vendredi.
Je laisse le post ouvert jusque-là pour pouvoir donner le résultat des modifications envisagées.
Sauf décision contraire des gestionnaires du forum, bien sûr.
Bonjour,
Et flatté de l'appellation 'Collègue'… dont je conclus abusivement que je ne code pas si mal que ça.Sans rien vouloir retirer à tes qualité de codeur je voulais dire collègue... d'UI
Tu as trouvé 1 048 576 lignes dans le classeur ‘et0076900004.xls’,
ce qui m’a intrigué car je ne voyais pas bien d’où elles pouvaient sortir.
J’ai donc ouvert (en même temps) le dit classeur avec Excel 2003 et Excel 2010 :
la feuille compte 65 536 lignes dans le premier cas et 1 048 576 dans le second.
Les dimensions de la feuille dépendent directement de la version Excel employée,
Ben non, si tu ouvres tes autres classeurs dans 2010 tu vois bien 65536 lignes.
Ce sont des vrais xls, pas des xlsx renommés. Ce qui est confirmé par la présence ou non du message d'alerte.
Mais je vais la ‘prendre à l’envers’ : je vais forcer le format ‘Excel 2003’.A l'endroit... xlExcel8 est bien le format .xls pour 2010.
Mais c'est vrai que 2003 ne reconnait pas cette constante. Essayer avec xlExcel9795 (?). Si tu pouvais confirmer le format après les tests.
eric
Bonjour Eriiic.
Pour information : testé vendredi, mais pas eu le temps de poster.
Formats :
- le fichier d’extraction est proposé par la base de données en ouverture ou en enregistrement :
. en enregistrement, il ressemble à un brave et honnête fichier Excel ;
. en lecture, c’est un fichier Excel au format html…
- lecture du format des fichiers :
. '_ Outil de màj - TBord Optimisation.xls' et '2013 - Tableau de Bord (…).xls'
activeworkbook.FileFormat renvoie 56 ;
. 'et0076900001.xls',
activeworkbook.FileFormat renvoie 44 ;
- formats µSoft :
voir 'http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlfileformat.aspx'
. xlExcel8 ;56; Excel8
. xlHtml ;44; Web page format.
Modifications de la routine :
- module ‘Ra_RoutinesStandard’
. modification du forçage du répertoire ;
. modification du calcul de la semaine ISO (merci pour la fonction Datepart) ;
- module D_ExtractionSardi
. le dossier 'OC Sardi...' était créé sans forçage de format puis traité et ré-enregistré en fin de module avec FileFormat:=xlNormal ;
. modification : le format 'xlExcel8’ est forcé dès le premier enregistrement du fichier.
Test sur le PC « Windows 7 - Excel 2010 » :
- nouvelle extraction de la base ;
- nouveau classeur de données ;
- nouvelle exécution de l’outil ;
- contrôles :
. le classeur-émetteur et le classeur-récepteur sont bien au format 56 ;
. la plage de données détectée Ctrl +Shift +Fin finit en G47 ;
. la feuille-émise dispose de 1048576 lignes !?
. les feuilles de classeurs créés sur un PC 'Excel 2003' n’ont pas de cellule 'A1048576 ;
- conclusion : créer le fichier puis l’enregistrer au format Excel8 ne modifie pas les feuilles du classeur.
Options à tester :
- créer le classeur directement en format Excel8 ;
- enregistrer le classeur existant en format Excel8 (avant tout ajout de feuille), le fermer et le rouvrir ;
- convertir tous les fichiers à traiter sous Excel 2010 en format Excel8 ;
donc trouver comment détecter la version d’Excel qui exécute la routine ;
- copier la plage de données en cause dans une feuille créée exprès
(peu élégant, surtout s’il y avait 50 plages nommées).
Cordial salut d’IBNF à UI (si je ne divague pas)
André Blanquer
Bonjour Eriic
Problème résolu :
- Exécution de la routine jusqu’au premier enregistrement des données extraites :
la feuille de données est (logiquement, après coup) au format Excel 2010 (la cellule ‘A1048576’ existe).
- modification de la routine dans la section qui enregistre le classeur après son ouverture et avant toute modification :
ActiveWorkbook.SaveAs Filename:=NomFichierAnalyseOc, FileFormat:=xlExcel8
ActiveWorkbook.Close
Workbooks.Open Filename:=NomFichierAnalyseOc
Moralité :
Pour enregistrer un classeur dans un format antérieur au format courant :
. l’enregistrer avec le FileFormat désiré ;
. le fermer ;
. l’ouvrir :
Et enchaîner.
Merci, Eriic, pour ton diagnostic qui a mené à la solution…
J’espère que cela aidera aussi d’autres programmeurs amateurs !
Très cordialement
André Blanquer
PS :
Présente, s'il te plaît, mes félicitations aux concepteurs du site.
Maintenant que je m'y suis habitué, je trouve son ergonomie très agréable.
Bonjour,
Je viens de faire quelques tests, à-priori le bon format est xlWorkbookNormal (-4143).
xlExcel8 n'est paradoxalement pas connu d'excel 2003, c'est pour ça que je t'avais proposé d'autres constantes.
ActiveWorkbook.SaveAs Filename:= path & "NomFichier.xls" , FileFormat:=xlWorkbookNormal '-4143Accepté sur 2003 et 2010, enregistre en .xls avec conservation des éventuelles macros.
Il faut fermer le fichier et le rouvrir pour voir qu'il est bien passé en 65536 lignes.
eric
Bonjour Eriiic.
Quelle rapidité de réaction !
Je vais tester le FileFormat que tu proposes : il aura l'avantage d'éventuellement accepter de travailler en Excel 2020 !
A bientôt, certainement, sur d'autres problèmes : j'ai plusieurs projets dont je dois vérifier (et permettree) le fonctionnement en 'Excel 2010'.
Cordialement
André Blanquer
Oups, Eriiic.
Trop pressé de répondre à ton dernier message !
J'aurais pu tester le nouveau FileFormat avant de l'envoyer, ce qui m'aurait permis de confirmer au futur lecteur du post
qu'avec le FileFormat 'xlWorkbookNormal' la routine devient indifférente à la version d'Excel.
Cordialement
André Blanquer