Excel错误1004:无法获取WorksheetFunction类的......属性,出现不一致。

25

我在一个电子表格中有一个VBA函数,它在一个早期阶段打开的另一个电子表格上运行。这个宏曾经很好用,但最近开始在运行时导致1004错误(“无法获取WorksheetFunction类的RoundDown属性”)。

我认为我知道错误的原因(运行RoundDown时出现问题),但我看不到为什么会在我的宏中触发它,奇怪的是当我进入调试模式并在VBE中逐步执行代码时,错误不会再次发生(尽管显然没有任何变化)。

是否有人遇到过这种错误不一致地发生,并知道我该怎么做才能解决它?

我对VBA / Excel相当熟悉,但如果有关于更进一步诊断的建议,则将不胜感激。我想知道是否存在打开的电子表格未准备好的问题,但我看不到原因。

这里是代码。错误发生在标有注释的那一行。

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

其他详细信息如下:

  • Excel版本:2010

  • 要打开的文件位于本地C驱动器上;我的宏存储在网络上的一个电子表格中

  • 两个文件的文件格式均为 .xls(即 Excel 2003)- 我无法更改此选项

  • Windows 7(并不认为这会有关系)

我已经尝试过的两点是:

  • 替换其他工作表函数(例如 Min(currentCell)),但仍然出现相同的问题

  • 如果文件已经打开,似乎就不会出现问题。我想知道是否有一种方法可以禁用正在被打开的工作簿(而不是包含宏的主工作簿),是否会干扰此过程。但即使出现这种情况,我也不确定该如何解决!

有任何想法吗?


如果在 vDateList(0, n) = WorksheetFunction.RoundDown(currentCell.Value, 0) 之前插入 Debug.Print currentCell.Value,你会得到什么?它是一个有效的数字吗? - Siddharth Rout
3
同时将 WorksheetFunction.RoundDown(currentCell.Value, 0) 更改为 Application.WorksheetFunction.RoundDown(currentCell.Value, 0) - Siddharth Rout
谢谢!我试了一下。我得到了一个日期列表(实际上是数字 - 除非我乘以1来获取对应于日期的Excel底层数字)。如果我逐步执行代码,这些肯定都能正常通过,但如果我让它自己运行(当它返回完全相同的值时),它们就不行了,所以这可能与WorksheetFunction有关,而不是我的错误数据。我现在正在使用“On Error…” - 它似乎只会出错一次,所以一个折中办法可能是首先使用On Resume Next进行任意的WorksheetFunction调用,然后再关闭它。 - Neil
你试过我的第二个建议了吗? - Siddharth Rout
3个回答

30

当传递给工作表函数的任何参数类型不正确或根本没有意义时,经常会出现此错误。

例如,当使用大于1的参数调用WorksheetFunction.Asin时,我曾遇到过这个问题。在您的情况下,我猜测currentCell.Value是一个非数字值或者一个与您的区域设置不符合数字的值。

是的,错误信息确实引导错误。


仅供参考,当使用负值调用WorksheetFunction.Ln时会出现相同的错误。 - Krøllebølle
当在基于1的Excel集合中请求位置0处的项目时,例如sheet.Pictures(0),会出现此错误。 - Cel
当您尝试转置的范围不是“完整的”时,也会出现这种情况。因此,您无法转置破碎的范围。 - Da Spotz
使用 WorkSheetFunction.Min() 时遇到这个问题,当我传递一个字符串范围时会出错,但是如果传递一个范围对象则可以正常工作。谢谢! - s2t2
1
或者,如果传递一个字符串参数,而需要的是一个数字。 - Murrah

1
我使用Transpose、MMult、MDterm和MInverse函数时,遇到了“无法获取WorksheetFunction类的*属性”错误。
我通过在编辑器中的特定模块的声明部分(实际代码之前)添加“Option Base 1”来使代码运行。
Excel默认为“Option Base 0”,这将添加一个额外的空单元格行和列。这会导致错误发生,但不容易看出。

0

我以前遇到过这种情况,对我来说是因为标准范围没有意义,就像Andre上面说的那样。

请参见下面的示例公式: .Cells(11, i).Formula = Application.WorksheetFunction.CountIfs(Sheets("Sheet1").Range("AC8:C" & n), "S")

看一下范围...它没有意义。将范围从"AC8:C"更改为"AC8:AC",它就可以完美地工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接