Erreur formule & Macro dates

Résolu
Vaalrhona -  
 Vaalrhona -
Bonjour,

Ok, nouveau problème !
ActiveSheet.Range("Q41").FormulaLocal = "=O:O+'" & feuille7 & "'!O:O+'" & feuille6 & "'!O:O+'" & feuille5 & "'!O:O+'" & feuille4 & "'!O:O+'" & feuille3 & "'!O:O+'" & feuille2 & "'!O:O+'" & feuille1 & "'!O:O"


"Erreur définie par l'application ou pas l'objet", qu'il me dit.

Une idée pour corriger ?

De même,
Dim feuille1 As String
feuille1 = Format(Date - 1, dd - mm)
Dim feuille2 As String
feuille1 = Format(Date - 2, dd - mm)
Dim feuille3 As String
feuille1 = Format(Date - 3, dd - mm)

Dim feuille4 As String
feuille1 = Format(Date - 4, dd - mm)

Dim feuille5 As String
feuille1 = Format(Date - 5, dd - mm)

Dim feuille6 As String
feuille1 = Format(Date - 6, dd - mm)

Dim feuille7 As String
feuille1 = Format(Date - 7, dd - mm)


On est d'accord, je demande les dates des 7 derniers jours.
Maintenant, j'aimerais mettre en place un truc pour exclure le weekend, et compter uniquement les jours ouvrés. Une idée ?

