IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copie groupé d'onglet


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Juin 2013
    Messages : 10
    Par défaut Copie groupé d'onglet
    Bonjour,

    J'avais déjà lancé un sujet équivalent dans ce forum. Malheureusement, les excellentes solutions proposées ne permettaient pas de résoudre tous mes problèmes... Je démarre une nouvelle discussion pour la lisibilité.

    Je souhaite copier des onglets d'une feuille excel vers une autre feuille excel via un code vba. Les onglets sources ont des formules avec des liens entre eux (la feuille A a des liens vers B et vice-versa) et sont quelques fois protégés en écriture par un mot de passe.

    Voici une partie du code actuel (ListOfSheetToCopy est un tableau contenant 1 si l'onglet est à copier, 0 sinon):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        Set wbFileA = Application.Workbooks.Open(Source)
        Set shCopAfter = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
     
        Set plage = Range("A1:B2")
        compteur = -1
        For Each sh In wbFileA.Sheets
            compteur = compteur + 1
            If ListOfSheetToCopy(compteur) > 0 Then
                sh.Copy After:=shCopAfter
                Set shCopAfter = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
                If Not sh.ProtectContents Then
                    Elmt = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name
                    ThisWorkbook.ChangeLink Elmt, ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name, xlExcelLinks
                Else
                    Set plage = sh.Range("A1:AP112")
                    For Each cellule In plage:
                        If cellule.AllowEdit Then
                            'cellule.Copy Destination:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Range(cellule.Address)
                            Range(cellule.Address).Select
                            Selection.Copy
                            ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Range(cellule.Address).Select
                            ActiveSheet.Paste
                        End If
                    Next cellule
                End If
            End If
        Next sh
    Ca marche pas trop mal, sauf si la feuille est protégé par un mot de passe...

    En fait le problème est que l'on copie les feuille une par une et les liens passent, par exemple, de: 'NomDeLaFeuille'!A1 à '[source.xls]NomDeLaFeuille!A1'. La cellule étant ensuite protégée, impossible de changer la formule (et elle ne se transforme pas toute seule si la feuille NomDeLaFeuille est copier plus tard) ...

    Quand on le fait manuellement, on copie un groupe de feuille et les formules protégées n'ont pas à se modifier..

    Pour moi, 2 solutions possibles (que je n'arrive pas à faire):
    1/ Soit, on interdit a excel de modifier les formules de la feuille à copier (feuille protégée incluse)
    2/ Soit on copie un groupe d'onglet en même temps comme manuellement

    Pouvez-vous m'aider ?
    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne sais pas si c'est ce que tu souhaitais mais voici une procédure avec arguments qui déplace des onglets (noms placés dans un tableau) d'un classeur Source vers le classeur cible qui pour l'exemple est ThisWorkbook (bien entendu on pourrait placer un argument supplémentaire à la procédure pour le classeur cible)
    Le test a été fait avec deux feuilles en liaison (dans ThisWorkbook) protégées
    L'argument ListOfSheetToCopy est un tableau contenant les noms des feuilles à déplacer. Cela me semble plus simple et surtout moins dangereux que des n° mais la modification est possible bien entendu.
    La procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MoveSheets(FileSource As String, ListOfSheetToCopy())
     Dim elem As Byte, wkbSource As Workbook
     Set wkbSource = Application.Workbooks.Open(FileSource)
     With ThisWorkbook
      wkbSource.Sheets(ListOfSheetToCopy).Move After:=.Sheets(.Sheets.Count)
     End With
     Set wkbSource = Nothing
    End Sub
    Et le code de la procédure test qui appelle la procédure MoveSheets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TestCopySheet()
     Const FileName As String = "Auteurs (lien avec Liaison Fonctions).xls"
     Dim SheetsName()
     SheetsName = Array("Biblio", "Auteurs")
     MoveSheets FileName, SheetsName
    End Sub
    Dans la procédure MoveSheets, il reste à fermer le classeur Source et le sauver mais je suppose que tu sais le faire.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Je n'ai pas regardé ton code, mais un solution simple pour conserver les liens entre les feuilles consiste à déplacer les feuilles au lieu de les copier (et fermer le classeur source sans l'enregistrer).

    Patrice

Discussions similaires

  1. [c#][Excel] copie d'un onglet
    Par Zolstead dans le forum C#
    Réponses: 2
    Dernier message: 28/06/2013, 09h51
  2. [XL-2003] Problème copie dans un onglet
    Par zarktoune dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/03/2011, 11h24
  3. [XL-2003] Renommer un groupe d'onglet
    Par Djromé dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/08/2010, 18h25
  4. [XL-2003] copie d'un onglet
    Par dba69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/08/2010, 16h40
  5. [XL-2003] Copie USF vers onglet
    Par vmax67 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/01/2010, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo