XL 2016 Excel vba : faire une action sur certaines feuilles d'un classeur

Phillip

XLDnaute Occasionnel
Bonjour,

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"

Merci de votre aide

Cordialement

Phillip
 

Pièces jointes

  • mois.xlsm
    27.7 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
 

Pièces jointes

  • mois.xlsm
    26.2 KB · Affichages: 1

Hasco

XLDnaute Barbatruc
Repose en paix
Bonsoir,
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"
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
 

Dranreb

XLDnaute Barbatruc
Bonjour.
VB:
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.
 

Phillip

XLDnaute Occasionnel
Bonjour,

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

Merci encore de votre aide !

Cordialement

Phillip
 

Phillip

XLDnaute Occasionnel
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

Je suis perdu...

merci

Cordialement

phillip
 

Dranreb

XLDnaute Barbatruc
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.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 184
Membres
112 679
dernier inscrit
Yupanki