[VBA] Commenter code existant

TheLio

XLDnaute Accro
Salut le forum,
Dans le cadre de mon travail, j'ai hérité d'un classeur assez bien ficelé avec ces lignes de codes:

Code:
Option Explicit

' Mes excuses les plus sincères à celui ou celle qui devra reprendre ce code...
' En effet, il n'y a quasiment rien de commenté. La prog n'est pas du tout
' orientée objet (le langage ne s'y prête pas, note).
' Un conseil quand meme, bien regarder les références aux cellules. Si ça ne
' fonctionne plus, c'est peut-être à cause de ça (une ligne de rajoutée, ce
' genre de truc...).
' Voilà, je n'ai plus qu'une chose à dire : bonne chance :)

Dim c As Workbook

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row <> 39 And Target.Column <> 5 Then
        set_nomOnglet prop_jour, "fr"
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error GoTo fermeFichier
    If Target.Row = 39 And Target.Column = 4 Then
        If (MsgBox("Tu vas envoyer les commandes par mail, au format électronique, à : " + vbCrLf + vbCrLf + vbTab + [E39] + vbCrLf + vbCrLf + "Si tu veux pas, clique sur 'NON'. Si c'est bon, clique sur 'OUI'." + vbCrLf + "Si une fenêtre apparaît ensuite, et qu'elle parle de possibilité de virus, clique de nouveau sur 'OUI'. A+", vbYesNo, "Envoi de mail") = vbYes) Then
            If envoiMail("Page de garde") Then
                MsgBox ("Mail envoyé à " + [E39] + ".")
            End If
        End If
    End If
    Exit Sub
fermeFichier:
    c.Saved = True
    c.Close
    MsgBox ("Le mail n'a pas pu partir, l'application s'est arrêtée. Sorry...")
    Exit Sub
End Sub

Private Function envoiMail(ByVal garde As String)
    Dim f As Worksheet
    Dim w As Window
    Dim txt As String, objMsg As String
    Dim lng As Integer, col As Integer, nbf As Integer
    Dim ok As Boolean
    
    lng = 10
    col = 2
    
    ok = True
    nbf = 0
    txt = Cells(lng, col)
    Set w = Windows(1)
    ThisWorkbook.Sheets(garde).Copy
    Set c = Workbooks.Item(Workbooks.Count)
    For Each f In w.SelectedSheets
        If f.Name <> garde Then
            f.Copy after:=Workbooks(c.Name).Sheets(garde)
        End If
        nbf = nbf + 1
    Next
    If nbf > 8 Then
        If MsgBox("T'as sélectionné beaucoup onglets. C'est peut-être voulu, mais peut-être pas. Envoyer quand même le mail ?", vbYesNo) = vbNo Then
            ok = False
        End If
    End If
    If ok Then
        SupprimeToutCodeEtFormulaire c.Name
        For Each f In Workbooks(c.Name).Application.Worksheets
            If f.Name = garde Then
                f.Cells(lng, col).Value = txt
            End If
            f.Protect Password:="bluKwerhT93pOO20093"
        Next
        objMsg = [B45] & " --- semaine " & [F8]
        Workbooks(c.Name).SendMail Split([E39], ","), objMsg, True
    End If
    c.Saved = True
    c.Close
    If ok Then
        envoiMail = True
    Else
        envoiMail = False
    End If
End Function

Private Sub SupprimeToutCodeEtFormulaire(NomClasseur As String)
    Dim VBComp As Object
    Dim VBComps As Object
    
    Set VBComps = Workbooks(NomClasseur).VBProject.VBComponents
    
    For Each VBComp In VBComps
        Select Case VBComp.Type
            Case 100
                With VBComp.CodeModule
                    .DeleteLines 1, .CountOfLines
                End With
        Case Else
            VBComps.Remove VBComp
        End Select
    Next VBComp
End Sub

Je ne comprend malheureusement pas la moitié de ce code.
Est-ce qu'une âme charitable pourrait me le commenter ?
Je sais que ce n'est pas très fun à faire, mais moi j'en suis malheureusement inccapable.
D'avance merci
TheLio
 

Gorfael

XLDnaute Barbatruc
Re : [VBA] Commenter code existant

Salut TheLio et le forum
étant autodidacte, j'ai encore certaines lacune
mais voici ce que je comprends :
Code:
Option Explicit
'oblige à déclarer les variables sur tput le module
Dim c As Workbook 'variable globale / publique
'Variable utilisable par toutes les macros du module lié.
'n'est pas réinitialisée à la fin d'une macro
'ce qui permet de la transmettre à d'autres macros
Private Sub Worksheet_Change(ByVal Target As Range)
'macro qui se lance à chaque saisie dans la feuille
    If Target.Row <> 39 And Target.Column <> 5 Then
    ' si la cellule est différente de E39
    'If Target.Address(0, 0) <> "E39" Then
        set_nomOnglet prop_jour, "fr"
        'lancer la macro : set_nomOnglet
        'avec 2 paramètres :
        '- prop_jour : doit être une variable globale déclarée dans un module
        '     général
        '- le texte fr
    End If
    'pour éviter les ambiguïtés, je préfère utiliser CALL
    'If Target.Address(0, 0) <> "E39" Then Call set_nomOnglet(prop_jour, "fr")
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'se lance à chaque changement de sélection sur la feuille
    On Error GoTo fermeFichier
    'en cas d'erreur Excel aller à l'adresse fermeFichier
    If Target.Row = 39 And Target.Column = 4 Then
    'si la selection est D39 alors
        If (MsgBox("Tu vas envoyer les commandes par mail, au format électronique, à : " + vbCrLf + vbCrLf + vbTab + [E39] + vbCrLf + vbCrLf + "Si tu veux pas, clique sur 'NON'. Si c'est bon, clique sur 'OUI'." + vbCrLf + "Si une fenêtre apparaît ensuite, et qu'elle parle de possibilité de virus, clique de nouveau sur 'OUI'. A+", vbYesNo, "Envoi de mail") = vbYes) Then
        'boite de dialogue de structure bizarre. voir l'aide
            If envoiMail("Page de garde") Then
            'si la fonction envoieMail
            'avec le paramètre "page de garde" est à vrai, alors
                MsgBox ("Mail envoyé à " + [E39] + ".")
                'boîte de dialogue ne faisant que prévenir que le mail
                'est envoyé chez le nom dans E39
            End If
        End If
    End If
    Exit Sub
    'fin macro (nécessaire à cuse de la gestion des erreurs)
fermeFichier: ' adresse où va pointer Excel s'il détecte une erreur de fonctionnement
    c.Saved = True
    c.Close
    'on enregistre les modifs du classeur stocké dans la variable c et on le ferme
    MsgBox ("Le mail n'a pas pu partir, l'application s'est arrêtée. Sorry...")
    'boîte de dialogue d'avertissement
    Exit Sub
    'sortie macro (sert à rien ici)
End Sub
Private Function envoiMail(ByVal garde As String)
'fonction ayant un paramètre texte
    Dim f As Worksheet
    'définition d'une variable feuille
    Dim w As Window
    'définition d'une variable fenêtre
    Dim txt As String, objMsg As String
    Dim lng As Integer, col As Integer, nbf As Integer
    Dim ok As Boolean
    
    lng = 10
    col = 2
    
    ok = True
    nbf = 0
    'on initialise les variables
    
    txt = Cells(lng, col)
    'valeur de la cellule B10 : pourquoi ne pas le mettre en clair ?
    Set w = Windows(1)
    'W est la fenêtre d'index 1
    
    ThisWorkbook.Sheets(garde).Copy
    'copier la feuille du nom transmis semble pas servir par la suite
    'ne sert peut-être que la première fois
    Set c = Workbooks.Item(Workbooks.Count)
    'c est la dernier classeur ouvert
    For Each f In w.SelectedSheets
    'pour chaque feuille des feuilles sélectionnées dans la fenêtre 1
        If f.Name <> garde Then
        'si le nom de l'onglet est différent de celui transmis
            f.Copy after:=Workbooks(c.Name).Sheets(garde)
            'copier cette feuille dans le classeur déinit en c
            'après la feuille de nom transmis
        End If
        nbf = nbf + 1
        'ajouter 1 à nbf
    Next
    'feuille suivante
    If nbf > 8 Then
    'si nbf est supérieur à 8, alors
        If MsgBox("T'as sélectionné beaucoup onglets. C'est peut-être voulu, mais peut-être pas. Envoyer quand même le mail ?", vbYesNo) = vbNo Then
        'si la réponse à la boîte de dialogue est non, alors
            ok = False
            'variable OK à faux
        End If
    End If
    If ok Then
    'si la variable OK est à Vrai
        SupprimeToutCodeEtFormulaire c.Name
        'encore un appel à une macro avec le nom du classeur de la variable c
        'en paramètre
        For Each f In Workbooks(c.Name).Application.Worksheets
        'pour chaque feuille du classeur c
        'j'avoue ne pas savoir l'utilité de la propriété Application ici
            If f.Name = garde Then
            'Si le nom de la feuille est celui transmis, alors
                f.Cells(lng, col).Value = txt
                'la valeur de la cellule B10 est celle sauvegardée dans txt
                'lng et col sont des variables, pour pouvoir éventuellement les
                'modifier, sans en oublier
            End If
            f.Protect Password:="bluKwerhT93pOO20093"
            'protéger la feuille en cours avec le mot de passe
        Next
        'feuille suivante
        objMsg = [B45] & " --- semaine " & [F8]
        'initialisation de la variable
        'Nota : [B45] est équivalent à Range("B45").value
        Workbooks(c.Name).SendMail Split([E39], ","), objMsg, True
        'on envoie le classeur c à chacun des destinataire (séparés par virgule)
        'avec en objet : [B45] & " --- semaine " & [F8]
    End If
    c.Saved = True
    c.Close
    'fermer c en le sauvegardant
    If ok Then
        envoiMail = True
    Else
        envoiMail = False
    End If
    ' envoiMail=ok urait été plus court
End Function
Private Sub SupprimeToutCodeEtFormulaire(NomClasseur As String)
'macro qui demande un paramètre texte. Donc vraisemblablement appelée par
'une autre macro
    Dim VBComp As Object
    Dim VBComps As Object
    
    Set VBComps = Workbooks(NomClasseur).VBProject.VBComponents
    
    For Each VBComp In VBComps
    'pour chacun des modules du classeur
    'si son type=100(? module de classe, peut-être) on supprime les lignes de code
    'de la 1 à la dernière, sinon on supprime le module
        Select Case VBComp.Type
            Case 100
                With VBComp.CodeModule
                    .DeleteLines 1, .CountOfLines
                End With
        Case Else
            VBComps.Remove VBComp
        End Select
    Next VBComp
End Sub
A+
 

TheLio

XLDnaute Accro
Re : [VBA] Commenter code existant

Merci Gorfael, pour répondre aux questions sans réponse, voilà l'usine trouvé dans le seul et unique module.

Code:
Option Explicit

Public prop_jour As Date

Sub MettreEnMinuscule()
    Dim rg As Range
    Dim c
    Dim feuille As String
    
    feuille = ActiveSheet.Name
    With Worksheets(feuille)
        Set rg = Range("A7:Z400")
    End With
    If Not rg Is Nothing Then
        For Each c In rg
            If Not IsNumeric(c) Then
            If Left(c.Formula, 1) <> "=" And Left(c.Formula, 1) <> "+" Then
                Application.EnableEvents = False
                'Pour avoir lettre majuscule à chaque mot
                'c.Value = Application.WorksheetFunction.Proper(c)
                'pour avoir seulement premiere lettre en majuscule
                c.Value = UCase(Left(c, 1)) & LCase(Right(c, Len(c) - 1))
            End If
            Application.EnableEvents = True
            End If
        Next
    End If
    Set rg = Nothing
End Sub

Public Function rouleau(semaine As Integer) As Date
    Dim txt As String
    txt = get_lundi_s(semaine, "fr")
    rouleau = prop_jour
End Function

' Fonction qui retourne le numéro du jour de l'année
'
' @param    object      Dates       La date voulue
' @return   integer                 Le numéro du jour
'
Function numJour(Dates)
  numJour = Dates - DateSerial(Year(Dates) - 1, 12, 31)
End Function

' Fonction qui retourne le numéro de semaine
'
' @param    object      Dates       La date voulue
' @return   integer                 Le numéro de la semaine
'
Function numSemaine(Dates As Date) As Integer
    Dim semaine As Integer
    semaine = Int((Dates - DateSerial(Year(Dates), 1, 1) + _
        ((Weekday(DateSerial(Year(Dates), 1, 1)) + 1) _
        Mod 7) - 3) / 7) + 1
    If semaine = 0 Then
        semaine = numSemaine(DateSerial(Year(Dates) - 1, 12, 31))
    ElseIf semaine = 53 And (Weekday(DateSerial(Year(Dates), 12, 31)) - 1) _
        Mod 7 <= 3 Then
        semaine = 1
    End If
    numSemaine = semaine
End Function

' Fonction qui retourne le lundi de la semaine en fonction du jour
'
' @param    object      jour        La date courante
' @param    string      langue      La langue qu'on veut afficher
' @return   integer                 Le lundi de la semaine
'
Public Function get_lundi_j(jour As Date, langue As String) As String
    Dim semaine, nums As Integer
    Dim mois, annee As String
    Dim dimanche As Date
    
    nums = numSemaine(jour)
    ' On tourne tant qu'on est dans la même semaine
    While nums = numSemaine(jour)
        ' On recule chaque fois d'un jour
        jour = jour - 1
    Wend
    ' Lorsqu'on sort, on est dimanche, donc on rajoute 1 au jour
    jour = jour + 1
    dimanche = jour + 6
    get_lundi_j = get_txt(langue, jour, dimanche)
    ' On modifie les onglets
    set_nomOnglet jour, "fr"
    prop_jour = jour
End Function

' Fonction qui donne les bonnes dates aux onglets
'
' @param    object      jour    Le lundi de la semaine
' @param    string      langue  La langue qu'on veut
'
Public Sub set_nomOnglet(ByVal jour As Date, ByVal langue As String)
    On Error Resume Next
    
    Dim nom, ancien As String
    Dim i, pos As Integer
    Dim ongl(8) As String
    Dim livr(8) As String
    Dim pas(8) As String
    Dim ok As Boolean
    Dim base As Date
    Dim feuille, t, s, p
    
    ongl(0) = "Gourmador"
    livr(0) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(0) = "1,1,1,1,1,1"
    ongl(1) = "Prodague"
    livr(1) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(1) = "1,1,1,1,1,1"
    ongl(2) = "Léguriviera"
    livr(2) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(2) = "1,1,1,1,1,1"
    ongl(3) = "Cremo"
    livr(3) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(3) = "1,1,1,1,1,1"
    ongl(4) = "Bolay"
    livr(4) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(4) = "1,1,1,1,1,1"
    ongl(5) = "Frisco"
    livr(5) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(5) = "1,1,1,1,1,1"
    ongl(6) = "Binggeli"
    livr(6) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(6) = "1,1,1,1,1,1"
    ongl(7) = "BB"
    livr(7) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(7) = "1,1,1,0,0,0"
    'ongl(8) = "Jaton-Gavillet"
    'livr(8) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    'pas(8) = "1,1,1,1,1,1"
    
    base = jour
    ancien = ""
    ' On parcourt toutes les feuilles du classeur
    For Each feuille In ThisWorkbook.Sheets
        t = Split(feuille.Name, " ")
        If t(0) <> ancien Then
            pos = 0
            jour = base
        End If
        ok = False
        ' On check si c'est une feuille dont on veut changer le nom
        For i = 0 To UBound(ongl)
            If t(0) = ongl(i) Then
                ok = True
                Exit For
            End If
        Next
        ' Si c'est le cas, on change le nom
        On Error GoTo nom_court
        If (ok) Then
            s = Split(livr(i), ",")
            p = Split(pas(i), ",")
            nom = t(0) & " " & s(pos) & " " & Day(jour) & " " & get_mois(langue, Month(jour))
            feuille.Name = nom
            jour = jour + Int(p(pos))
            pos = pos + 1
        End If
        ancien = t(0)
    Next
' En cas d'erreur, c'est sûrement que le nom de la feuille est trop long
' Donc on ne met pas le jour, mais juste le numéro du jour et le mois
    Exit Sub
nom_court:
    nom = t(0) & " " & Day(jour) & " " & get_mois(langue, Month(jour))
    feuille.Name = nom
    Resume Next
End Sub

' Fonction qui retourne le lundi de la semaine en fonction du numéro
' de semaine
'
' @param    integer     semaine     Le numéro de semaine
' @param    string      langue      La langue qu'on veut afficher
' @return   integer                 Le lundi de la semaine
'
Public Function get_lundi_s(semaine As Integer, langue As String) As String
    Dim txt As String
    Dim nums As Integer
    Dim jour As Date
    Dim dimanche As Date
    
    If semaine > 53 Or semaine = 0 Then semaine = 53
    If semaine < 1 Then semaine = 1
    
    jour = Date
    nums = numSemaine(jour)
    If semaine >= nums Then
        While semaine > numSemaine(jour)
            jour = jour + 6
        Wend
        get_lundi_s = get_lundi_j(jour, langue)
    Else
        While semaine < numSemaine(jour)
            jour = jour - 6
        Wend
        get_lundi_s = get_lundi_j(jour, langue)
    End If
End Function

' Fonction qui retourne le texte concernant la semaine
'
' @param    string      langue      La langue qu'on veut afficher
' @param    object      jour        La date du lundi de la semaine
' @param    object      dimanche    La date du dimanche de la semaine
' @return   string                  Le texte explicatif (du ... au ...)
'
Private Function get_txt(langue As String, jour As Date, dimanche As Date) As String
    Dim txt, mois, annee As String
    
    ' On affiche le mois de lundi si celui-ci n'est pas dans le même
    ' que dimanche
    mois = ""
    If Month(jour) <> Month(dimanche) Then
        mois = " " & get_mois(langue, Month(jour))
    End If
    ' On affiche l'année de lundi si celle-ci n'est pas dans la même
    ' que dimanche
    annee = ""
    If Year(jour) <> Year(dimanche) Then
        annee = " " & Year(jour)
    End If
    ' On créé la string de retour
    If langue = "de" Then
        txt = "bis Montag, der " & Day(jour) & "." & mois & annee & " zu Sonntag, der " & Day(dimanche) & ". " & get_mois(langue, Month(dimanche)) & " " & Year(dimanche)
    Else
        txt = "du lundi " & Day(jour) & mois & annee & " au dimanche " & Day(dimanche) & " " & get_mois(langue, Month(dimanche)) & " " & Year(dimanche)
    End If
    
    get_txt = txt
End Function

' Fonction qui retourne le nom du mois
'
' @param    string      langue      La langue dont on veut les mois
' @param    integer     numMois     Le numéro du mois
' @return   string                  Le nom du mois
'
Private Function get_mois(langue As String, numMois As Integer) As String
    Dim i As Integer
    Dim nomMois(12) As String
    
    If langue = "de" Then
        nomMois(1) = "Januar"
        nomMois(2) = "Februar"
        nomMois(3) = "März"
        nomMois(4) = "April"
        nomMois(5) = "May"
        nomMois(6) = "Juni"
        nomMois(7) = "July"
        nomMois(8) = "August"
        nomMois(9) = "September"
        nomMois(10) = "October"
        nomMois(11) = "November"
        nomMois(12) = "Dezember"
    Else
        nomMois(1) = "janvier"
        nomMois(2) = "février"
        nomMois(3) = "mars"
        nomMois(4) = "avril"
        nomMois(5) = "mai"
        nomMois(6) = "juin"
        nomMois(7) = "juillet"
        nomMois(8) = "août"
        nomMois(9) = "septembre"
        nomMois(10) = "octobre"
        nomMois(11) = "novembre"
        nomMois(12) = "décembre"
    End If
    
    get_mois = nomMois(numMois)
End Function

A++
TheLIo
 

Gorfael

XLDnaute Barbatruc
Re : [VBA] Commenter code existant

Salut TheLio
Code:
Option Explicit
Public prop_jour As Date
'idem que sur l'autre module, mais là, pour Excel en entier
Sub MettreEnMinuscule()
    Dim rg As Range
    Dim c
    Dim feuille As String
    
    feuille = ActiveSheet.Name
    With Worksheets(feuille)
        Set rg = Range("A7:Z400")
    End With
' si l'instruction était Set rg = .Range("A7:Z400")
'ça remplacerait Worksheets(feuille).Range("A7:Z400")
    If Not rg Is Nothing Then
    'si rg n'est pas vide, alors
        For Each c In rg
        'pour chaque cellule de la plage rg
            If Not IsNumeric(c) Then
            'si c'est n'est pas numérique alors
            If Left(c.Formula, 1) <> "=" And Left(c.Formula, 1) <> "+" Then
            'si la formule de la cellule ne commence ni par = ni par + alors
                Application.EnableEvents = False
                'on bloque les évènements
                c.Value = UCase(Left(c, 1)) & LCase(Right(c, Len(c) - 1))
                'cellule en court = 1re lettre en maj et le reste en min
            End If
            Application.EnableEvents = True
            'remise en route des évènements
            End If
        Next
        'suivant
    End If
    Set rg = Nothing
    ' vidange de rg - sert à rien ici
End Sub
Public Function rouleau(semaine As Integer) As Date
    Dim txt As String
    txt = get_lundi_s(semaine, "fr")
    'je ne vois vraiment pas à quoi sert txt, puisqu'on ne l'exploite pas
    'autant supprimer la fonction et mettre le code
    'ou un call direct avec une transformation Function en Sub
    rouleau = prop_jour
    '? rouleau ?
End Function
Function numJour(Dates)
  numJour = Dates - DateSerial(Year(Dates) - 1, 12, 31)
  'date - entier représentant le 31 décembre de l'année précédente
  'donne le nombre de jour depuis le 1er janvier de l'année en cours
End Function
Function numSemaine(Dates As Date) As Integer
    Dim semaine As Integer
    semaine = Int((Dates - DateSerial(Year(Dates), 1, 1) + _
        ((Weekday(DateSerial(Year(Dates), 1, 1)) + 1) _
        Mod 7) - 3) / 7) + 1
    If semaine = 0 Then
        semaine = numSemaine(DateSerial(Year(Dates) - 1, 12, 31))
    ElseIf semaine = 53 And (Weekday(DateSerial(Year(Dates), 12, 31)) - 1) _
        Mod 7 <= 3 Then
        semaine = 1
    End If
    numSemaine = semaine
'ce calcul du numéro de semaine peut être simplifié
'numSemaine = CInt(Format(Date, "ww"))
End Function
Public Function get_lundi_j(jour As Date, langue As String) As String
    Dim semaine, nums As Integer
    Dim mois, annee As String
    Dim dimanche As Date
    'ces définitions sont fausses (semaine mois sont déclarés en variant)
    'Dim semaine As Integer, nums As Integer
    'Dim mois As String, annee As String
    
    nums = numSemaine(jour)
    ' On tourne tant qu'on est dans la même semaine
    While nums = numSemaine(jour)
        ' On recule chaque fois d'un jour
        jour = jour - 1
    Wend
    ' Lorsqu'on sort, on est dimanche, donc on rajoute 1 au jour
    jour = jour + 1
    
    'on peut remplacer le code ci-dessus par :
    'jour =jour + 1 - Weekday(jour, vbMonday)
    'plus rapide que la boucle non ?
    dimanche = jour + 6
    get_lundi_j = get_txt(langue, jour, dimanche)
    
    ' On modifie les onglets
    set_nomOnglet jour, "fr"
    prop_jour = jour
End Function
Public Sub set_nomOnglet(ByVal jour As Date, ByVal langue As String)
    On Error Resume Next
    
    Dim nom, ancien As String
    Dim i, pos As Integer
    Dim ongl(8) As String
    Dim livr(8) As String
    Dim pas(8) As String
    Dim ok As Boolean
    Dim base As Date
    Dim feuille, t, s, p
    
    ongl(0) = "Gourmador"
    livr(0) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(0) = "1,1,1,1,1,1"
    ongl(1) = "Prodague"
    livr(1) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(1) = "1,1,1,1,1,1"
    ongl(2) = "Léguriviera"
    livr(2) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(2) = "1,1,1,1,1,1"
    ongl(3) = "Cremo"
    livr(3) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(3) = "1,1,1,1,1,1"
    ongl(4) = "Bolay"
    livr(4) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(4) = "1,1,1,1,1,1"
    ongl(5) = "Frisco"
    livr(5) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(5) = "1,1,1,1,1,1"
    ongl(6) = "Binggeli"
    livr(6) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(6) = "1,1,1,1,1,1"
    ongl(7) = "BB"
    livr(7) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    pas(7) = "1,1,1,0,0,0"
    'ongl(8) = "Jaton-Gavillet"
    'livr(8) = "Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"
    'pas(8) = "1,1,1,1,1,1"
'comme d'hab, on multiplie les instructions livr n'a pas besoin d'être une
'variable tableau, puisque c'est le même texte
    base = jour
    ancien = ""
    ' On parcourt toutes les feuilles du classeur
    For Each feuille In ThisWorkbook.Sheets
    'pour chaque feuille du classeur contenant cette macro
        t = Split(feuille.Name, " ")
        If t(0) <> ancien Then
            pos = 0
            jour = base
        End If
        ok = False
        ' On check si c'est une feuille dont on veut changer le nom
        For i = 0 To UBound(ongl)
            If t(0) = ongl(i) Then
                ok = True
                Exit For
            End If
        Next
        ' Si c'est le cas, on change le nom
        On Error GoTo nom_court
        If (ok) Then
            s = Split(livr(i), ",")
            p = Split(pas(i), ",")
            nom = t(0) & " " & s(pos) & " " & Day(jour) & " " & get_mois(langue, Month(jour))
            feuille.Name = nom
            jour = jour + Int(p(pos))
            pos = pos + 1
        End If
        ancien = t(0)
    Next
    
    Exit Sub
    'fin macro
nom_court:
    nom = t(0) & " " & Day(jour) & " " & get_mois(langue, Month(jour))
    feuille.Name = nom
    Resume Next
    'on retourne à la ligne qui suit celle qui a déclenché l'erreur
End Sub
Certaines m'ont semblé facile (correspond à des codes déjà expliqués)
à mon avis, c'est beaucoup de fonctions pour rien
voir l'aide de la fonction split on transforme une chaine en tableau

mais j'ai assez la flemme. il utilise des function, alors que le code dans la macro qui utilise la function serai plus efficace

Ce que je vais dire n'engage que moi, mais refaire le code en le simplifiant ne serait pas une mauvaise idée : c'est un code avec tellement de renvois, que je pense qu'il est fait pour compliquer la tâche de celui qui veut le modifier. Mais comme il fonctionne...

A+
 

Statistiques des forums

Discussions
312 506
Messages
2 089 122
Membres
104 039
dernier inscrit
ERe