【问题标题】:Excel error 1004 "Unable to get .... property of WorksheetFunction class" appearing inconsistentlyExcel 错误 1004“无法获取 .... WorksheetFunction 类的属性”出现不一致
【发布时间】:2012-05-17 11:40:19
【问题描述】:

我在电子表格中有一个 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,你会得到什么?这是一个有效的数字吗?
  • 也将WorksheetFunction.RoundDown(currentCell.Value, 0)改为Application.WorksheetFunction.RoundDown(currentCell.Value, 0)
  • 谢谢!我试了一下。我得到一个日期列表(实际上是数字 - 它们显示为日期,除非我乘以 1 以获得与日期对应的基础 Excel 数字)。如果我逐步执行代码,但如果我让它自己运行(当它拉回完全相同的值时),这些肯定会很好地完成,所以它可能是关于 WorksheetFunction 而不是我的坏数据。我现在正在使用“On Error...” - 它似乎只是第一次出错,所以可能是首先使用 On Resume Next 进行任意 WorksheetFunction 调用,然后再关闭。
  • 你尝试我的第二个建议了吗?

标签: excel excel-2010 vba


【解决方案1】:

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

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

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

【讨论】:

  • 仅供参考,使用负值调用WorksheetFunction.Ln也会出现同样的错误。
  • 或在基于 1 的 Excel 集合(例如 sheet.Pictures(0))中的位置 0 处请求项目时
  • 当您尝试转置的范围不是“一体”时,也会发生这种情况。所以你不能转置破碎的范围
  • 在使用 WorkSheetFunction.Min() 时看到这个,当我传递一个字符串范围时出错,但在传递一个范围对象时它工作。谢谢!
  • 或者如果在需要数字的地方传递字符串参数
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    看一下 Range……这没有任何意义。将范围从"AC8:C" 修改为"AC8:AC",它将完美运行

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多