【问题标题】:WorksheetFunction.CountA - not working post upgrade to Office 2010WorksheetFunction.CountA - 升级到 Office 2010 后无法正常工作
【发布时间】:2014-09-17 12:28:29
【问题描述】:

以下代码在 2010 年之前的 Excel 中有效:

myRange = Range("A:A")
NumRows = Application.CountA(myRange)

A 列中有 38 个包含文本/值的单元格。当代码在 Excel 2007 中运行时,NumRows 正确计算为 38,但在 Excel 2010 中它(错误地)计算为 65,536。

在单元格中输入CountA 函数在两个版本中都可以正常工作。

类似的主题是question 16696891,但没有答案,我认为建议是红鲱鱼......

有什么想法吗?

【问题讨论】:

    标签: excel vba worksheet-function


    【解决方案1】:

    我不确定您的问题到底是什么,因为我无法让您的代码按所写的那样工作。有两件事似乎很明显:

    1. 看来您是依靠 VBA 来确定变量类型并进行相应修改。如果您不小心,这可能会让人感到困惑,因为 VBA 可能会分配您不想要的变量类型。在您的代码中,应将Range 类型分配给myRange。由于 Range 类型是 VBA 中的对象,因此它必须是 Set,如下所示:Set myRange = Range("A:A")
    2. 您对工作表函数CountA() 的使用应使用.WorksheetFunction 调用

    如果您还没有这样做,请考虑使用模块顶部的 Option Explicit 选项,并使用 Dim 语句键入变量,如下所示。

    以下代码在 2010 年适用于我。希望它也适用于您:

    Dim myRange As Range
    Dim NumRows As Integer
    
    Set myRange = Range("A:A")
    NumRows = Application.WorksheetFunction.CountA(myRange)
    

    祝你好运。

    【讨论】:

    • 大家好,谢谢。抱歉,应该说清楚 - 范围是使用 Set 关键字设置的。实际上你不需要.WorksheetFunction,事实上Application.CountA 应该自己工作。在有问题的 PC 上,Application.WorksheetFunction.CountA(Range("A:A")) 显示 65,536,即使只有 38 个单元格包含任何内容。我无法在自己的办公桌上复制。我认为从一个版本的办公室升级到另一个版本可能是某种问题。 “新”PC 在 Windows 7 上安装了 Office 2010,并从 Windows 2003 上的 Office 2007 升级。
    • 可能是特定电子表格的问题。尝试选择所有“空”单元格,删除它们并保存。如果这不会导致预期的“38”结果,我很难过。
    【解决方案2】:

    另一个论坛的这个答案解决了这个问题。

    (用您自己的范围替换此处显示的“I:I”)

    Re: CountA 在 VBA 中不起作用

    Should be:
    
    Nonblank = Application.WorksheetFunction.CountA(Range("I:I"))
    
    You have to refer to ranges in the vba format, not the in-excel format.
    

    【讨论】:

      【解决方案3】:

      此代码适用于我:

      Sub test()
          Dim myRange As Range
          Dim NumRows As Integer
      
          Set myRange = Range("A:A")
          NumRows = Application.WorksheetFunction.CountA(myRange)
      
          MsgBox NumRows
      End Sub
      

      【讨论】:

        【解决方案4】:

        似乎 Application.COUNTA 在 VB7 和 VB6 中的工作方式发生了变化。我在两个版本的 VB 中都尝试了以下操作。

           ReDim allData(0 To 1, 0 To 15)
           Debug.Print Application.WorksheetFunction.CountA(allData)
        

        在 VB6 中返回 0。

        客栈VB7返回32

        看起来 VB7 不再将 COUNTA 视为 COUNTA。

        【讨论】:

          【解决方案5】:

          这可能很明显,但是通过说明范围而不包括哪个工作簿或工作表,它可能会尝试在不同的工作表上完全使用 CountA()。 我发现完全解决这些问题可以省去很多麻烦。

          【讨论】:

            最近更新 更多