Je voudrais parcourir mon classeur, feuille à feuille, pour faire une action sur certaines bien identifiées. J'ai donc écrit le code suivant.
VB:
Sub test()
For Each Fmois In Sheets
If Fmois.Name = "janvier" Then
Worksheets("janvier").Activate
ElseIf Fmois.Name = "février" Then
Worksheets("février").Activate
End If
Next Fmois
Range("a1").Value = "bravo"
End Sub
Cela marche très bien, mais je voudrais qu'à chaque fois que la condition est réunie, écrire "bravo" dans la feuille qu'on est en train de tester et qui répond à mes conditions...
Je teste si la feuille est janvier, si oui, je colle "bravo", sinon, je passe à la feuille suivante, si c'est février, je colle bravo, si non, je passe à la suivante, etc...
Et ça ça ne marche pas. Je ne voudrais pas avoir à coller Range("a1").Value = "bravo" après Worksheets("janvier").Activate ET après Worksheets("février").Activate, car vous vous doutez bien que l'action que je veux faire sur janvier et février est légèrement plus compliquée que de coller "bravo"
Bonsoir Phillip,
Voir PJ, mais il semble qu'il suffit de faire :
VB:
Sub test()
For Each Fmois In Sheets
If Fmois.Name = "janvier" Then
Worksheets("janvier").Activate
Worksheets("janvier").Range("a1") = "bravo"
ElseIf Fmois.Name = "février" Then
Worksheets("février").Activate
Worksheets("février").Range("a1") = "bravo"
End If
Next Fmois
End Sub
Ou pour éviter de répéter Worksheets :
Code:
Sub test2()
For Each Fmois In Sheets
If Fmois.Name = "janvier" Then
With Worksheets("janvier")
.Activate
.Range("a1") = "bravo !!!"
' Continuer actions
End With
ElseIf Fmois.Name = "février" Then
With Worksheets("février")
.Activate
.Range("a1") = "bravo !!!"
' Continuer actions
End With
End If
Next Fmois
End Sub
C'est à cet "autre chose que vous voulez faire" qui serait intéressant à creuser, pas un truc vague et général.
Mais dans votre code vous avez la variable feuille Fmois dont vous pouvez vous servir pour ne pas avoir à faire référence à son nom
VB:
Fmois.Activate ou Fmois.Range("A1")="Toto"
Et votre boucle vous pouvez l'écrire :
Code:
Dim Fmois As Worksheet
'
' Parcourir chaque feuille dont le nom est dans le tableau (rajouter les mois manquants)
For Each Fmois In Sheets(Array("janvier", "févier"))
Select Case Fmois.Name
Case "janvier"
Fmois.Range("A1") = "toto"
Case "février"
Fmois.Range("B2") = "tata"
Case "mars"
With Fmois
.Range("C3") = "toto et tata"
.Range("B25987") = 12
End With
End Select
Next Fmois
Sub Test()
Dim WshMois As Worksheet
For Each WshMois In ThisWorkbook.Worksheets
If WshMois.Name = "janvier" Then
EffectuerLeTrucPour WshMois
ElseIf WshMois.Name = "février" Then
EffectuerLeTrucPour WshMois
End If
Next WshMois
End Sub
Private Sub EffectuerLeTrucPour(ByVal Wsh As Worksheet)
Wsh.Activate
Wsh.Range("A1") = "bravo"
End Sub
Bien sûr dans ce cas particulier et si c'est pour les 12 mois, on pourrait aussi simplement faire :
Code:
Sub Test()
Dim WshMois As Worksheet
For Each WshMois In ThisWorkbook.Worksheets
If IsDate("1 " & WshMois.Name & " " & Year(Date)) Then
WshMois.Activate
WshMois.Range("A1") = "bravo"
End If
Next WshMois
End Sub
Mais je pense que ce n'était pas le sujet de la discussion.
Alors ce qui correspond à ce que je veux est le code de Dranreb avec la mise en facteur des opérations dans une private sub
VB:
Sub Test()
Dim WshMois As Worksheet
For Each WshMois In ThisWorkbook.Worksheets
If WshMois.Name = "janvier" Then
Fairelessommes WshMois
ElseIf WshMois.Name = "février" Then
Fairelessommes WshMois
End If
Next WshMois
End Sub
Private Sub Fairelessommes(ByVal Wsh As Worksheet)
Wsh.Activate
Set zonedepfixe = Wsh.Names("zonedepfixe").RefersToRange 'ThisWorkbook.Names("zonedepfixe").RefersToRange
somdep = 0
For Each depense In zonedepfixe
datedep = Format(depense.Offset(, 1), "m")
If datedep = VmoisC Then
somdep = somdep + depense
End If
Next depense
Wsh.Names("zonedepfixe").Delete 'ActiveWorkbook.Names("zonedepfixe").Delete
End Sub
Sauf que, comme je le disais, je ne veux pas seulement coller bravo dans une cellule. Comme dans le code ci-dessus, si je suis en janvier, je veux ajouter le nom zonedepfixe dans la feuille, puis, faire mes opérations pour la feuille de janvier, supprimer le nom (car on ne peut pas avoir 2 fois le même nom dans un classeur ?), et quand je suis sur la feuille de février, réattribuer ce nom, faire mes opérations, le supprimer à la fin, etc...
Ca marche pour janvier, ça m'affecte le nom, je fais mon truc, le supprime, mais lorsque je passe à la feuille février, ça plante, ça ne m'affecte pas le nom dans la feuille...
Je précise que ni l'une ni l'autre des solutions ci-dessous ne fonctionne
Wsh.Names("zonedepfixe").Delete 'ActiveWorkbook.Names("zonedepfixe").Delete
J'ai modifié mon code comme suit, c'est à dire que je supprime le nom dès que j'ai fini janvier
VB:
For Each Fmois In ThisWorkbook.Worksheets
If Fmois.Name = Vmoislettres Then
Fairelessommes Fmois
ActiveWorkbook.Names("zonedepfixe").Delete
ElseIf Fmois.Name = VmoisprochainLettres Then
Fairelessommes Fmois
ActiveWorkbook.Names("zonedepfixe").Delete
End If
Next Fmois
et le code suivant, dans ma private sub marche pour janvier, mais après ne marche plus pour février (ne veut pas attribuer le nom)
Code:
Wsh.Activate
Set zonedepfixe = ThisWorkbook.Names("zonedepfixe").RefersToRange
Vous n'attribuez jamais de nom, là, vous le supprimez seulement à la fin.
Pour l'attribuer c'est soit Rng.Name = "ZoneDePFixe", soit Obj.Names.Add "ZoneDePFixe", Rng avec Obj un objet muni d'une collection Names, soit Worksheet soit Workbook. Remarque la collection Names de l'objet Worksheet à pour membres les mêmes objets Name que celle de l'objet Workbook, mais identifiés par des clés différentes de leurs propriétés Name, débarassées du préfixe de feuille.
De plus la méthode Add de la collection Names de l'objet Worksheet ajoute, s'il n'est pas spécifié, ce préfixe à sa propriété Name. On peut donc ajouter le même nom dans plusieurs feuilles puisqu'au niveau classeur ils seront distingués par ce préfixe.