2016-08-31 91 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塊中並限定它們。 –