的一个这取决于你实际想要计算的数值:
- 相对于整个表的列中的所有空白单元格。
- 所有空白单元直到特定列本身内的最后使用单元。
大多数人都试图实现这个有点棘手的第一个选项。 对于计数空白的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唯一的问题是它不会计算包含空格的单元格为空;他们在技术上包含数据。这是用户编辑的工作表不时碰到的问题。因人而异。 –