Comment boucler chaque feuille

Résolu
Renard -  
eriiic Messages postés 24581 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

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Renard
       
      Merci pour ta solution. Je l'essaie dès demain.
      0
    2. 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
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. 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
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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