Copier une feuille d'un classeur vers un add-in?

Résolu
lepico27 Messages postés 15 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 2 avril 2012 - 1 avril 2012 à 17:54
lepico27 Messages postés 15 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 2 avril 2012 - 2 avril 2012 à 12:14
Bonjour à tous,

Voilà, j'ai un problème, je souhaiterais faire une copie de toutes les feuilles excel du classeur actif vers un add-in, tout en gardant leurs mise en forme (elles contiennent les paramètres de mon add-in, et des modèles de feuilles recréées par la suite).

Je souhaitais donc utiliser la méthode sheets(i).copy after:= thisworkbook.sheets(i) mais cela ne fonctionne pas:
"erreur d'execution '1004': La méthode Copy de la classe Worksheet a échoué."

Je précise que je fais aussi dans une autre sub l'opération inverse (add-in vers classeur actif) et cela fonctionne à merveille.

Voici mon code:
'on compte le nombre de feuilles de l'addin
    Dim iNbSheets As Integer
    iNbSheets = ThisWorkbook.Sheets.Count

'on ajoute une feuille dans l'add-in avant de supprimer toutes les autres (pour éviter les conflits de noms)
    ThisWorkbook.Sheets.Add
    Application.DisplayAlerts = False
    For I = 1 To iNbSheets
        ThisWorkbook.Sheets(2).Delete   'la feuille ajoutée se trouve en première position dans l'addin
    Next
    Application.DisplayAlerts = True
    
'on copy toutes les feuilles du classeur actif dans l'add-in
    For I = 1 To ActiveWorkbook.Sheets.Count
        ActiveWorkbook.Sheets(I).Copy After:=ThisWorkbook.Sheets(1)     '<-- c'est là qua çà plante, pas pu aller plus loin...
    Next
    
'on renomme les feuilles (pour utilisation plus facile dans le module)
    ThisWorkbook.VBProject.VBComponents("base").name = "wsBase"
    ThisWorkbook.VBProject.VBComponents("_myParameters").name = "wsParam"
    ThisWorkbook.VBProject.VBComponents("_myPreferences").name = "wsPref"
    ThisWorkbook.VBProject.VBComponents("temporary").name = "wsTemp"



Des idées?


Merci d'avance!!!

Lepico

4 réponses

Utilisateur anonyme
1 avril 2012 à 23:00
Bonjour,

J'y ai bien entendu pensé, mais cela ne me copie pas la mise en forme, en particulier les largeurs de colonnes. (en fait je veux que mon add-in puisse "stocker" une feuille modèle que je pourrais ensuite réexporter telle quelle). la méthode .copy me semble donc la plus simple pour mon application.

Regarde la méthode PasteSpecial dans ton aide. Il y a la liste de toutes les constantes équivalentes aux options du collage spécial dans l'interface. Où encore, tu ajoutes quelque lignes dans ton add-in pour formater les nouvelles colonnes

Non, je l'ai peut-être mal expliqué, en fait je programme un add-in, et ce code se trouve dans celui-ci.

Pourquoi pas plutôt un classeur-modèle avec toutes tes mises en formes et tes formules en place ? Pour être sur de ne pas le perdre, tu peux obliger tes utilisateurs à l'enregistrer sur un autre nom.
3
Utilisateur anonyme
1 avril 2012 à 18:52
Bonjour,

Thisworkbook représente toujours, ou presque, le classeur qui exécute la macro active. ActiveWorkbook représente le classeur actif. Donc,

'on copy toutes les feuilles du classeur actif dans l'add-in
    For I = 1 To ActiveWorkbook.Sheets.Count
        ActiveWorkbook.Sheets(I).Copy After:=ThisWorkbook.Sheets(1)     '<-- c'est là qua çà plante, pas pu aller plus loin...
    Next


signifie de copier une feuille sur elle-même sauf, je pense, si ton autre classeur a été activé avant.

Mais, j'ai la vague impression que tu pourrais alléger ton usine à gaz avec une chose toute simple: désigner explicitement tes objets par leur nom en les adressant.



Workbooks("Pierre").sheets("Justin").range("A1").value = "Trudeau"



Et puis, je suis extrêmement sceptique avec cela, si tu dis que tu nommes des feuilles de classeur:

'on renomme les feuilles (pour utilisation plus facile dans le module)
    ThisWorkbook.VBProject.VBComponents("base").name = "wsBase"
    ThisWorkbook.VBProject.VBComponents("_myParameters").name = "wsParam"
    ThisWorkbook.VBProject.VBComponents("_myPreferences").name = "wsPref"
    ThisWorkbook.VBProject.VBComponents("temporary").name = "wsTemp"


Parce que les vbcomponents du vbproject sont pour les éléments de VBA, pas pour les feuilles d'un classeur.

Sinon, je n'ai rien compris de la question et de ton code.
0
lepico27 Messages postés 15 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 2 avril 2012
1 avril 2012 à 20:18
cmarcotte, déjà merci de ta réponse (même si elle ne m'avance pas beaucoup).

signifie de copier une feuille sur elle-même sauf, je pense, si ton autre classeur a été activé avant.


Non, je l'ai peut-être mal expliqué, en fait je programme un add-in, et ce code se trouve dans celui-ci. Le classeur contenu dans l'add-in n'étant pas visible, j'aurais donc bien:
thisworkbook: le classeur de mon add-in
activeworkbook: le classeur actuellement affiché à l'écran

Workbooks("Pierre").sheets("Justin").range("A1").value = "Trudeau"


J'y ai bien entendu pensé, mais cela ne me copie pas la mise en forme, en particulier les largeurs de colonnes. (en fait je veux que mon add-in puisse "stocker" une feuille modèle que je pourrais ensuite réexporter telle quelle).
la méthode .copy me semble donc la plus simple pour mon application.

et enfin
Parce que les vbcomponents du vbproject sont pour les éléments de VBA, pas pour les feuilles d'un classeur.


Cela s'applique aussi aux feuille de ton classeur (qui ont comme nom par défaut "feuil1", "feuil2", etc), que tu peux renommer et appeler de la même façon qu'un module (ex: tu appeles ta feuille ws1, et tu peux ensuite ecrire ws1.cells(1,1), ce qui évite de taper à chaque fois thisworkbook.sheets("toto").cells), ce qui est bien pratique ;-)

Dans tous les cas, merci quand même.

Lepico
0
lepico27 Messages postés 15 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 2 avril 2012
2 avril 2012 à 12:14
Re,

Merci cmarcotte, j'ai en effet réussi à m'en sortir, le pastespecial sur les colonnes entières (colums("A:E").pastespecial) fonctionne (en ne copiant que les cellules, je n'avais ni les largeurs de colonnes ni les colonnes masquées).

Pour ce qui est d'utiliser un classeur modèle, je dois diffuser cet add-in à des novices de chez novice en la matière, et j'essayais de simplifier la chose au maximum en limitant le risque d'erreur (je fonctionnais avec un modèle jusqu'à présent, mais ils le déplacaient ou supprimaient très souvent, me faisant alors planter mon add-in :/ ).

Bref, merci encore!!
0
Rejoignez-nous