Erreur sur utilisation d'un array avec WorksheetFunction
Bonjour,
Je sèche depuis un moment sur une erreur d’exécution '1004' "Erreur définie par l'application ou l'objet" sur l'utilisation du code suivant :
Sub Calc_j_ouvre()
Dim date_deb, heure_deb, date_fin, heure_fin As Date
Dim feries
date_heure_deb = #2/19/2013 11:00:00 AM#
date_heure_fin = #2/19/2013 12:00:00 PM#
date_deb = DateValue(date_heure_deb)
date_fin = DateValue(date_heure_fin)
feries = joursferies(CVar(Year(date_deb)))
nb_ouvre = WorksheetFunction.NetworkDays(date_deb, date_fin, feries) '<-- ERREUR 1004 ICI
MsgBox nb_ouvre, vbOKOnly, "nb jours ouvrés"
End Sub
Public Function fPaques(An%) As Date
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
Dim h As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim p As Integer
a% = An% Mod 19
b% = An% \ 100
c% = An% Mod 100
d% = b% \ 4
e% = b% Mod 4
f% = (b% + 8) \ 25
g% = (b% - f% + 1) \ 3
h% = (19 * a% + b% - d% - g% + 15) Mod 30
i% = c% \ 4
k% = c% Mod 4
l% = (32 + 2 * e% + 2 * i% - h% - k%) Mod 7
m% = (a% + 11 * h% + 22 * l%) \ 451
n% = (h% + l% - 7 * m% + 114) \ 31
p% = (h% + l% - 7 * m% + 114) Mod 31
fPaques = DateSerial(An%, n%, p% + 1)
End Function
Public Function joursferies(annee As Integer) As Variant
Dim cal As Variant
paques = fPaques(annee)
cal = Array(DateSerial(annee, 1, 1), paques, paques + 1, paques + 39, paques + 49, paques + 50, _
DateSerial(annee, 5, 1), DateSerial(annee, 5, 8), DateSerial(annee, 7, 14), _
DateSerial(annee, 7, 15), DateSerial(annee, 11, 1), DateSerial(annee, 11, 11), _
DateSerial(annee, 12, 25))
joursferies = cal
End Functiondate_heure_deb et date_heure_fin sont entrés en dur a des fin de test.
Visiblement, si j'exclue la notion de jour férié dans Networkdays, cela fonctionne correctement.
J'en déduit donc que c'est mon array "feries" qui pose problème...
Cependant, selon l'aide excel et MSDN, en VBA je dois pouvoir utiliser un array.
Je ne vois pas pourquoi ça coince...
Merci par avance de votre aide.
PS : J'ai même essayé avec d'autres fonctions, dès que je fait appel à une variable contenant un tableau, ça plante (VLOOKUP...)
Bonjour,
tu utilises une fonction feuille qui veut une référence de plage, la feuille ne connait pas tes variables vba.
A part mettre tes fériés sur une feuille je ne vois pas.
Sub Calc_j_ouvre()
Dim date_deb As Date, heure_deb As Date, date_fin As Date, heure_fin As Date
Dim feries
date_heure_deb = #2/19/2013 11:00:00 AM#
date_heure_fin = #12/19/2013 12:00:00 PM#
date_deb = DateValue(date_heure_deb)
date_fin = DateValue(date_heure_fin)
feries = joursferies(CVar(Year(date_deb)))
For i = 0 To UBound(feries)
[A1].Offset(i) = CDate(feries(i))
Next i
nb_ouvre = WorksheetFunction.NetworkDays(date_deb, date_fin, [Feuil1!feries]) '<-- ERREUR 1004 ICI
MsgBox nb_ouvre, vbOKOnly, "nb jours ouvrés"
End SubOn est obligé d'utiliser une boucle pour coller les fériés sinon, sans Cdate(), des dates ne sont pas reconnues.
La plage A1:A20 est nommée 'feries'
eric
eric
Bonjour,
Merci pour l'aide mais cela me parait étrange qu'on ne puisse pas utiliser un array contenant des dates.
J'ai trouvé à un peu partout des codes VBA faisant appel à des array qui selon les auteurs fonctionnaient...
En les recopiant dans ma version d'excel, la même erreur '1004'
Cela vient probablement du fait que les dates VBA et Excel sont gérées différemment...
En ce qui me concerne j'ai fini par ré-écrire la fonction nb.jour.ouvré (networdays)...
Cela donne le code ci-dessous pour ceux que cela intéresse.
Le calendrier est codé en "dur" mais des dates sont facilement ajoutables ou retirable au niveau du select case.
Public Function nb_jour_ouvre(date_heure_deb As Date, date_heure_fin As Date) As Integer
'date_heure_deb et date_heure_fin doivent contenir un format de date - heure valide de type jj/mm/aaaa hh:mm qui peut être entré dans excel comme un numéro de série de date ou un format texte entre guillemets.
date_deb = DateValue(date_heure_deb)
date_fin = DateValue(date_heure_fin)
Paques = fPaques(CVar(Year(date_deb)))
LunPaques = Format(DateAdd("d", 1, Paques), "ddmm")
Ascension = Format(DateAdd("d", 39, Paques), "ddmm")
LunPentcote = Format(DateAdd("d", 49, Paques), "ddmm")
Date_Boucle = date_deb
Do Until Date_Boucle > date_fin
Select Case Weekday(Date_Boucle, vbMonday)
Case 6, 7
Case Else
Select Case Format(Date_Boucle, "ddmm")
Case LunPaques, Ascension, LunPentcote, "0101", "0105", "0805", _
"1407", "1508", "0111", "1111", "2512"
Case Else
nb_ouvre = nb_ouvre + 1
End Select
End Select
Date_Boucle = Date_Boucle + 1
Loop
nb_jour_ouvre = nb_ouvre
End Function
Public Function fPaques(An%) As Date
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
Dim h As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim p As Integer
a% = An% Mod 19
b% = An% \ 100
c% = An% Mod 100
d% = b% \ 4
e% = b% Mod 4
f% = (b% + 8) \ 25
g% = (b% - f% + 1) \ 3
h% = (19 * a% + b% - d% - g% + 15) Mod 30
i% = c% \ 4
k% = c% Mod 4
l% = (32 + 2 * e% + 2 * i% - h% - k%) Mod 7
m% = (a% + 11 * h% + 22 * l%) \ 451
n% = (h% + l% - 7 * m% + 114) \ 31
p% = (h% + l% - 7 * m% + 114) Mod 31
fPaques = DateSerial(An%, n%, p% + 1)
End FunctionBon, j'ai mis 2 ans pour répondre mais çà y est j'ai une réponse !
Je plaisante ! J'ai eu le même problème ce soir et je suis tombé sur ce sujet, donc j'apporte mon grain de sel
On peut mettre une Array dans la fonction NetworkDays pourvu que celle-ci soit d'abord passée par une variable tableau
Dim cal(1 To 14) As Longou passer la date directement en Long, disons que l'intérêt de la var tableau non-dynamique est de pouvoir passer des dates avec DateSerial tout en ne gardant pas un format variant comme dans l'Array.
Option Base 1
Sub Calc_j_ouvre()
Dim date_deb, heure_deb, date_fin, heure_fin As Date
Dim feries
date_heure_deb = #2/19/2013 11:00:00 AM#
date_heure_fin = #2/19/2013 12:00:00 PM#
date_deb = DateValue(date_heure_deb)
date_fin = DateValue(date_heure_fin)
feries = joursferies(CVar(Year(date_deb)))
nb_ouvre = WorksheetFunction.NetworkDays(date_deb, date_fin, feries) '<--PAS D' ERREUR 1004 ICI
MsgBox nb_ouvre, vbOKOnly, "nb jours ouvrés"
End Sub
Public Function fPaques(An%) As Date
Dim a%, b%, c%, d%, e%, f%, g%, h%, i%, j%, k%, l%, m%, n%, p%
a% = An% Mod 19
b% = An% \ 100
c% = An% Mod 100
d% = b% \ 4
e% = b% Mod 4
f% = (b% + 8) \ 25
g% = (b% - f% + 1) \ 3
h% = (19 * a% + b% - d% - g% + 15) Mod 30
i% = c% \ 4
k% = c% Mod 4
l% = (32 + 2 * e% + 2 * i% - h% - k%) Mod 7
m% = (a% + 11 * h% + 22 * l%) \ 451
n% = (h% + l% - 7 * m% + 114) \ 31
p% = (h% + l% - 7 * m% + 114) Mod 31
fPaques = DateSerial(An%, n%, p% + 1)
End Function
Public Function joursferies(annee As Integer) As Variant
Dim cal(1 To 14) As Long
paques = fPaques(annee)
cal(1) = DateSerial(annee, 5, 8)
cal(2) = DateSerial(annee, 1, 1)
cal(3) = paques
cal(4) = paques + 1
cal(5) = paques + 39
cal(6) = paques + 49
cal(7) = paques + 50
cal(8) = DateSerial(annee, 5, 1)
cal(9) = DateSerial(annee, 5, 8)
cal(10) = DateSerial(annee, 7, 14)
cal(11) = DateSerial(annee, 7, 15)
cal(12) = DateSerial(annee, 11, 1)
cal(13) = DateSerial(annee, 11, 11)
cal(14) = DateSerial(annee, 12, 25)
joursferies = cal
End Function