Erreur avec _xlfn.ISOWEEKNUM

Bonjour à tous,

J'ai trouvé ici dans une discussion un planning qui m'intéressait, sur excel 2019 il marche très bien, mais sur excel 2010 j'ai cette erreur qui apparaît quand il me met #NOM? à la place des semaines, dans la formule il s'affiche _xlfn.ISOWEEKNUM.

J'ai voulu regarder dans la macro mais je n'ai pas trouvé quelle fonction serait non prise en charge par excel 2010 et donc comment résoudre ceci.

Si vous pouviez m'aider, merci beaucoup

35a-corriger.xlsm (115.72 Ko)

Bonjour,

Cela signifie en effet que cette fonction _xlfn.ISOWEEKNUM n'existe pas dans ta version d'excel.

Ton code est tellement complexe qu'il faudrait nous dire où cela se produit ! ou cibler dans un fichier allégé.

Remplace par =WEEKNUM(date,21)

Bonjour,

merci d'avoir répondu, le déboggage m'emmène sur la fonction Application.Match(), donc j'ai regardé et j'ai cherché à remplacer par Application.WorksheetFunction.Match() mais cela me renvoie une autre erreur (erreur exécution 1004 impossible de lire la propriété match de la classe worksheetfunction).

'// initialisation planning annuel
    Me.Range("mois_texte").ClearContents:
    If Year(Me.Range("dates_planning").Columns(1)) = [année].Value Then Me.Range("mois_texte")(1).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm""))"

    Me.Range("mois_planning").Clear

    date_début_planning = Me.Range("date_début").Value: date_fin_planning = Me.Range("date_fin").Value

    With Me.Range("dates_planning")
        j1_min = Application.WorksheetFunction.Match(date_début_planning, .Value, 0)
        j1_max = Application.WorksheetFunction.Match(date_fin_planning, .Value, 0)
        .EntireColumn.Hidden = False: .Offset(, j1_max).EntireColumn.Hidden = True
        For j = j1_min To j1_max
            If Day(.Columns(j)) = 1 And Year(.Columns(j)) = [année].Value Then
                Me.Range("mois_texte")(j).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm""))"
            End If
            If jour_non_travaillé(.Columns(j)) Then
                .Columns(j).Interior.Color = type_jour_non_travaillé.Interior.Color
                .Columns(j).Offset(1).Interior.Color = type_jour_non_travaillé.Interior.Color
            Else
                .Columns(j).Interior.Color = xlNone
                .Columns(j).Offset(1).Interior.Color = xlNone
            End If
        Next j
    End With

J'ai regardé et affiché le type de ma variable date_début_planning et c'est bien une date......

J'ai essayé avec Weeknum comme proposé mais il ne reconnaît pas la fonction

Bonjour

si c'est dans une formule et que ta version est française c'est NO.SEMAINE

Dans le code

    With Me.Range("dates_planning")
        j1_min = Application.Match(date_début_planning, .Value, 0)

Ton range est une plage donc .value ne peut être un argument pour MATCH

Bonjour,

j'ai essayé avec la formule no.semaine (et aussi no.semaine.iso), et cela ne marche pas (erreur de compilation variable non définie), j'ai regardé la déclaration des variables, les références mais je ne vois pas de problème

 Dim offset_dates_planning As Integer
    Dim identifiant As Long
    Dim cell As Range, cell1 As Range
    Dim tâches As ListObject
    Dim plage As Range, tâche_affectée As Range, tâche As Range, tâche_id As String, tâche_desc As String, type_jour_non_travaillé As Range
    Dim i_tâche As Integer, i As Integer, j As Integer, j1 As Integer, j1_min As Integer, j1_max As Integer, j2 As Integer, j2_max As Integer
    Dim date_début As String, date_début_planning As String, date_fin As String, date_fin_planning As String

RE

On tourne en rond là

Soit tu utilise VBA et WorksheetFunction.WEEKNUM(date,21) fonctionne parfaitement soit c'est une formule de cellule et tu utilise en français

La valeur recherchée par un EQUIV ou MATCH doit être unique hors là tu passes une plage de 5 valeurs

Sers-toi du débugger...

