【问题标题】:CountA returns 0, WorksheetFunction.CountA returns 1CountA 返回 0,WorksheetFunction.CountA 返回 1
【发布时间】:2016-08-31 04:49:40
【问题描述】:

在调试窗口中,以下表达式都返回一个。

Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & ":" & Cells(5 + (i - 1) * rows_per_record, 58))

Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(n).Cells(4 + (i - 1) *  rows_per_record, 28) & ":" & ThisWorkbook.Sheets(n).Cells(5 + (i - 1) * rows_per_record, 58))

在这种特殊情况下,范围是 AB60:BF61,在调试窗口中已确认。

在工作表中,当脚本暂停时,我在单元格中输入=CountA(AB60:BF61),结果为 0,这应该是。

任何解释将不胜感激。

Windows 7、Excel 2010

【问题讨论】:

    标签: vba excel excel-formula excel-2010


    【解决方案1】:

    您的语法错误。

    正确的语法:

    Application.WorksheetFunction.CountA (Range(Cells(4 + (i - 1) * rows_per_record, 28), Cells(5 + (i - 1) * rows_per_record, 58)))

    您的代码正在计算每个非空字符串的参数。唯一的参数是由两个空单元格值包围的冒号。

    Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(n).Cells(4 + (i - 1) * rows_per_record, 28) & ":" & ThisWorkbook.Sheets(n).Cells(5 + (i - 1) * rows_per_record, 58))

    【讨论】:

    • 我认为冒号应该是逗号。我会进行一些测试。
    • 如果它是一个逗号,它将被视为两个单独的参数;每个单元格一个。使用 Range 将扩展单元格之间的范围。但是让我知道,以防万一..lol.
    • 是的,无论实际计数如何,您总是在计数 1,因为您将第一个单元格值连接在一起,然后是冒号,然后是最后一个单元格值。您实际上是在计算一个始终为 1 的单个字符串。您必须使用与冒号连接的单元格地址将其评估为工作表函数才能以这种方式使用它。通过使用 Range 并提供以逗号分隔的左上角和右下角,我计算了整个范围。
    • 你的措辞比我好得多。感谢您的反馈。
    【解决方案2】:

    我相信您在另一个回复中已经有了答案和正确语法的一个版本。这是一个替代方案:

    dim c as long
    with ThisWorkbook.Sheets(n)
        c = Application.CountA(.range(.Cells(4 + (i - 1) * rows_per_record, 28), _
                                      .Cells(5 + (i - 1) * rows_per_record, 58)))
        debug.print c
    end with
    

    Range object 是通过向左上角和右下角提供两个 Range.Cells properties 来构造的。父工作表通过With ... End With statement 引用。

    【讨论】:

    • 我应该将我的范围包装在 With 块中并对其进行限定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多