5 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    En complément de la réponse de Jordane (salutations au passage), tu n'alimentes que ta variable feuille1...

    Essaie ce test :
    Sous VBE taper Ctrl+G pour afficher la fenêtre d'exécution.

    Dans la fenêtre de code placer ce test :
    Sub test()
    Dim feuille1 As String
    feuille1 = Format(Date - 1, "dd - mm")
    Dim feuille2 As String
    feuille2 = Format(Date - 2, "dd - mm")
    Dim feuille3 As String
    feuille3 = Format(Date - 3, "dd - mm")
    
    Dim feuille4 As String
    feuille4 = Format(Date - 4, "dd - mm")
    
    Dim feuille5 As String
    feuille5 = Format(Date - 5, "dd - mm")
    
    Dim feuille6 As String
    feuille6 = Format(Date - 6, "dd - mm")
    
    Dim feuille7 As String
    feuille7 = Format(Date - 7, "dd - mm")
    
    Debug.Print "=O:O+'" & feuille7 & "'!O:O+'" & feuille6 & "'!O:O+'" & feuille5 & "'!O:O+'" & feuille4 & "'!O:O+'" & feuille3 & "'!O:O+'" & feuille2 & "'!O:O+'" & feuille1 & "'!O:O"
    'ActiveSheet.Range("Q41").FormulaLocal = "=O:O+'" & feuille7 & "'!O:O+'" & feuille6 & "'!O:O+'" & feuille5 & "'!O:O+'" & feuille4 & "'!O:O+'" & feuille3 & "'!O:O+'" & feuille2 & "'!O:O+'" & feuille1 & "'!O:O"
    End Sub
    


    Lancer la macro et comparer la chaine qui apparait dans la fenêtre d'exécution avec la formule.

    Par exemple tout à l'heure tu me dis que tes feuilles s'appellent 18-07 sans espace.
    Là, ta fonction format les définit comme 18 - 07...

    Vérifie donc le résultat de mon test avec ta vraie formule et...corrige!
    0
    1. Vaalrhona
       
      Effectivement, merci maintenant il ne me met plus d'espace.
      Du coup pour ma deuxième question ?
      En fait les feuilles ne sont pas créées les weekends, uniquement les jours ouvrés, comment je fais pour exclure le samedi et dimanche ?
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pour ta seconde question, que te donnes :
    MsgBox Format(Date - 1, "dddd")


    A partir de cette constatation, un simple test If te suffira à évincer les samedi et dimanche.

    Pour les jours fériés, c'est plus délicat...
    Il te faut insérer ces deux fonctions dans ton module :
    Public Function EstJourFerie(ByVal laDate As Date, Optional ByVal EstPentecoteFerie As Boolean = True) As Boolean
    'Détermine si la date passée en argument est un jour férié (en France) ou non :
    '   101 = 1er Janvier - 501 = 1er Mai - 508 = 8 Mai - 714 = 14 Juillet
    '   815 = 15 Août - 1101 = 1er Novembre - 1111 = 11 Novembre - 1225 = 25 Décembre
    '   dPa = Lundi de Pâques - dAs = Jeudi de l'Ascension - dPe = Lundi de Pentecôte
    'Remarque : Le lundi de Pentecôte est un jour férié mais parfois non chômé (EstPentecoteFerie = False dans ce cas)
    'Philben - v1.0 - 2012 - Free to use
      Static Annee As Integer, dPa As Date, dAs As Date, dPe As Date, bPe As Boolean
       Dim a As Integer, m As Integer, j As Integer
    
       a = Year(laDate): m = Month(laDate): j = Day(laDate)
       Select Case m * 100 + j
       Case 101, 501, 508, 714, 815, 1101, 1111, 1225
          EstJourFerie = True
       Case 323 To 614   '323: Date mini Lundi de Pâques - 614 : Date maxi Lundi de Pentecôte
         If a <> Annee Or EstPentecoteFerie <> bPe Then
             Annee = a: dPa = Paques(a) + 1: dAs = dPa + 38
             bPe = EstPentecoteFerie: If bPe Then dPe = dPa + 49 Else dPe = #1/1/100#
          End If
          Select Case DateSerial(a, m, j): Case dPa, dAs, dPe: EstJourFerie = True: End Select
       End Select
    End Function
    Public Function Paques(ByVal an As Integer) As Date
    'Calcul de la date du dimanche de Pâques à partir de l'année 325
    'Performance par million d'appel :
    '   - Entre 325 et 1582 et entre 1900 et 2099   => 1/4 de seconde
    '   - Année supérieure à 1582 hors 1900 - 2099 => 1/2 de seconde
    'Philben - v1.0 - Free to use
      Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, f As Integer
       If an < 10000 Then    'Limite supérieure des dates sous Access (31 décembre 9999)
         Select Case an
          Case 1900 To 2099    'Algorithme de Carter
            a = (204 - 11 * (an Mod 19)) Mod 30 + 22
             Paques = DateSerial(an, 3, a + 6 + (a > 49) - (an + an \ 4 + a + (a > 49)) Mod 7)
          Case Is > 1582    'Proposé en 1876 dans la revue Nature (dérivé de l'algorithme de Delambre)
            a = an Mod 19: b = an \ 100: c = an Mod 100
             d = (19 * a + b - b \ 4 - (b - (b + 8) \ 25 + 1) \ 3 + 15) Mod 30
             e = (32 + 2 * (b Mod 4) + 2 * (c \ 4) - d - c Mod 4) Mod 7
             f = d + e - 7 * ((a + 11 * d + 22 * e) \ 451) + 114
             Paques = DateSerial(an, f \ 31, f Mod 31 + 1)
          Case Is > 324    'Algorithme de Oudin pour les dates juliennes < 1583 décrit par Claus Tondering
            a = (19 * (an Mod 19) + 15) Mod 30
             Paques = DateSerial(an, 3, 28 + a - (an + an \ 4 + a) Mod 7)
          End Select
       End If
    End Function


    Et tester avec un
    If EstJourFerie(Date - 2) Then
    par exemple...
    0
    1. Vaalrhona
       
      Je n'ai pas besoin d'exclure les jours fériés, donc ça c'est bon x)
      Par contre, je n'ai pas compris ce que tu as écrit avec le Msgbox...
      Pour le if, j'y avais effectivement pensé.
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Vaalrhona
         
        Par contre, je n'ai pas compris ce que tu as écrit avec le Msgbox...
        C'est juste un test à faire pour voir comment gérer ton souci de week end...

        Lance ce test depuis un module :
        Sub test()
          MsgBox Format(Date - 1, "dddd") & " - " & Format(Date - 2, "dddd") & " - " & Format(Date - 3, "dddd") & " - " & Format(Date - 4, "dddd") & " - " & Format(Date - 5, "dddd")
          MsgBox "Autrement dit, Format(madate, dddd) renvoie le jour de la semaine de ma date"
        End Sub
        0
  3. Vaalrhona
     
    J'ai essayé un truc dans le genre :
    feuille1 = Format(Date - 2, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille1) = 7 Then
    feuille1 = Format(Date - 4, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille1) = 6 Then
    feuille1 = Format(Date - 3, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille2 = Format(Date - 3, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille2) = 7 Then
    feuille2 = Format(Date - 5, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille2) = 6 Then
    feuille2 = Format(Date - 4, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille2 = feuille1 Then
    feuille2 = Format(Date - 6, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille3 = Format(Date - 4, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille3) = 7 Then
    feuille3 = Format(Date - 6, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille3) = 6 Then
    feuille3 = Format(Date - 5, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille3 = feuille2 Then
    feuille3 = Format(Date - 7, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille4 = Format(Date - 5, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille4) = 7 Then
    feuille4 = Format(Date - 7, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille4) = 6 Then
    feuille4 = Format(Date - 6, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille4 = feuille3 Then
    feuille4 = Format(Date - 8, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille5 = Format(Date - 6, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille5) = 7 Then
    feuille5 = Format(Date - 8, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille5) = 6 Then
    feuille5 = Format(Date - 7, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille5 = feuille4 Then
    feuille5 = Format(Date - 9, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille6 = Format(Date - 7, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille6) = 7 Then
    feuille6 = Format(Date - 9, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille6) = 6 Then
    feuille6 = Format(Date - 8, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille6 = feuille5 Then
    feuille6 = Format(Date - 10, "dd-mm", firstdayofweek = vbMonday)
    End If

    feuille7 = Format(Date - 8, "dd-mm", firstdayofweek = vbMonday)
    If Weekday(feuille7) = 7 Then
    feuille7 = Format(Date - 10, "dd-mm", firstdayofweek = vbMonday)
    ElseIf Weekday(feuille7) = 6 Then
    feuille7 = Format(Date - 9, "dd-mm", firstdayofweek = vbMonday)
    ElseIf feuille7 = feuille6 Then
    feuille7 = Format(Date - 11, "dd-mm", firstdayofweek = vbMonday)
    End If


    Bon appétit.

    Ensuite, la formule qu'il me sort est complètement fausse, par exemple pour aujourd'hui il m'a écrit :
    =O:O+'08-08'!O:O+'11-08'!O:O+'11-08'!O:O+'14-08'!O:O+'15-08'!O:O+'16-08'!O:O+'17-08'!O:O


    Deux fois le même jour, et un dimanche qui sort... :(
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Ou as tu vu que je te parlais de Weekday???
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Avec un test sur Format(madate, "dddd") comme indiqué plus haut :
    Sub test_1()
    Dim maFormule As String
    Dim Suffix As String
    
    Suffix = "'!O:O+'"
    maFormule = "=O:O+'"
    If Format(Date - 1, "dddd") <> "dimanche" And Format(Date - 1, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 1, "dd-mm") & Suffix
    End If
    If Format(Date - 2, "dddd") <> "dimanche" And Format(Date - 2, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 2, "dd-mm") & Suffix
    End If
    If Format(Date - 3, "dddd") <> "dimanche" And Format(Date - 3, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 3, "dd-mm") & Suffix
    End If
    If Format(Date - 4, "dddd") <> "dimanche" And Format(Date - 4, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 4, "dd-mm") & Suffix
    End If
    If Format(Date - 5, "dddd") <> "dimanche" And Format(Date - 5, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 1, "dd-mm") & Suffix
    End If
    If Format(Date - 6, "dddd") <> "dimanche" And Format(Date - 6, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 6, "dd-mm") & Suffix
    End If
    If Format(Date - 7, "dddd") <> "dimanche" And Format(Date - 7, "dddd") <> "samedi" Then
        maFormule = maFormule & Format(Date - 7, "dd-mm") & Suffix
    End If
    
    Debug.Print Left(maFormule, Len(maFormule) - 2)
    End Sub


    Que l'on peut, maintenant, placer dans une boucle :

    Sub Test_2()
    Dim maFormule As String
    Dim Suffix As String
    Dim i As Integer
    
    Suffix = "'!O:O+'"
    maFormule = "=O:O+'"
    For i = 1 To 7
        If Format(Date - i, "dddd") <> "dimanche" And Format(Date - i, "dddd") <> "samedi" Then
            maFormule = maFormule & Format(Date - i, "dd-mm") & Suffix
        End If
    Next i
    Debug.Print Left(maFormule, Len(maFormule) - 2)
    End Sub

    0
    1. Vaalrhona
       
      J'avais trouvé ça sur le web, je voulais tester par moi-même :(

      J'ai repris ton code, maintenant j'ai modifié ma ligne :

      ActiveSheet.Range("Q41").FormulaLocal = formuleJ8


      Parce que je suppose que c'est un truc dans le genre qu'il faut faire, mais ça me sort une erreur "définie par l'application ou par l'objet".

      Je suis vraiment pas douée :(
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Vaalrhona
       
      formuleJ8
      C'est quoi encore que ce truc la : formuleJ8?????

      Teste simplement ça :
      Sub Test_formule()
      Dim maFormule As String
      Dim Suffix As String
      Dim i As Integer
      
      Suffix = "'!O:O+'"
      maFormule = "=O:O+'"
      For i = 1 To 7
          If Format(Date - i, "dddd") <> "dimanche" And Format(Date - i, "dddd") <> "samedi" Then
              maFormule = maFormule & Format(Date - i, "dd-mm") & Suffix
          End If
      Next i
      ActiveSheet.Range("Q41").FormulaLocal = Left(maFormule, Len(maFormule) - 2)
      End Sub
      0
    3. Vaalrhona
       
      formuleJ8 est simplement le nom que j'ai donné à la formule plutôt que MaFormule.

      Ca fonctionne, mais ça me calcule seulement sur les 5 derniers jours.

      Je voudrais que le week end soit exclus, mais qu'il calcule sur les 7 dernières feuilles quand même...

      Aujourd'hui on est Mardi, je voudrais que ça fasse :

      O:O(Lundi)+Vendredi!O:O+Jeudi!O:O+Mercredi!O:O+Mardi!O:O+Lundi!O:O+Vendredi!O:O+Jeudi!O:O
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Vaalrhona
       
      Bonjour, <== si c'est important!

      Plusieurs possibilités.
      En voici une avec la même boucle.

      Sub Test_formule()
      Dim maFormule As String
      Dim Suffix As String
      Dim i As Integer, CompteurDeJour As Byte
      
      Suffix = "'!O:O+'"
      maFormule = "=O:O+'"
      For i = 1 To 9
          If Format(Date - i, "dddd") <> "dimanche" And Format(Date - i, "dddd") <> "samedi" Then
              CompteurDeJour = CompteurDeJour + 1
              maFormule = maFormule & Format(Date - i, "dd-mm") & Suffix
          End If
          If CompteurDeJour = 7 Then Exit For
      Next i
      ActiveSheet.Range("Q41").FormulaLocal = Left(maFormule, Len(maFormule) - 2)
      End Sub


      A noter, dans ton cas, on aurait mieux fait d'utiliser Do...While
      0
    5. Vaalrhona
       
      Pardon, oui, Bonjour ><

      Avec ta formule, il ne m'affiche carrément plus que 3 jours :(

      J'ai essayé de faire un Do While mais comme je suis une quiche tout a planté.
      0