oui je me sers du débogage, j'ai repris votre fonction du coup, mais j'obtiens cette (erreur erreur d'exécution 1004 erreur définie par l'application ou par l'objet), et je ne vois pas où se situe le problème

merci

edit: dans le doute j'ai mis application.worksheetfunction.weeknum() même problème

RE

Et en expression espion que donne l'argument à l'intérieur de la fonction ?

(erreur erreur d'exécution 1004 erreur définie par l'application ou par l'objet)

où cela se situe-t-il ? si c'est dans l'appel d'une fonction, il faut déclarer les variables auparavant

sinon, je répète, peux-tu faire un extrait de ton application de façon à ne pas perdre de temps de notre côté à la comprendre et se l'approprier

si je fais avec espion, cela m'affiche "impossible de lire la propriété WeekNum de la classe WorksheetFunction"

voici le code modifié, merci

Option Explicit

Dim BDD_personnes As Object
Dim BDD_affectations As ListObject

Sub Worksheet_Activate()
    Dim offset_dates_planning As Integer
    Dim identifiant As Long
    Dim cell As Range, cell1 As Range
    Dim tâches As ListObject
    Dim plage As Range, tâche_affectée As Range, tâche As Range, tâche_id As String, tâche_desc As String, type_jour_non_travaillé As Range
    Dim i_tâche As Integer, i As Integer, j As Integer, j1 As Integer, j1_min As Integer, j1_max As Integer, j2 As Integer, j2_max As Integer
    Dim date_début As String, date_début_planning As String, date_fin As String, date_fin_planning As String

    '// restauration calcul automatique
    Application.Calculation = xlCalculationAutomatic

    '// Assignation BDD_personnes/affectations, tâches et type jour non travaillé ....................................
    Set BDD_personnes = Me.ListObjects(1)
    Set BDD_affectations = Feuil2.ListObjects(1)
    Set tâches = Feuil3.ListObjects(1)
    Set type_jour_non_travaillé = Feuil4.Range("jours_de_repos")

    '// ajustement plage "mois_planning" selon BDD personnes ..........................................................
    offset_dates_planning = BDD_personnes.DataBodyRange.Row - Me.Range("dates_planning").Row
    Set plage = Me.Range("dates_planning").Offset(offset_dates_planning).Resize(BDD_personnes.ListRows.Count)
    Me.Names.Add Name:="mois_planning", RefersTo:="=" & plage.Address(1, 1, 1, 1)

    '// arrêt calcul automatique
    Application.Calculation = xlCalculationManual
    Me.Unprotect
    '// initialisation planning annuel
    Me.Range("mois_texte").ClearContents:
    If Year(Me.Range("dates_planning").Columns(1)) = [année].Value Then Me.Range("mois_texte")(1).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm""))"

    Me.Range("mois_planning").Clear

    date_début_planning = Me.Range("date_début").Value: date_fin_planning = Me.Range("date_fin").Value

    With Me.Range("dates_planning")
        j1_min = Application.WorksheetFunction.WeekNum(date_début_planning, 21)
        j1_max = Application.WorksheetFunction.WeekNum(date_fin_planning, 21)
        .EntireColumn.Hidden = False: .Offset(, j1_max).EntireColumn.Hidden = True
        For j = j1_min To j1_max
            If Day(.Columns(j)) = 1 And Year(.Columns(j)) = [année].Value Then
                Me.Range("mois_texte")(j).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm""))"
            End If
            If jour_non_travaillé(.Columns(j)) Then
                .Columns(j).Interior.Color = type_jour_non_travaillé.Interior.Color
                .Columns(j).Offset(1).Interior.Color = type_jour_non_travaillé.Interior.Color
            Else
                .Columns(j).Interior.Color = xlNone
                .Columns(j).Offset(1).Interior.Color = xlNone
            End If
        Next j

RE

Rien ne te choque là

Dim date_début As String, date_début_planning As String, date_fin As String, date_fin_planning As String

oui j'ai changé en date , si j'exécute dans Visual Basic la macro tourne, mais au final j'en reviens au problème initial ça m'affiche toujours #NOM? à la place du numéro de la semaine et je n'ai plus tous les jours de la semaine...

6retest.xlsm (106.73 Ko)

Re

Relis mon post de Aujourd'hui à 10:57

Bonjour,

j'ai lu mais je n'ai pas compris en fait, surtout que je n'utilise pas Match pour la fonction

RE

VBA touche-t-il à la ligne 4 ?

Je ne par le pas que de MATCH dans ce post

oui je pense, ça ne marche pas sans en tout cas

sinon je ne vois pas le problème avec la plage

Bonjour,

Bref, on n'est plus sur le même sujet. Le numéro de semaine ISO a bien été corrigé. Peux-tu reposter un fichier et si possible très simplifié ?

Option Explicit

Dim BDD_personnes As Object
Dim BDD_affectations As ListObject

