[déplacé .Net -> VBA] Excel 2010 - copier-coller d'une feuille d'un dossier sur [Résolu]

Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
- - Dernière réponse : BlanquerElie
Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
- 12 juin 2013 à 10:03
Bonjour à tous.

D'abor : désolé, je suis à peu près sûr de ne pas être "dans le bon thème", mais c'est le moins mauvais que j'aie trouvé !

Si j'en crois Gougueule, la question vous a déjà été posée, mais je n'ai su retrouver l'item.

Mon souci :

Une routine VBA pour Excel 2003 copie une feuille d'un dossier et la colle dans un autre... sans problème.

Sous Excel 2010, la même routine avorte sur la ligne :
Workbooks("_ Outil de màj - TBord.xls").Sheets
("Résultat").Copy before:=Workbook
(NomFichierAnalyseOc).Sheets(1)
avec le message :
erreur [...] '1004' [...] Excel [...] pas à insérer les feuilles [...] contient moins de lignes et de colonnes [...].

Je fais la manip. ?manuellement? :
Déplacer/Copier de la feuille dans le même dossier : OK
Déplacer/Copier dans un autre dossier : même échec 1004.

Je précise que la routine, supportée par "_outil de màj...",
- sélectionne son propre répertoire où se trouvent les dossiers avec lesquels elle travaille ;
- ouvre les dossiers dont elle a besoin.
Tous sont donc dans la même session d'Excel.

Je pourrais toujours - sauf surprise 2010 - coder la création d'une feuille de réception dans le fichier récepteur et copier-coller les données...

Mais j'aimerais comprendre le sens du diagnostic d'échec et utiliser un code plus élégant que le palliatif évident cité ci-dessus.

Merci à ceux qui liront.
Grand merci à ceux qui sauront me donner réponse.

Bonne journée à tous.

André
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
3
Merci
Bonjour,

Beaucoup de prose que j'ai lue en diagonale...

Les versions 2003 et précédentes avaient 256 (2 ^ 8) colonnes et 65536 (2 ^ 16) lignes
Depuis 2007, il y a 1048576 lignes (2 ^ 20)et aussi plus de colonnes (2 ^ 14).

Tu ne peux donc pas copier une feuille xlsx ou xlsm dans une feuille d'un ancien classeur xls puisque trop de lignes/colonnes.

C'est du moins ce que ce message me laisse croire...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
3
Merci
Bonjour UCFOUTU

Merci d'intervenir.

Ton commentaire pointe vers la solution que je considérais comme une solution efficace, mais inélégante : créer une nouvelle feuille dans Puits.xls et coder un copier-coller du tableau.

Chose aisée à programmer ! D'autant que toutes mes routines sont bâties de la même façon : elles calculent systématiquement les dimensions des tableaux , toujours enregistrées sous des variables de même nom, ce qui me permet d'appeler des sous-routines 'standards' pour exécuter bien des actions...

Par curiosité, je vais vérifier si ce comportement curieux n'est pas lié à une vérole invisible du classeurs Puits.xls.

Je clos ce SOS en vous remerciant tous.

Très cordialement
André

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BlanquerElie
0
Merci
Bonjour,

C'est quoi ton dossier ?

Les feuilles d'Excel sont dans un classeur.

Un dossier, c'est une division virtuelle d'un disque qui contient des fichiers. C'est la nouvelle désignation d'un répertoire.

Ton message d'horreur est bien évident, mais la cause est obscure à cause d'un code absent. Pour une raison obscure, tu essaies de mettre des données d'un tableau, d'une plage nommée ou de je ne sais quoi encore avec un nombre "x" de lignes et "y" de colonnes à un endroit où il est supposé y avoir "a" lignes et "b" colonnes avec "a" différent de "x" et "b" différent de "y".

Et puis, cette affaire-là :

Workbooks("_ Outil de màj - TBord.xls").Sheets 
("Résultat").Copy before:=Workbook 
(NomFichierAnalyseOc).Sheets(1) 


est-ce une, deux ou trois lignes dans la vraie vie ?
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,

Et puis, j'ai fini par regarder dans mon aide à ta place. Et puis, dans mon aide, il font des copy:before avec des workbooks et pas avec des workbook.
Commenter la réponse de Utilisateur anonyme
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
0
Merci
Salut

La catégorie tant recherchée est : Visual Basic 6 > Langages dérivés > VBA >

Je rejoins cmarmotte : ces trois lignes sont vraiment spéciales et ne ressemblent pas à de vraies lignes.
Que dit le compilateur lorsque tu compiles le code à le demande (premier item du menu 'Débogage') ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
58
0
Merci
Si tu dois manipuler des classeurs, il te faut des objets que représenteront ces classeurs (Workbook)
Si tu dois manipuler des feuilles, il te faut des objets que représenteront ces feuilles (WorkSheet ou Sheet)

