XL 2013 Rendre une macro plus simple

ksimat

XLDnaute Junior
Bonjour le forum,
Ma macro que j'ai réalisée par l'enregistreur de macro est trop longue et exécute les mêmes instructions sur plusieurs onglets. Je voudrais donc la rendre plus simple avec votre aide. Dans chaque feuille ("octobre", "novembre", "décembre" etc.) elle doit:
1 - Effacer le cellule (A1)
2 - Effacer la plage (E5:BN104)
3 - Appliquer la formule de la cellule (E3) sur la plage (E3:BN3)
Je précise que cette macro sera appelée dans une autre procédure liée elle à un bouton. En vous remerciant d'avance je colle ici la macro:

Sub MiseAJourRegistre()
Application.ScreenUpdating = False
Sheets("Octobre").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Novembre").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Décembre").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Janvier").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Février").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Mars").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Avril").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Mai").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Juin").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Sheets("Juillet").Select
Range("A1").ClearContents
Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
End Sub
 

Noel Bedard

XLDnaute Occasionnel
Bonjour,

Peut-être quelque chose du genre.
Code:
Sub MiseAJourRegistre()
Dim ws As Worksheet
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
   For Each ws In ActiveWorkbook.Sheets
        ws.Select
       Range("A1").ClearContents
       Range("E5:BN104").ClearContents
       Range("E3").Select
       Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
   Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Attention cette routine choisira toutes les feuilles, incluant celle qui la lance.

Bien à vous.
Noël
 
Dernière édition:

Patrice33740

XLDnaute Impliqué
Ou bien :
Code:
Option Explicit
Sub MiseAJourRegistre()
Dim feuilleDuClasseur As Worksheet
Dim numéroDeMois As Byte
Dim nomDuMois As String
  Application.ScreenUpdating = False
  For numéroDeMois = 1 To 12
    nomDuMois = Format(DateSerial(1900, numéroDeMois, 1), "mmmm")
    For Each feuilleDuClasseur In Worksheets
      With feuilleDuClasseur
        If LCase(feuilleDuClasseur.Name) = nomDuMois Then
          .Range("A1").ClearContents
          .Range("E5:BN104").ClearContents
          .Range("E3").AutoFill Destination:=.Range("E3:BN3"), Type:=xlFillDefault
        End If
      End With
   Next feuilleDuClasseur
  Next numéroDeMois
End Sub
 

ksimat

XLDnaute Junior
Bonsoir Noel Bedard,
Merci pour la proposition. Vous dites "Attention cette routine choisira toutes les feuilles, incluant celle qui la lance" alors que je veux que la macro intervienne uniquement sur les feuilles suivantes:
("octobre", "novembre", décembre", "janvier", "février", "mars", "avril", "mai", "juin", "juillet")
Jai déjà essayé ceci:
Dim Sh As Worksheet
For Each Sh In Sheets(Array("Octobre", "Novembre", "Décembre", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet"))
Sh.Range("A1").ClearContents
Sh.Range("E5:BN104").ClearContents
Range("E3").Select
Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault
Range("E3:BN3").Select
Next
Mais l'instruction (Selection.AutoFill Destination:=Range("E3:BN3"), Type:=xlFillDefault) n'est exécutée que sur une seule feuille.

Merci
 

Staple1600

XLDnaute Barbatruc
Bonsoir

Ou bien encore ;)
VB:
Sub a()
 Dim i&, Formule$
 Formule = "=ROW()*COLUMN()" 'ici mettre la vrai formule
 For i = 1 To 12
 On Error Resume Next
    With Sheets(Format(30 * i, "mmmm"))
    .Range("A1,E5:BN104") = "": .Range("E3:BN3").Formula = Formule
    End With
 Next
 End Sub
 
Dernière édition:

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir
Attention le for each ws implique que l'on n'a pas un ou plusieurs onglets destinés à autre chose
Si j'ai Data en feuille1 , puis j'ai mes onglets Janvier fevrier etc.. les modif se feront aussi dans Data ce qui n'est peut être pas souhaité
Mieux vaut passer par for x= 2 to sheets.count ; si Data est onglet 1 de même si après les 12 mois reste des onglets avec des données on peut limiter avec sheets.count -1 ou -2 etc ...
En fait c'est pour délimiter un nombre d'onglets contigus parmi l'ensemble
Juste qu'ensuite il faut ajouter "worksheets(x).Range("A1").ClearContents" pour les instructions
ou encore on précise : "with sheets(x)" et là on met seulement ".range("A1").ClearContents"
chacun sa méthode
 

ksimat

XLDnaute Junior
Salut Patrice33740, Staple1600, hervé62, le forum,
Je confirme que le code de Patrice33740 fonctionne bien et n'impacte pas les autres feuilles. Je vais tester celui de hervé et vous rendrai compte, c'est le moins que je vous dois à vous tous. Merci à Staple1600 pour la proposition et à Hervé62 pour l'importante remarque.
A bientôt
 

ksimat

XLDnaute Junior
Re
Staple1600, pardon pour le retard. Je rencontre des problèmes avec votre code et cela doit être de ma faute. Je ne sais pas où mettre la formule dans le code. Si vous me proposez n'importe quel code je remplacerai ensuite.
Merci
PS: Le code efface la plage (A1:BN1) au lieu de la (A1) seulement.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Bah il faudrait que je connaisse la formule qu'il a en E3
Tu peux poster un fichier exemple qu'on fasse des tests, stp ?

Sinon à partir où il y a bien 12 feuilles mensuelles en avec le nom en minuscule, cela fonctionne aussi sans le On error
VB:
Sub b()
Dim i&, Formule$
Formule = "=ROW()*COLUMN()" 'ici mettre la vrai formule
 For i = 1 To 12
    With Sheets(Format(30 * i, "mmmm"))
    .Range("A1", "E5:BN104") = "": .Range("E3:BN3").Formula = Formule
    End With
Next
End Sub
 

Patrice33740

XLDnaute Impliqué
Re

Patrice33740
Certes, oui ;)
Mais comme je ne connais pas la vraie formule ni n'ai pu tester faute de fichier exemple
J'ai fait dans la facilité et la fainéantise ;)
Comme je suis moins fainéant j'aurais écrit :
Code:
Option Explicit
Sub MiseAJourRegistre()
Dim feuilleDuClasseur As Worksheet
Dim numéroDeMois As Byte
Dim nomDuMois As String
  Application.ScreenUpdating = False
  For numéroDeMois = 1 To 12
    On Error Resume Next
    Set feuilleDuClasseur = Worksheets(Format(29 * numéroDeMois, "mmmm"))
    On Error GoTo 0
    If Not feuilleDuClasseur Is Nothing Then
      With feuilleDuClasseur
        .Range("A1").ClearContents
        .Range("E5:BN104").ClearContents
        .Range("E3").AutoFill Destination:=.Range("E3:BN3"), Type:=xlFillDefault
      End With
    End If
  Next numéroDeMois
End Sub
Mais même là on s'affranchit de certaines erreurs, pour bien faire il faudrait ajouter un gestionnaire d'erreur
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 196
Messages
2 086 100
Membres
103 116
dernier inscrit
kutobi87