Sub Worksheet_Activate()
    Dim offset_dates_planning As Integer
    Dim identifiant As Long
    Dim cell As Range, cell1 As Range
    Dim tâches As ListObject
    Dim plage As Range, tâche_affectée As Range, tâche As Range, tâche_id As String, tâche_desc As String, type_jour_non_travaillé As Range
    Dim i_tâche As Integer, i As Integer, j As Integer, j1 As Integer, j1_min As Integer, j1_max As Integer, j2 As Integer, j2_max As Integer
    Dim date_début As Date, date_début_planning As Date, date_fin As Date, date_fin_planning As Date

'    '// restauration calcul automatique
'    Application.Calculation = xlCalculationAutomatic
'
'    '// Assignation BDD_personnes/affectations, tâches et type jour non travaillé ....................................
'    Set BDD_personnes = Me.ListObjects(1)
'    Set BDD_affectations = Feuil2.ListObjects(1)
'    Set tâches = Feuil3.ListObjects(1)
'    Set type_jour_non_travaillé = Feuil4.Range("jours_de_repos")
'
'    '// ajustement plage "mois_planning" selon BDD personnes ..........................................................
'    offset_dates_planning = BDD_personnes.DataBodyRange.Row - Me.Range("dates_planning").Row
'    Set plage = Me.Range("dates_planning").Offset(offset_dates_planning).Resize(BDD_personnes.ListRows.Count)
'    Me.Names.Add Name:="mois_planning", RefersTo:="=" & plage.Address(1, 1, 1, 1)
'
'    '// arrêt calcul automatique
'    Application.Calculation = xlCalculationManual
'    Me.Unprotect

    '// initialisation planning annuel
    Me.Range("mois_texte").ClearContents:
    If Year(Me.Range("dates_planning").Columns(1)) = [année].Value Then Me.Range("mois_texte")(1).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm aaaa""))"

    Me.Range("mois_planning").Clear

    date_début_planning = Me.Range("date_début").Value: date_fin_planning = Me.Range("date_fin").Value

    With Me.Range("dates_planning")
        j1_min = Application.WorksheetFunction.WeekNum(date_début_planning, 21)
        j1_max = Application.WorksheetFunction.WeekNum(date_fin_planning, 21)
        .EntireColumn.Hidden = False: .Offset(, j1_max).EntireColumn.Hidden = True
        For j = j1_min To j1_max
            If Day(.Columns(j)) = 1 And Year(.Columns(j)) = [année].Value Then
                Me.Range("mois_texte")(j).FormulaR1C1 = "=UPPER(TEXT(R[2]C,""mmmm aaaa""))"
            End If
            If jour_non_travaillé(.Columns(j)) Then
                .Columns(j).Interior.Color = type_jour_non_travaillé.Interior.Color
                .Columns(j).Offset(1).Interior.Color = type_jour_non_travaillé.Interior.Color
            Else
                .Columns(j).Interior.Color = xlNone
                .Columns(j).Offset(1).Interior.Color = xlNone
            End If
        Next j
    End With

