Erreur formule & Macro dates
Résolu/Fermé
A voir également:
- Erreur formule & Macro dates
- Erreur 0x80070643 - Accueil - Windows
- Formule si et - Guide
- Formule excel pour additionner plusieurs cellules - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Formule excel moyenne - Guide
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
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.
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.
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
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 :
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!
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!
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
19 août 2016 à 11:10
Bonjour,
Pour ta seconde question, que te donnes :
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 :
Et tester avec un
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) Thenpar exemple...
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
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 :
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
J'ai essayé un truc dans le genre :
Bon appétit.
Ensuite, la formule qu'il me sort est complètement fausse, par exemple pour aujourd'hui il m'a écrit :
Deux fois le même jour, et un dimanche qui sort... :(
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... :(
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
19 août 2016 à 12:42
Ou as tu vu que je te parlais de Weekday???
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
19 août 2016 à 12:50
Avec un test sur Format(madate, "dddd") comme indiqué plus haut :
Que l'on peut, maintenant, placer dans une boucle :
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
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 :
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 :(
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 :(
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
19 août 2016 à 14:18
formuleJ8
C'est quoi encore que ce truc la : formuleJ8?????
Teste simplement ça :
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
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 :
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
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
23 août 2016 à 11:35
Bonjour, <== si c'est important!
Plusieurs possibilités.
En voici une avec la même boucle.
A noter, dans ton cas, on aurait mieux fait d'utiliser Do...While
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