24

我在电子表格中有一个 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)),这也会导致同样的问题

  • 打开文件似乎已经解决了这个问题 - 我想知道是否有某种方式正在打开的工作簿(而不是我的带有宏的主工作簿)没有启用宏,这会造成干扰。但即使这是原因,我也不知道如何解决它!

有任何想法吗?

4

3 回答 3

29

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

例如,我在WorksheetFunction.Asin使用大于 1 的参数调用时遇到了这个问题。在你的情况下,我猜currentCell.Value是一个非数字值,或者不是根据你的区域设置关于数字的值。

是的,错误消息确实具有误导性。

于 2012-08-17T16:53:01.127 回答
1

使用 Transpose、MMult、MDterm 和 MInverse 函数时出现 “无法获取WorksheetFunction 类的*属性”错误。

通过将“Option Base 1”放在编辑器中特定模块的声明(在实际代码之前)部分中,我能够运行我的代码。

Excel 假定“Option Base 0”将添加额外的一行和一列空单元格。这将导致错误发生,并且不会立即显而易见。

于 2014-06-05T19:46:56.600 回答
0

我以前遇到过这个问题,对我来说这是因为标准范围没有意义,正如安德烈上面所说的那样。

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

看看范围......这没有任何意义。修改了从"AC8:C"到的范围"AC8:AC",它将完美地工作

于 2016-12-14T14:15:57.657 回答