Boucle copie strict quelques feuilles entre fichiers

Bien le bonjour,

Je cherche un petit coup de main pour rendre fonctionnel un code qui a pour but de réaliser une copie entre 2 fichiers.

Mais pas une copie toute simple ! Uniquement une partie d'un tableau répété sur plusieurs feuilles (non incrémentiel !)

En fait il s'agit de l'importation d'une BDD simplifié vers un fichier (celui qui exécute la macro qui suit) plus important afin de travailler avec les données sans affecter le fichier BDD.

Le nom des feuilles entre le donneur et le receveur sont identique, la plage de cellules aussi.

Là ou ça foire c'est le moment du copier/coller.

Comment arriver à faire la différence entre le donneur et le receveur mis à part le nom du Workbook le tout dans une boucle qui elle porte sur le nom des feuilles ?!?

Sht.Range("B10:D309").Value = wB.Sht.Range("B10:D309").Value

Merci pour votre éclairage.

Sub Importation_full()
' Importation en boucle de plusieurs feuilles (copie strict)

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    Dim shA As Worksheet 'Feuille A Receveur - Dans ce classeur...
    Dim Sht As Worksheet
    Dim wB As Workbook 'Classeur B Donneur - BDD
    Dim NomSource, i As Integer

    ' Défini la feuille qui va recevoir les données
    Set shA = ThisWorkbook.Sheets("Ep-2")

    ' Chemin du fichier source de la BDD à importer
    MaBDD = "M:\Opti-misme_BDD.xls"

    If MsgBox("Voulez vous aller chercher le fichier Opti-misme_BDD.xls ? ", vbYesNo) = vbYes Then

        ' Il faut aller chercher le fichier Excel"EXTRACTION" donc on utilise Application.GetOpenFilename
        NomSource = Application.GetOpenFilename

        ' Début de la boucle
        ' Condition avec liste
        For Each Sht In Worksheets(Array("Ep-2", "Ep-3"))
            With Sht
            ' Action
            ' Effacement des données présente du coté du receveur
            .Range("B10:D309").ClearContents

            ' Ouvre le fichier source
            Set wB = Workbooks.Open(NomSource)

            ' Du coté du receveur on récupère le contenu du donneur
            Sht.Range("B10:D309").Value = wB.Sht.Range("B10:D309").Value

            ' Fermeture du classeur BDD.xls
            wB.Close False

             End With

            ' Fin de la boucle
            Next

    Else

        MsgBox (" Aurevoir et à bientôt ")

    End If

    MsgBox "Fin de l'opération", vbOKOnly + vbInformation

    Set Sht = Nothing
    Set shA = Nothing
    Set wB = Nothing

    Sheets("Bienvenue").Select

End Sub

Bonsoir,

Tu te mélanges les pieds avec tes variables ...

          Sht.Range("B10:D309").Value = wB.Sht.Range("B10:D309").Value

Quand tu écris cette ligne, Sht est ta variable de boucle For Each... Next qui parcourt les feuilles Ep-2 et Ep-3 de ton classeur (ThisWorkbook), et tu te trouves dans un bloc With Sht, le premier Sht n'a donc pas de raison d'être.

