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 SubBonsoir,
Tu te mélanges les pieds avec tes variables ...
Sht.Range("B10:D309").Value = wB.Sht.Range("B10:D309").ValueQuand 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
NextD'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
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 SubPas de problème du côté de Sht...
(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.
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]