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 :

VBA - Copier des feuilles d'un classeur ouvert


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Ingénieur logistique
    Inscrit en
    Janvier 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur logistique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2023
    Messages : 1
    Par défaut VBA - Copier des feuilles d'un classeur ouvert
    Bonjour à tous,

    Je suis désolée je sais qu'il existe bcp de sujets similaires sur le forum mais je n'ai pu trouver de solution et je but sur ce code qui ne fonctionne pas (je suis novice).
    J'ai deux classeurs ouverts, je chercher à copier du classeur wkODP vers un classeur WkImpression tous les onglets qui commencent par "_22*".
    Je pars du classeur wKImpression (sur lequel j'ai déjà des opérations qui elles fonctionnent) où j'appel le classeur wkODP.
    Quand je fais tourner le code, il se bloque sur le passage en jaune ci dessous, néanmoins je pense qu'il ne détecte pas le classeur wkODP car le msgbox que j'ai mis pour vérifier ne s'affiche pas.

    J'espère que vous pourrez m'aider et vous remercie par avance.

    Sub ImportOngletODP()
    Dim wkImpression As Workbook
    Dim wkODP As Workbook


    Set wkImpression = ThisWorkbook


    For Each Workbook In Application.Workbooks
    If Left(Workbook.Name, 4) = "ODP_" Then
    Set wkODP = Workbook
    MsgBox "trouvé"
    End If


    For Each Worksheet In wkODP.Worksheets
    If Left(Worksheet.Name, 3) = "_22" Then
    wkODP.Sheets.Copy After:=wkImpression.Worksheets("Impression")
    End If
    Exit For
    Next Worksheet

    Exit For

    Next Workbook

    End Sub

  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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour moi, il y a une boucle de trop
    Même si le problème ne vient pas de là et pour éviter toutes ambiguïtés, il faut éviter d'utiliser comme nom de variable le nom d'un objet (je pensais à tort que c'était des noms réservés)
    La lecture de votre code étant trop confus pour moi pour pointer où se trouve exactement le problème, je préfère vous suggérer une autre approche

    Il est préférable lorsque l'on programme plusieurs actions de découper le problème en plusieurs parties et donc de créer des procédures indépendante (génériques). Cela facilite non seulement la lecture du programme mais surtout cela facilite grandement la maintenance. De plus vous pouvez les réutiliser dans d'autres programmes.

    Pour copier des feuilles d'un classeur source vers un classeur cible, il faut donc utiliser une procédure de copie à laquelle on passera comme argumnts le classeur source, le classeur cible et la liste des feuilles à copier.
    Si la liste des feuilles n'est pas connue et dépend donc de critères (des caractères partiels contenu dans le nom des feuilles comme par exemple "2022" ou "Bilan", etc., il y a donc lieu de faire appel à une autre procédure qui va nous renvoyer la liste des feuilles correspondant à un critère.

    Code de la procédure nommée GetSheetList renvoyant la liste des feuilles suivant critère donc celles que l'on aura à copier.
    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
    Function GetSheetList(Optional Criteria As String, _
                          Optional oWorkbook As Workbook) As Variant
      ' Renvoie la liste des feuilles du classeur définit par
      '    l'argument oWorkbook. Si Nothing = le classeur actif
      '    en fonction de [Criteria] (si vide renvoie la liste complète)
      ' Philippe Tulliez (https://magicoffice.be)
      ' Version : 1.2
      ' Arguments
      '  [Criteria]   Chaîne à chercher dans le nom
      '  [oWorkbook]  Objet Workbook dont on veut la liste des feuilles
      '
      Dim t As Variant
      Dim e As Integer
      Dim n As Integer
      If oWorkbook Is Nothing Then Set oWorkbook = ActiveWorkbook
      n = oWorkbook.Worksheets.Count
      ReDim t(n - 1)
      For e = 1 To n
        t(e - 1) = oWorkbook.Worksheets(e).Name
      Next
      t = Filter(t, Match:=Criteria, compare:=vbTextCompare)
      If UBound(t) > -1 Then GetSheetList = t
    End Function
    Code de la procédure nommée CopySheet qui copie les feuilles d'un classeur Source vers un classeur cible
    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
    Function CopySheet(wkbTarget As Workbook, _
                       SheetList As Variant, _
                       Optional wkbSource As Workbook)
      ' Copie des feuilles de calcul
      '    définit par l'argument SheetList (soit String, soit Table)
      '    d'un classeur source vers un classeur cible
      ' Philippe Tulliez (https://magicoffice.be)
      ' Arguments
      '   wkbTarget   Classeur où copier les feuilles
      '   SheetList   Liste des feuilles à copier
      '                 soit variable tableau
      '                 soit chaîne de caractères séparée par ";"
      '   [wkbSource] Classeur où se trouve les feuilles à copier
      '               si Nothing = ActiveWorkbook
      Dim e As Integer
      If wkbSource Is Nothing Then Set wkbSource = ActiveWorkbook
      If TypeName(SheetList) = "String" Then SheetList = Split(SheetList, ";")
      With wkbTarget
        For e = LBound(SheetList) To UBound(SheetList)
          wkbSource.Worksheets(SheetList(e)).Copy After:=.Worksheets(.Worksheets.Count)
        Next
      End With
    End Function
    Exemple d'une procédure qui les invoque
    Dans cet exemple, on copie toutes les feuilles du classeur où se trouve le code VBA (ThisWorkbook) contenant la chaîne de caractère "_22-t" vers le classeur nommé "Bilan Fin d'année 2022.xlsx" (il faut bien entendu que celui-ci soit ouvert)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub t()
      Dim t As Variant
      ' Charge la liste des feuilles à copier
      t = GetSheetList("_22-t", ThisWorkbook)
      If IsArray(t) Then
         ' Copie des feuilles si le test est VRAI
         Application.ScreenUpdating = True
         CopySheet Workbooks("Bilan Fin d'année 2022.xlsx"), t, ThisWorkbook
         Application.ScreenUpdating = False
       Else
         MsgBox "Il n'y aucune feuille à copier"
      End If
    End Sub
    Pour en savoir plus sur les fonctions LBound, UBound, IsArray, Filter, Split et globalement l'utilisation des variables tableaux utilisées dans ces procédures, il y a lieu de consulter le tutoriel titré Utiliser les variables tableaux en VBA Excel
    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

Discussions similaires

  1. [XL-2016] Macro VBA Copier des données d'un classeur fermé selon critere
    Par Khataklysm dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2019, 11h40
  2. [XL-2010] VBA_ Copier une feuille depuis un classeur ouvert vers un classeur fermé
    Par spike72 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/09/2018, 23h23
  3. Réponses: 5
    Dernier message: 22/07/2011, 17h13
  4. [XL-2003] copier des feuilles dans nouveau classeur
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/01/2011, 08h25
  5. [VBA-E] Ordre des feuilles d'un classeur
    Par steps5ive dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2006, 19h11

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