Comment boucler chaque feuille

Résolu
Renard -  
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je dois modifier plusieurs dizaines de fichiers Excel 2010 contenant chacun une à dix feuilles.
Pour cela, j'ai réalisé la macro suivante. Avec elle, j'arrive à modifier tous les fichiers, mais une seule feuille par fichier. Quelqu'un peut-il me dire où est mon erreur?



Sub BaseDonnées()
Dim Chemin As String, Fichier As String
Dim Feuille As Worksheet
Chemin = ThisWorkbook.Path & "\"
Fichier = Dir(Chemin & "*.xls")
'boucle sur tous les classeurs
Do While Len(Fichier) > 0
If Fichier <> ThisWorkbook.Name Then
'ouvre le fichier
Workbooks.Open Filename:=Chemin & Fichier
'boucle sur chaque feuille
For Each Feuille In ActiveWorkbook.Worksheets
'
' BaseDonnées Macro
'

'
Cells.Select
Selection.UnMerge
Range("T5").Select
Selection.Copy
Range("CJ9").Select
ActiveSheet.Paste
Range("BV5").Select
Application.CutCopyMode = False
Selection.Copy
Range("CK9").Select
ActiveSheet.Paste
Range("J6").Select
Application.CutCopyMode = False
Selection.Copy
Range("CL9").Select
ActiveSheet.Paste
Range("AW6").Select
Application.CutCopyMode = False
Selection.Copy
Range("CM9").Select
ActiveSheet.Paste
Range("O29").Select
Application.CutCopyMode = False
Selection.Copy
Range("CN9").Select
ActiveSheet.Paste
Range("CB29").Select
Application.CutCopyMode = False
Selection.Copy
Range("CO9").Select
ActiveSheet.Paste
Range("CP9").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = _
"=LEFT(CELL(""nomfichier"",R[-8]C[-93]),FIND(""["",CELL(""nomfichier"",R[-8]C[-93]))-2)"
Range("CJ9:CP9").Select
Selection.Copy
Range("CJ10").Select
ActiveSheet.Paste
Range("CJ11").Select
ActiveSheet.Paste
Range("CJ12").Select
ActiveSheet.Paste
Range("CJ13").Select
ActiveSheet.Paste
Range("CJ14").Select
ActiveSheet.Paste
Range("CJ15").Select
ActiveSheet.Paste
Range("CJ16").Select
ActiveSheet.Paste
Range("CJ17").Select
ActiveSheet.Paste
Range("CJ18").Select
ActiveSheet.Paste
Range("CJ19").Select
ActiveSheet.Paste
Range("CJ20").Select
ActiveSheet.Paste
Range("CJ21").Select
ActiveSheet.Paste
Range("CJ22").Select
ActiveSheet.Paste
Range("CJ23").Select
ActiveSheet.Paste
Range("CJ24").Select
ActiveSheet.Paste
Range("CJ25").Select
ActiveSheet.Paste
Range("CJ26").Select
ActiveSheet.Paste
Range("CJ27").Select
ActiveSheet.Paste
Next
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
Fichier = Dir()
Loop
End Sub





1 réponse

eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 273
 
Bonjour,

La structure est bonne, mais tu t'adresses toujours à la feuille active.
Et ça n'est pas très optimisé. Evite les .select qui ne servent à rien d'autre que ralentir.

Pour t'adresser à la feuille utilise With Feuille, ensuite tu mets un . (partout où c'est nécessaire, et sans en oublier un seul) pour dire que tu t'adresses à l'objet défini dans le with
Ex :
For Each Feuille In ActiveWorkbook.Worksheets
    With Feuille
        .Cells.UnMerge
        .Range("T5").Copy .Range("CJ9")
        .Range("BV5").Copy .Range("CK9")
    End With
Next Feuille

Quand ça sera au point ajoute en début de code :
application.screenupdating=false
et application.screenupdating=true à la fin
Ca évitera les clignotements désagréables et accélèrera l'ensemble.

eric

edit: bien entendu teste sur des copies de fichiers vu que tu enregistres des modifications


Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
0
Renard
 
Merci pour ta solution. Je l'essaie dès demain.
0
Renard
 
