Modifier le nom d'onglets ou les masquer en fonction d'une date

_V1nce_

XLDnaute Nouveau
Bonjour à tous!

Voila plusieurs heures que je cherche comment effectuer mon code, sans succès. Peut-être pourriez vous m'aider?

Dans mon Excel, j'ai 12 onglets nommés de base "M1", "M2" jusqu'à "M12". Sur l'onglet suivant nommé "Régularisation Pr" j'ai 2 dates pour définir une période. Par ex "1 mars 2016" en C7 et "31 octobre 2016" en E7.

J'aimerai alors que le code me change automatiquement le nom de l'onglet "M1" en "Mars 15" (format MMM/AA si je ne m'abuse), l'onglet "M2" en Avr 15" etc (par une formule décaler.mois peut être?) jusqu'à l'onglet M8 renommé en "Oct 16". De plus, vue que la période s'arrête, j'aimerai que les 4 onglets suivant dans cet exemple (de M9 à M12) se masquent et que le tout se mette automatiquement à jour en fonction des dates que l'on précise dans les 2 cellules.

Est ce que cela est possible? Merci par avance pour vos éclaircissements!
Bonne journée
 
Dernière modification par un modérateur:

_V1nce_

XLDnaute Nouveau
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Bonjour Lone-wolf et merci :)
Ci joint le fichier excel:

Bonne journée
 

Pièces jointes

  • Régularisation Pr Pe BGM6 test macro.xlsm
    57.2 KB · Affichages: 36
Dernière modification par un modérateur:

Theze

XLDnaute Occasionnel
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Bonjour,

A tester. Attention, comme j'utilise l'index de feuille, la feuille "Régularisation Pe" doit se trouver en dernier (tout à droite donc car renommage de gauche à droite) sinon, elle risque d'être renommée :
Code:
Sub Test()

    Dim NBMois As Integer
    Dim I As Integer
    Dim J As Integer
    Dim DateDeb As Date
    Dim DateFin As Date
    
    DateDeb = Worksheets("Régularisation Pe").Range("C7").Value
    DateFin = Worksheets("Régularisation Pe").Range("E7").Value
    
    NBMois = DateDiff("m", DateDeb, DateFin)
    
    For I = Month(DateDeb) To Month(DateDeb) + NBMois
        
        J = J + 1
        Worksheets(I - Month(DateDeb) + 1).Name = Format(DateSerial(Year(DateDeb), I, 1), "mmm yy")
        
    Next I
    
End Sub
 

Lone-wolf

XLDnaute Barbatruc
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Bonjour Theze,

@ _V1nce_ : tu peux faire aussi comme ça, si tu ne veux pas mettre de bouton pour appeler la macro.
Clique sur la cellule C7 pour modifier les noms.

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim NBMois As Integer
Dim I As Integer
Dim J As Integer
Dim DateDeb As Date
Dim DateFin As Date

  Application.ScreenUpdating = False
    DateDeb = Worksheets("Régularisation Pe").Range("C7").Value
    DateFin = Worksheets("Régularisation Pe").Range("E7").Value
    If Target.Address <> "$C$7" Then Exit Sub
   If ActiveCell <> "" Then
    NBMois = DateDiff("m", DateDeb, DateFin)
   
    For I = Month(DateDeb) To Month(DateDeb) + NBMois
       
        J = J + 1
        Worksheets(I - Month(DateDeb) + 1).Name = Format(DateSerial(Year(DateDeb), I, 1), "mmm yy")
       
    Next I
End If
End Sub


A+ :cool:
 
Dernière édition:

_V1nce_

XLDnaute Nouveau
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Bonsoir, et merci pour vos retours :)
La première méthode fonctionne, mais la nomination des onglets ne se fait effectivement pas automatiquement.

Pour la deuxième méthode, je n'arrive pas à la faire fonctionner. Lorsque je modifie la date en C7, cela ne change rien. J'ai essayer de coller le code sur la feuille 15 (régularisation Pe) et aussi sur ThisWorkbook sans succès malheureusement. Y a t-il une manip à effectuer, ou simplement copier/coller?

Bonne soirée!
 

Lone-wolf

XLDnaute Barbatruc
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Re _V1nce_

le code que je t'ai mis, est à mettre dans la feuille régularisation pe, ensuite clique sur la cellule C7.
Et comme la dit Theze, il faut que tu mette la feuille presentation du contrat après M12, sinon c'est normal que ça ne marche pas.

NOTE : une approche pour masquer les feuilles 9 à 12.

If I >= 9 And I <= 12 Then
Worksheets("M" & I).Visible = False
Else
Worksheets("M" & I).Visible = True
End If



A+ :cool:
 
Dernière édition:

_V1nce_

XLDnaute Nouveau
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Super ça marche, merci beaucoup ^^
Par contre pouvez vous expliquer le code de manière à ce que je le comprenne et puisse, le cas échéant l'adapter à un autre cas de figure?
Puis question bonus: Pourquoi dimensionner les variables (dim...as ) et ne pas les utiliser directement. Je sais que c'est la base mais je n'ai jamais compris ^^.

En tout cas merci pour votre réactivité et votre dispo :cool:
 

Theze

XLDnaute Occasionnel
Re : Modifier le nom d'onglets ou les masquer en fonction d'une date

Bonjour,

Les explications sont dans le code. J'ai supprimé la variable J qui ne sert à rien (c'était pour les tests mais je m'en suis passé) :
Code:
Sub Test()

    Dim NBMois As Integer
    Dim I As Integer
    Dim DateDeb As Date
    Dim DateFin As Date
    
    'défini la date de début (elle est sensée être dans un format de date valide)
    DateDeb = Worksheets("Régularisation Pe").Range("C7").Value
    'défini la date de fin (idem...)
    DateFin = Worksheets("Régularisation Pe").Range("E7").Value
    
    'calcule la différence en mois ("m") entre ces deux dates
    NBMois = DateDiff("m", DateDeb, DateFin)
    
    'boucle sur les feuilles en commençant par celle portant l'index correspondant au mois de la date de début
    'jusqu'à celle ayant l'index incrémenté de la différence en mois, dans ton cas le "1 mars 2016"
    'donne pour index de début 3 et la date "31 octobre 2016" donne pour index de fin 10
    'donc, For I = 3 to 3 + 7
    For I = Month(DateDeb) To Month(DateDeb) + NBMois
        
        'comme il faut commencer à l'index 1 pour la première feuille, il faut retrancher à I
        'la valeur de l'index du mois ce qui donne 0 mais comme il n'existe pas de feuille ayant un index 0, il faut rajouter 1
        Worksheets(I - Month(DateDeb) + 1).Name = Format(DateSerial(Year(DateDeb), I, 1), "mmm yy")
        
    Next I
    
End Sub
 

Statistiques des forums

Discussions
311 733
Messages
2 082 011
Membres
101 866
dernier inscrit
XFPRO