web-dev-qa-db-fra.com

Erreur Excel 1004 "Impossible d'obtenir .... propriété de la classe WorksheetFunction" apparaissant de manière incohérente

J'ai une fonction VBA dans une feuille de calcul qui opère sur une autre feuille de calcul qui est ouverte à une étape antérieure de ma macro. La macro fonctionnait bien mais a récemment commencé à provoquer une erreur 1004 ("Impossible d'obtenir la propriété RoundDown de la classe WorksheetFunction") lors de son exécution.

Je crois comprendre l’erreur provoquée par (un problème d’exécution de RoundDown), mais je ne vois pas pourquoi elle se déclenche dans ma macro. Et ce qui est bizarre, c’est que lorsque je passe en mode Debug et que j’examine le code dans le VBE, l'erreur ne se reproduit pas (malgré rien ne change manifestement).

Est-ce que quelqu'un a une expérience similaire de ce type d'erreur se produisant de manière incohérente et sait ce que je pourrais faire pour la résoudre?

Je connais assez bien VBA/Excel, mais toute suggestion sur les étapes à suivre pour le diagnostiquer serait la bienvenue. Je me demande s’il ya un problème avec le tableur ouvert qui n’est pas prêt, mais je ne vois pas comment.

Le code est ici. L'erreur se produit sur la ligne marquée d'un commentaire.

Public Function GetDatesA(sWorkbookname As String, sSheetname As String, sCell As String) As Variant

    Dim vDateList() As Variant
    Dim currentCell As Range
    Dim n As Long

    Set currentCell = Workbooks(sWorkbookname).Worksheets(sSheetname).Range(sCell)

    n = 0

    Do
        If Trim(currentCell.Value) = "" Then
            Exit Do
        Else
            ReDim Preserve vDateList(0 To 1, 0 To n)
            vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0) 'error occcurs on this line
            vDateList(1, n) = currentCell.Column
            'Debug.Print currentCell.Value
        End If
        Set currentCell = currentCell.Offset(0, 1)
        n = n + 1
    Loop While currentCell.Column < XL_LAST_COLUMN

    GetDatesA = vDateList

End Function

Les autres détails sont:

  • Version Excel: 2010

  • Le fichier en cours d'ouverture réside localement sur mon lecteur C: ma macro est dans un tableur sur le réseau

  • Le format de fichier pour les deux fichiers est .xls (c.-à-d. Excel 2003) - je n’ai pas la possibilité de le modifier.

  • Windows 7 (pas que je pense que ce serait pertinent)

J'ai déjà essayé deux points:

  • Substituez une fonction de feuille de calcul différente (par exemple, Min (currentCell)) et posez également le même problème.

  • Le fichier ouvert semble déjà résoudre le problème - je me demande s’il est possible que le classeur en cours d’ouverture (plutôt que le classeur principal dans lequel se trouve la macro) ne soit pas activé pour les macros et que cela gêne. Mais même si c'est la cause, je ne sais pas comment contourner le problème!

Des idées?

16
Neil

Cette erreur se produit souvent lorsqu'un argument transmis à la fonction de feuille de calcul n'est pas du type correct ou n'a simplement aucun sens.

Par exemple, j'ai eu ce problème en appelant WorksheetFunction.Asin avec un argument supérieur à 1. Dans votre cas, je suppose que currentCell.Value est une valeur non numérique ou non conforme aux paramètres de votre région concernant les nombres.

Oui, le message d'erreur est vraiment erroné.

23
André Chalella

J'ai eu l'erreur "Impossible d'obtenir * propriété de WorksheetFunction Class" en utilisant les fonctions Transpose, MMult, MDterm et MInverse. 

J'ai pu exécuter mon code en plaçant "Option Base 1" dans la section Déclarations (avant le code lui-même) du module concerné dans l'éditeur.

Excel suppose "Option Base 0", ce qui ajoute une ligne et une colonne supplémentaires de cellules vides. Cela provoquera l'erreur et ne sera pas immédiatement évident à voir.

1
James

Je suis déjà passé par là, et pour moi, c'était parce que la fourchette de critères n'avait aucun sens, comme Andre l'a dit plus haut.

Voir exemple de formule ci-dessous: .Cells(11, i).Formula = Application.WorksheetFunction.CountIfs(Sheets("Sheet1").Range("AC8:C" & n), "S")

Jetez un coup d'œil à la gamme ... cela n'a aucun sens. A modifié la plage de "AC8:C" à "AC8:AC" et cela fonctionnera parfaitement

0
user1