Erreur formule & Macro dates

Résolu/Fermé
Vaalrhona - 18 août 2016 à 16:14
 Vaalrhona - 24 août 2016 à 11:27
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 ?
A voir également:

5 réponses

jordane45 Messages postés 38305 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
18 août 2016 à 16:21
Bonjour,
commence par lire la documentation sur la fonction "format"
https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/format-function-visual-basic-for-applications?redirectedfrom=MSDN

Tu verras qu'il te manque des quotes.

0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
18 août 2016 à 16:28
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 août 2016 à 11:10
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Vaalrhona
19 août 2016 à 11:26
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 août 2016 à 12:42
Ou as tu vu que je te parlais de Weekday???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 août 2016 à 12:50
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Vaalrhona
19 août 2016 à 14:18
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751 > Vaalrhona
23 août 2016 à 11:35
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
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