J'ai essayé ta suggestion, mais ça ne fonctionne pas. Voilà des heures que je la retourne en tout sens et rien ne va.

Merci quand même
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 273
 
Bonjour,

J'ai essayé ta suggestion, mais ça ne fonctionne pas.

Si, ça fonctionne. Je te parle du with et de comment l'utiliser.
Maintenant c'est peut-être toi qui la met mal en oeuvre...
Et si tu ne mets pas le code que tu as fait et que tes explications se limitent à ça ne marche pas ça va être difficile de voir ce qui cloche...

eric
0
Renard
 
Bonjour,

Voilà le fichier que j'ai fait. Quand je l'exécute, il modifie la feuille qui était active à l'enregistrement de chacun de mes fichiers et ne touche pas aux autres. J'ai essayé d'autres modifications, mais la macro chageait de feuille elle boguait à la première case à copier.

Sub BaseDonnées()
Dim Chemin As String, Fichier As String
Dim Feuille As Worksheet
Chemin = ThisWorkbook.Path & "\"
Fichier = Dir(Chemin & "*.xls")
'boucle sur tous les classeurs
Do While Len(Fichier) > 0
If Fichier <> ThisWorkbook.Name Then
'ouvre le fichier
Workbooks.Open Filename:=Chemin & Fichier
'boucle sur chaque feuille
For Each Feuille In ActiveWorkbook.Worksheets
With Feuille
.Cells.UnMerge
.Range("T5").Copy .Range("CJ9")
.Range("BV5").Copy .Range("CK9")
.Range("J6").Copy .Range("CL9")
.Range("AW6").Copy .Range("CM9")
.Range("O29").Copy .Range("CN9")
.Range("CB29").Copy .Range("CO9")
.Range("CP9").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = _"=LEFT(CELL(""nomfichier"",R[-8]C[-93]),FIND(""["",CELL(""nomfichier"",R[-8]C[-93]))-2)"
.Range("CJ9:CP9").Copy
.Range("CJ10").Select
ActiveSheet.Paste
.Range("CJ11").Select
ActiveSheet.Paste
.Range("CJ12").Select
ActiveSheet.Paste
.Range("CJ13").Select
ActiveSheet.Paste
.Range("CJ14").Select
ActiveSheet.Paste
.Range("CJ15").Select
ActiveSheet.Paste
.Range("CJ16").Select
ActiveSheet.Paste
.Range("CJ17").Select
ActiveSheet.Paste
.Range("CJ18").Select
ActiveSheet.Paste
.Range("CJ19").Select
ActiveSheet.Paste
.Range("CJ20").Select
ActiveSheet.Paste
.Range("CJ21").Select
ActiveSheet.Paste
.Range("CJ22").Select
ActiveSheet.Paste
.Range("CJ23").Select
ActiveSheet.Paste
.Range("CJ24").Select
ActiveSheet.Paste
.Range("CJ25").Select
ActiveSheet.Paste
.Range("CJ26").Select
ActiveSheet.Paste
.Range("CJ27").Select
ActiveSheet.Paste
End With
Next Feuille
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
Fichier = Dir()
Loop
End Sub
0
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 273
 
j'ai testé en réduisant les modifs à
With Feuille
.Cells.UnMerge
.Range("A5").Copy .Range("A9")
End With
et ça marche très bien chez moi, A5 est bien copié en A9.

Mais plus bas je vois que tu as laissé des ActiveCell et autres ActiveSheet.Paste. Vu que tu n'active pas les feuilles ça colle toujours sur la même, celle qui est active à l'ouverture.
Remplace :
.Range("CP9").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = _"=LEFT(CELL(""nomfichier"",R[-8]C[-93]),FIND(""["",CELL(""nomfichier"",R[-8]C[-93]))-2)"
par:
.Range("CP9").FormulaR1C1 = _"=LEFT(CELL(""nomfichier"",R[-8]C[-93]),FIND(""["",CELL(""nomfichier"",R[-8]C[-93]))-2)"

et le gros paquet de lignes qui reste par :
.Range("CJ9:CP9").AutoFill .Range("CJ27:CP27")

Si il y a encore qcq chose qui coince ajoute après With Feuille :
Feuille.activate

eric
0