'    'remplissage planning annuel pour chaque tâche enregistrée -------------------------------------------------------------------------
'    With BDD_personnes
'        For i = 1 To .ListRows.Count
'            identifiant = .ListColumns("Identifiant").DataBodyRange.Rows(i)
'
'            'remplissage planning avec les tâches .......................................................................................
'            With BDD_affectations
'                Set cell = .ListColumns("Identifiant").Range.Find(identifiant)
'                If Not cell Is Nothing Then
'                    Set cell1 = cell
'                    Do
'                        i_tâche = cell.Row - .HeaderRowRange.Row
'
'                        'récupération données de la tâche
'                        Set tâche_affectée = .ListColumns("Tâche").DataBodyRange.Rows(i_tâche)
'                        With tâches
'                            Set tâche = .ListColumns("Tâche").Range.Find(tâche_affectée)
'                            If Not tâche Is Nothing Then
'                                j = tâche.Row - .HeaderRowRange.Row
'                                tâche_id = .ListColumns("Id").DataBodyRange.Rows(j)
'                                tâche_desc = .ListColumns("Description").DataBodyRange.Rows(j)
'                            End If
'                        End With
'                        date_début = .ListColumns("Date début").DataBodyRange.Rows(i_tâche)
'                        date_fin = .ListColumns("Date fin").DataBodyRange.Rows(i_tâche)
'
'                        'détermination indices de colonne correspondant aux dates de début et de fin
'                        j1 = 0: j2 = 0
'                        On Error Resume Next
'                        j1_min = Application.Match(date_début_planning, Me.Range("dates_planning").Value, 0)
'                        j1 = Application.Match(date_début, Me.Range("dates_planning").Value, 0)
'                        j2 = Application.Match(date_fin, Me.Range("dates_planning").Value, 0)
'                        j2_max = Application.Match(date_fin_planning, Me.Range("dates_planning").Value, 0)
'                        If j1 = 0 And CDate(date_fin) >= CDate(date_début_planning) And CDate(date_début) <= CDate(date_début_planning) Then j1 = j1_min
'                        If j2 = 0 And CDate(date_début) <= CDate(date_fin_planning) And CDate(date_fin) >= CDate(date_fin_planning) Then j2 = j2_max
'
'                        'remplissage tâche selon date de début et date de fin
'                        With Me.Range("mois_planning")
'                            If j1 > 0 And j2 > 0 Then
'                                For j = j1 To j2
'                                    .Cells(i, j1) = tâche_id
'                                    .Cells(i, j1).AddComment (tâche_desc)
'                                    .Cells(i, j).Interior.Color = tâche_affectée.Interior.Color
'                                Next j
'                            End If
'                        End With
'
'                        'boucle sur prochaine tâche
'                        Set cell = .ListColumns("Identifiant").Range.Find(identifiant, after:=cell)
'                    Loop Until cell.Address = cell1.Address
'                End If
'            End With
'            '...............................................................................................................................
'        Next i
'    End With
'    '----------------------------------------------------------------------------------------------------------------------------------------
'
'    '// restauration calcul automatique
'    Application.Calculation = xlCalculationAutomatic
'    Me.Protect
'
'End Sub
'
'Private Sub cmd_affecter_Click()
'    sel_année = Empty: sel_nom = Empty: sel_prénom = Empty
'    gestion_tâches.Show
'End Sub
'
'Private Sub spn_année_Change()
'    cmd_semaine_du_Click
'    cmd_semaine_au_Click
'End Sub
'
'Private Sub cmd_semaine_du_Click()
'    Me.Unprotect
'    [année_du].Value = [année].Value
'    [semaine_du].Value = 1
'    Call afficher_semaine([année_du], [semaine_du])
'    If DateDiff("d", [date_début], [date_fin]) < 0 _
'    Or DateDiff("d", [date_début], [date_fin]) > [dates_planning].Columns.Count Then
'        [année_au] = Year(DateAdd("ww", 1, [date_début]))
'        [semaine_au] = semaine(DateAdd("ww", 1, [date_début]))
'    End If
'    Me.Protect
'    Call Worksheet_Activate
'End Sub
'
'Private Sub cmd_semaine_au_Click()
'    Me.Unprotect
'    [année_au].Value = [année].Value
'    [semaine_au].Value = 2
'    Call afficher_semaine([année_au], [semaine_au])
'    If DateDiff("d", [date_début], [date_fin]) < 0 _
'    Or DateDiff("d", [date_début], [date_fin]) > [dates_planning].Columns.Count Then
'        [année_au] = Year(DateAdd("ww", 1, [date_début]))
'        [semaine_au] = semaine(DateAdd("ww", 1, [date_début]))
'    End If
'    Me.Protect
'    Call Worksheet_Activate
'End Sub
Bonjour,

alors du coup même si la macro s'exécute, j'ai toujours mon problème initial _xlfn.ISOWEEKNUM et en plus si je choisis une semaine avec les boutons, j'ai soit 2 jours qui s'affichent, soit 12, soit 22 mais pas une semaine à chaque fois........

enfin j'ai essayé de remplacer directement dans ma feuille le numéro semaine par la fonction no.semaine(date_debut), cela ne se met que pour la cellule concernée mais pas pour les autres

j'ai mis une grande partie en commentaires de ce que je pense ne pas impacter le problème

merci

10meme-probleme.xlsm (122.07 Ko)
j'ai toujours mon problème initial _xlfn.ISOWEEKNUM et en plus si je choisis une semaine avec les boutons, j'ai soit 2 jours qui s'affichent, soit 12, soit 22 mais pas une semaine à chaque fois........

enfin j'ai essayé de remplacer directement dans ma feuille le numéro semaine par la fonction no.semaine(date_debut), cela ne se met que pour la cellule concernée mais pas pour les autres

  1. je n'ai pas trouvé le ISOWEEKNUM dans tes (trop nombreuses) macro, mais si c'est le cas, la solution a déjà été donnée à plusieurs reprises ci-dessus
  2. surtout pas la fonction no.semaine, mais no.semaine.iso (je crois que c'est ce que tu as fait)

je vais m'arrêter là sur ce fil pour ma part car je crois que tu n'écoutes pas, que tu n'as pas la volonté de mettre un fichier ciblé sur le (nouveau) sujet et simplifié, et que de toute façon je pense qu'une macro qui dépasse une feuille A4 mérite qu'on se repose la question globale et que l'on pense à la maintenance ultérieure

Rechercher des sujets similaires à "erreur xlfn isoweeknum"