Excel错误1004“无法获取WorksheetFunction类的属性”出现不一致

时间:2012-05-17 11:40:20

标签: excel-vba excel-2010 vba excel

我在电子表格中有一个VBA功能,该功能在另一个在我的宏的早期阶段打开的电子表格上运行。该宏工作正常但最近刚开始运行时导致 1004 错误(“无法获取WorksheetFunction类的属性”。

我相信我理解错误是由(运行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)),这也会导致同样的问题

  • 打开文件似乎已经停止了问题 - 我想知道是否有某种方式可以打开正在打开的工作簿(而不是我的主要工作簿中的宏),这对宏来说是不是正在干扰。但即使这是原因,我也不确定如何绕过它!

有什么想法吗?

3 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:1)

我使用Transpose,MMult,MDterm和MInverse函数得到了“无法获取WorksheetFunction类的 * 属性”错误。

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

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

答案 2 :(得分:0)

我之前已经遇到过这个问题,对我而言,正如安德烈所说的那样,标准范围毫无意义。

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

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