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 Function

date_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 Sub

On 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 Function

Bon, 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 Long

ou 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
Rechercher des sujets similaires à "erreur utilisation array worksheetfunction"