的一個這取決於你實際想要計算的數值:
- 相對於整個表的列中的所有空白單元格。
- 所有空白單元直到特定列本身內的最後使用單元。
大多數人都試圖實現這個有點棘手的第一個選項。 對於計數空白的specialcells功能是要走的路。但是,由於專用單元使用單張使用範圍,因此可能變得不可靠,因爲已知excel嚴重跟蹤使用的單位。所以首先我們必須調用usedrange函數來重置它。
Function CountBlanks(colNum As Long)
Dim sColumn As String
Dim lBlanks As Long
sColumn = Split(Columns(colNum).Address(ColumnAbsolute:=False), ":")(0)
ActiveSheet.UsedRange
lBlanks = ActiveSheet.Columns(colNum).SpecialCells(xlCellTypeBlanks).Count
MsgBox "Count of column: " & sColumn & " is " & lBlanks
End Function
如果您是在選項2之後,那麼只是獲取列中最後一個單元格並用specialcells計數的情況。
Function CountBlanks(colNum As Long)
Dim sColumn As String
Dim lBlanks As Long
sColumn = Split(Columns(colNum).Address(ColumnAbsolute:=False), ":")(0)
lBlanks = Range(Cells(1, colNum), Cells(Rows.Count, colNum).End(xlUp)).SpecialCells(xlCellTypeBlanks).Count
MsgBox "Count of column: " & sColumn & " is " & lBlanks
End Function
編輯
J最大,代碼實際上是正確的。重置使用範圍的呼叫必須是自己的。在下一行調用特殊單元時,不需要指定usedrange。
它很難解釋,但試試這個: 註釋掉ActiveSheet.UsedRange線。使用您的測試數據,向表格下方的單元格添加一個值並運行代碼。它會返回到這個新添加的單元格的空白計數。現在刪除您添加的單元格的整行並重新運行代碼。它仍然會返回相同的計數,因爲excel沒有重置其內置的計數器。現在取消註釋行Activesheet.Usedrange,運行代碼,你會得到正確的結果。
很好和清晰的解釋:)。然而,我可能錯過了一些東西,但是你確定在你的情況1中你將範圍縮小到'UsedRange'?因爲你似乎沒有在'lBlanks'定義中使用它。此外,我寧願使用'xlCellTypeBlanks'而不是'4',因爲我覺得它更具可讀性。示例e中的 – JMax
+1。 @JMAx,我認爲在1 Readify使用'ActiveSheet.UsedRange'在查看xlBlanks(它將查看使用的範圍而不是整列)之前重置使用的範圍。所以它應該工作,儘管我更喜歡(2)的魯棒性。這兩個示例都可能使用錯誤處理程序來處理空白 – brettdj
SpecialCells唯一的問題是它不會計算包含空格的單元格爲空;他們在技術上包含數據。這是用戶編輯的工作表不時碰到的問題。因人而異。 –