En l'absence de ces objets, difficile de dire sur quoi tu travailles.

Pour pouvoir travailler sur des classeurs, il faut les ouvrir.
Celui d'origine sera surement le ActiveWorkbook, donc déjà ouvert.
Voir l'aide de Worbooks.Open
genre
    Dim wkDesti As Workbook
    Set wkDesti = Workbooks.Open("c:\the classeur1.xls")
Alors seulement, tu pourras te référer à l'une de ces feuilles :
    Dim wkDesti As Workbook
    Dim wsDesti As Worksheet
    Set wkDesti = Workbooks.Open("c:\the classeur1.xls")
    Set wsDesti = wkDesti.Sheets(1) ' 1ère feuille
pour enfin pouvoir accéder au contenu.

Tout ça se trouve parmi les sources du site ou en lisant n'importe quel code VBA qui manipule des classeur et/ou feuilles
Commenter la réponse de cs_Jack
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Bonjour.

Vérifier aussi l'extension des fichiers car à partir d'Excel 2007 ce n'est pas forcément des .xls mais aussi de .xlsb, .xlsm, ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
0
Merci
Bonne journée à tous.


A ? En premier :

Merci pour avoir déplacé mon ?post? dans la bonne catégorie.
Je me suis probablement arrêté à
« Visual Basic 6 ??... Non, je cherche VBA ».
J'aurais pu aller plus loin.

Merci pour vos réponses, bien sûr.

Et surtout? désolé que mon message n'ai pas été clair.
Je croyais avoir fait un effort efficace. Raté !
Et j'ai la nette impression d'avoir irrité Cmarcotte,
ce qui n'était pas mon objectif !


B - Pour répondre à vos remarques :

1 - « C'est quoi ton dossier ? Les feuilles d'Excel sont dans un classeur » :

Mille excuses pour un abus de langage
que je fais assez volontiers dans la vraie vie !

2 - « ?la cause est obscure à cause d'un code absent » :

Peut-être aurais-je dû envoyer tous le code,
mais il y a quand même 10 modules.
Et sans les fichiers... les dossiers... les classeurs...
Oui, les classeurs !
Donc, sans les les classeurs 'de travail',
la chose serait aussi indigeste qu'incompréhensible.

3 - « Et puis, cette affaire-là :
Workbooks("_ Outil de màj - TBord.xls").Sheets
("Résultat").Copy before:=Workbook
(NomFichierAnalyseOc).Sheets(1)
est-ce une, deux ou trois lignes dans la vraie vie ? » :

Dans la vraie vie, c'est une seule ligne,
ou plusieurs avec un « _ » bien placé.
J'avais pensé que les changements de ligne
introduits par le message de demande d'aide
vous étaient naturellement ?invisibles?.
Dans le futur, je mettrai des « _ » et des « " » supplémentaires
en fin de ?ligne?.

4 - « j'ai fini par regarder dans mon aide à ta place » :

Ne pas regarder l'aide et ne pas chercher dans les forums
avant de demander comminatoirement une aide immédiate
est un manque de respect envers ceux dont on sollicite l'expertise...

Je regarde systématiquement l'aide Excel.
Utilement pour les questions simples?
Mais dès que c'est ?complexe?,
j'ai l'impression que je dois déjà connaître la 'bonne' réponse
pour pouvoir formuler la ?bonne? question.
De là mon usage des forums
où le plus souvent d'autres que moi ont déjà eu le même problème
et déjà obtenu une solution? que je m?empresse d'employer.

5 - « ils font des copy:before avec des workbooks et pas avec des workbook. » :

Erreur de report de mon code dans mon message,
encore désolé de ma relecture inattentive.

6 - « Vérifier aussi l'extension des fichiers » :

L'outil-de-traitement, enfin son code,
a été créé et est utilisé sous Excel 2003.
Comme l'utilisateur va passer à une date inconnue
de Excel 2003 à Excel 2010,
je vérifie que le code fonctionne avec les deux versions.
L'extension du fichier reste donc ?.xls?, du moins pour le moment.


C - Je vais essayer de mieux poser mon problème :

Chaque mois, une extraction de base de données
fournit un classeur Excel, appelons-le classeur-de-travail.
L'outil-de-traitement fait une série de calculs
et remplit un tableau installé dans une feuille du classeur-de-travail.
Cette feuille est nommée ?Résultat?.
La feuille ?Résultat? est ensuite copiée/collée
dans un classeur-destinataire
devant sa? comment dire? feuille-s'ur
contenant le tableau-frère calculé le mois précédent.
Noter que les tableaux-frères ont un nombre de colonnes constant
et un nombre de lignes variable.
Très classique.