Dans l'autre membre, à droite du signe =, tu réintroduis Sht ! dans wb.Sht. D'une part Sht est une variable objet et désigne une feuille bien précise et à part entière (pas besoin d'autre qualificateur, et encore moins d'une autre variable objet classeur, elle. De plus Sht n'appartient pas à wb...

Joyeux mélange dans cette ligne, reprends tout posément...

Cordialement.

Bonjour,

Je suis tout à fait d'accord avec votre analyse et si la première partie de l'égalité est facile à résoudre, la seconde est une autre paire de manches.

Il s'agit d'un boucle à 2 arguments qui évolues en même temps (synchronisation) et via le même arguments commun (Sheets).

Oui mais, si c'était simple pour moi je le saurais déjà ^^

Bonsoir,

Je passe sur shA que tu initialises mais dont tu ne te sers pas...

Je passe aussi sur l'ouverture et fermeture du classeur dans la boucle, qui interviendra donc 2 fois, ce qui devrait être évité... mais restons sur le problème strictement posé.

Je retiens ta déclaration initiale que les feuilles ont le même nom.

        For Each Sht In Worksheets(Array("Ep-2", "Ep-3"))
            With Sht
                .Range("B10:D309").ClearContents
                Set wB = Workbooks.Open(NomSource)
                .Range("B10:D309").Value = wB.Worksheets(Sht.Name).Range("B10:D309").Value
                wB.Close False
            End With
        Next

D'autre choses à reprendre à mon avis... mais ainsi on devrait résoudre le problème principal.

Cordialement.

Bonsoir,

Merci MFerrand pour les pistes.

Je comprends l'idée d'extraire le nom sur l'objet Sheets mais malheureusement ça n'a pas suffit.

Je joints donc une version allégé de mon fichier de travail ainsi que ce celui qui me sert à stocker et constituer ma BDD.

<-- Fichier trop volumineux (2Mo)

La macro se trouve dans le module "Import".

En espérant arriver à trouver une solution. Je me dis que je ne dois pas être le premier à vouloir copier le contenu d'une plage issue d'un classeur vers un autre avec comme dénominateur commun le nom des feuilles...

Merci encore

[EDIT]

A supprimer

L'utilisation de Sht.Name fonctionne. Ce qui me paraît logique dès que la chaîne renvoyée est la bonne et correspond au nomde feuille.

Reste à voir ce qui ne fonctionne pas alors. On verra demain car il faut que je fasse quelques aménagements pour pouvoir tester...

Bonjour,

Voilà ce que j'ai testé et qui fonctionne !

Sub Importation_full()
    Dim Sht As Worksheet, wb As Workbook, NomSource, i%
    If MsgBox("Voulez vous aller chercher le fichier Opti-misme_BDD.xls ? ", vbYesNo) _
     = vbYes Then
        NomSource = Application.GetOpenFilename
        If NomSource <> False Then
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
            Set wb = Workbooks.Open(NomSource)
            For Each Sht In ThisWorkbook.Worksheets(Array("Ep-2", "Ep-3"))
                With Sht
                    .Range("B10:D309").ClearContents
                    .Range("B10:D309").Value = wb.Worksheets(Sht.Name).Range("B10:D309").Value
                End With
            Next Sht
            wb.Close False
            Sheets("Bienvenue").Select
            Application.ScreenUpdating = True
            MsgBox "Fin de l'opération", vbInformation
            Application.Calculation = xlCalculationAutomatic
        End If
    Else
        MsgBox "Au revoir et à bientôt"
    End If
End Sub

Pas de problème du côté de Sht... Par contre l'opération semblait prendre un temps relativement très long ! Un examen plus approfondi montrait que c'est le recalcul intervenant à la fin qui produisait cet allongement considérable.

(Un point sur lequel il faudra peut-être se pencher, car je n'ai pas eu l'impression d'une abondance de formules en rapport avec ce temps de recalcul...)

Je considère toujours que le recalcul en tant que tel n'a pas d'incidence sur le déroulement d'une macro, et qu'en réalité il n'est une gêne que pour le travail manuel dans Excel... Ce qui se passe ici, ne le contredit pas, mais montre que le recalcul prenant le relais de la macro retarde le retour à la normale (affichage du message).

J'ai donc après quelques tests procédé ainsi dans le code ci-dessus :

  • désactivation de la mise à jour de l'affichage et du calcul automatique,
  • déroulement de la macro jusqu'à son terme : fermeture du classeur source et réactivation de la feuille Bienvenue,
  • juste après rétablissement de la mise à jour de l'affichage (on n'attend pas le rétablissement automatique par Excel, on le force avant message de fin),
  • message de fin d'opération,
  • et final après message de fin, par rétablissement du calcul automatique.
De cette façon, le recalcul ne vient plus allonger le temps apparent d'exécution de la macro qui redevient instantané et rend donc très vite la main à l'utilisateur, qui peut cliquer sur le message marquant la fin, et le recalcul n'intervient qu'après que l'utilisateur ait repris la main, ce qui peut toutefois demeurer gênant pour lui mais ne peut plus être imputé à la macro...

Cordialement.

NB- Je ne l'ai pas spécialement testé, mais je pense que la boucle démarrait sur Worksheets(Array(... sans préciser le classeur, or le classeur source venant alors d'être ouvert devenait le classeur actif, et ThisWorkbook ne l'était plus, il convenait donc de le préciser.

Merci beaucoup MFerrand pour votre aide précieuse !

Maintenant ça fonctionne !!

En effet par contre j'observe aussi un "recalcule" très très long.

Certes je travail sur un fichier avec quand même pas mal de formules et un certain nombre de lignes (4800 pour le gros du travail) mais le phénomène est trop récent pour que ce soit ma structure qui soient en cause.

Ce sera l'objet d'un autre sujet si je n'arrive pas à trouver la cause.

[Résolu]

Rechercher des sujets similaires à "boucle copie strict feuilles entre fichiers"