2016-08-31 95 views
3

在调试窗口中,以下表达式全部返回一个。CountA返回0,WorksheetFunction.CountA返回1

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

回答

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))

enter image description here

+0

我在想结肠应该是逗号。我会运行一些测试。 – Jeeped

+0

如果这是一个逗号,它将被视为两个单独的论点;每个细胞一个。使用范围将扩大单元格之间的范围。但让我知道,以防万一.. –

+0

是的,无论实际计数如何,您都始终计算** 1 **,因为您将第一个单元格的值连接在一起,然后是一个冒号,然后是最后一个单元格的值。你基本上计算一个总是** 1 **的单个字符串。 YOu必须将它评估为一个工作表函数,使用与冒号连接的单元格地址以这种方式使用它。通过使用Range并提供由逗号分隔的左上角和右下角,我计算整个范围。 – Jeeped

1

我相信你有答案,而在另一个响应的正确语法的一个版本。这里是一个替换:

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引用。

+0

我应该将自己的范围包裹在一个With块中并限定它们。 –