Code Excel copié de l'outil-de-traitement :
'Exportation de la feuille "Résultat" dans le fichier "OC Sardi..."
Workbooks("_ Outil de màj - TBord Optimisation.xls").Sheets("Résultat").Copy _
before:=Workbooks(NomFichierAnalyseOc).Sheets(1)
(note :
j'ai laissé le code fourni par l'enregistreur de macro 'tel que'.
ne pas tenir compte des retours à la ligne dus à l'éditeur de message.)

Avec Excel 2003, cela marche depuis trois ans sans souci.

En Excel 2010, le code comme l'action directe
?déplacer ou copier? / faire une copie?
avortent avec le même diagnostic :
erreur [...] '1004' [...] Excel [...] pas à insérer les feuilles [...] contient moins de lignes et de colonnes [...].

Avant de vous solliciter, j'avais vérifié que l'opération directe
?déplacer ou copier? / faire une copie?
fonctionnait correctement en injectant dans le classeur-destinataire
une feuille ?quasi vide? d'un classeur neuf créé pour cette occasion.
Le code délivré par l'enregistreur de macros est celui attendu :
Sheets("Feuil3").Copy Before:=Workbooks( _
"2013 - Tableau de Bord - Optimisation Réseau - annuel.xls").Sheets(1)

Mais je viens de contrôler que la même opération ne fonctionne pas
si je crée une feuille ?quasi vide? dans le fichier-de-travail
et que je cherche à l'injecter dans la classeur-destinataire.

La question principale se dédouble donc :
Pourquoi Excel 2010 réagit-il différemment de Excel 2003
pour une action somme toute basique ?
Est-ce lié à Excel 2010 ou à l'influence discrète d'un gremlin joueur
qui subrepticement vérolerait le classeur-de-travail ?
Je doute un peu car ce classeur est créé
à chaque session d'utilisation de l'outil-de-traitement.

Pour que vous disposiez des éléments nécessaires
à une analyse du problème, que dois-je vous fournir ?
. Une copie-texte des dix pages de code ?
. Une copie de l'outil-de-traitement (donc de son code)
et de l'extraction initiale ?
. Une copie du classeur-de-travail et du classeur-destinataire ?

Je reste conscient qu'il reste possible de coder la création
d'une feuille-réceptrice dans le classeur-destinataire
et d'y copier le tableau calculé dans le classeur-de-travail.
Mais c'est moins élégant et ne m?apprend rien.



En espérant que j'en ai mis assez pour être clair
et pas trop au risque d'être obscur,
Je vous remercie déjà pour votre patience.


Cordialement
André
Commenter la réponse de BlanquerElie
Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
0
Merci
Bonjour MPI? merci de ta lecture , même en diagonale.

Beaucoup de prose
d'abord pour répondre aux remarques liées à mon premier message,
ensuite pour bien décrire mon souci.
Je suis, hélas, un ?littéraire?... d'où le risque trop disert.

Je vais me souvenir de ma formation scientifique
et essayer le style télégraphique.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Deux classeurs :
"Source.xls" et "Puits.xls"
"Source.xls" contient une feuille "Données".

Sous Excel 2003 :
- Ouverture de "Source.xls" et de "Puits.xls".
- Commande "déplacer ou copier / créer une copie"
pour créer une copie de la feuille "Données" dans "Puits".
- action effectuée.

Sous Excel 2010 :
- Ouverture de "Source.xls" et de "Puits.xls".
- Commande "déplacer ou copier / créer une copie"
pour créer une copie de "Données" dans "Puits".
- échec avec diagnostic :
erreur [...] '1004' [...] Excel [...] pas à insérer les feuilles [...] contient moins de lignes et de colonnes [...].

Note :
Ce comportement interdit à un programme VBA
tournant parfaitement sous Excel 2003
de fonctionner avec Excel 2010.

Questions :
- pourquoi ?
- comment corriger ?

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voilà :
Cela me paraît mieux.
J'aurais dû commencer par là.

Merci d'avance
pour votre temps et votre aide
André Blanquer
Commenter la réponse de BlanquerElie
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Étrange...

Je n'ai pas 2010, mais sous 2007 qui est à peu près la même chose, ça fonctionne très bien, autant manuellement que par macro...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
Messages postés
9
Date d'inscription
lundi 3 novembre 2008
Statut
Membre
Dernière intervention
12 juin 2013
0
Merci
Bonjour Mpi.

Merci d'avoir essayé de reproduire le "phénomène".
Il t'aurait peut-être fallu les fichiers réels,
mais je n'ai pas trouvé le "bouton à pièce jointe".

Le classeur-source est une extraction retravaillée par la macro,
le fichier-destinataire est lui "permanent".
Je le referai vendredi quand je redisposerai d'un PC Windows7 Office2010,
et je retesterai.

D'ici-là je laisse l'item ouvert.

Merci encore.
André
Commenter la réponse de BlanquerElie
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour,
Que t'affiche ceci :
workbooks("Puits.xls").activate
msgbox rows.count & vbcrlf & columns.count


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu