2011-09-18 62 views
0

我想提供一个数字(即4代表第4列 - D),然后有一个msgbox返回非空格的数目该列excel - 计数空白单元格(将A转换为1,D转换为4.etc)

例如下面有5个坯件在列d:

col A  col B  col C  col D  col E 
------ -------  ----  ------- ------ 
           gh 


           2h 



           34 

代码到目前为止:

Sub Tester() 
CountBlanks 4 
End Sub 

Sub CountBlanks(ByVal colNum) 
columnLetter = ?? 
columnCount = ?? 
MsgBox "Count of column: " & columnLetter & " is " & columnCount 
End Sub 

预期结果:

"Count of column: D is 5" 

回答

4

的一个这取决于你实际想要计算的数值:

  1. 相对于整个表的列中的所有空白单元格。
  2. 所有空白单元直到特定列本身内的最后使用单元。

大多数人都试图实现这个有点棘手的第一个选项。 对于计数空白的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,运行代码,你会得到正确的结果。

+0

很好和清晰的解释:)。然而,我可能错过了一些东西,但是你确定在你的情况1中你将范围缩小到'UsedRange'?因为你似乎没有在'lBlanks'定义中使用它。此外,我宁愿使用'xlCellTypeBlanks'而不是'4',因为我觉得它更具可读性。示例e中的 – JMax

+0

+1。 @JMAx,我认为在1 Readify使用'ActiveSheet.UsedRange'在查看xlBlanks(它将查看使用的范围而不是整列)之前重置使用的范围。所以它应该工作,尽管我更喜欢(2)的鲁棒性。这两个示例都可能使用错误处理程序来处理空白 – brettdj

+0

SpecialCells唯一的问题是它不会计算包含空格的单元格为空;他们在技术上包含数据。这是用户编辑的工作表不时碰到的问题。因人而异。 –

0

当单元格不为空时,使用循环并增加columnCount

如何知道何时到达最后一行?

1

您可以使用工作表函数COUNTA如此这些,再加上操纵与斯普利特列地址来获取aplhabetic columm信

注意任何的“”结果将计入

Function CountBlanks(colNum As Long) 
CountBlanks = "Count of column: " & Split(Columns(colNum).Address(False, False), ":")(0) & " is " & Application.WorksheetFunction.CountA(Columns(colNum)) 
End Function 
+1

COUNTA函数计算一个范围内非空的单元格的数量。我可能是错的,但我相信OP要计算空白单元格。也许你正在寻找COUNTBLANK功能? – Reafidy

+0

+1好点Reafidy。操作系统确实说“然后有一个msgbox返回该列中非空白的数量”,这就是我所寻找的,但标题说“空白”。空白看起来更可能来自样本输出......在这种情况下COUNTBLANK它是 – brettdj

2

这里与xlCellTypeBlanks(感谢解决brettdj为列字母代码(不想搜索),

Sub CountBlanks(ByVal colNum) 
Dim iRow As Long 
Dim columnLetter As String 
columnLetter = Split(Columns(colNum).Address(False, False), ":")(0) 
iRow = Cells(Rows.Count, colNum).End(xlUp).Row 
columnCount = Range(columnLetter & "1:" & columnLetter & iRow).SpecialCells(xlCellTypeBlanks).Count 
MsgBox "Count of column: " & columnLetter & " is " & columnCount 
End Sub 

Sub Tester() 
CountBlanks 1 
End Sub 
+0

没有probs。虽然请注意,您当前的代码是建立在对A列(在您的iRow定义上)的硬编码引用中的,当它完全灵活时,它会给出与我现有较短尝试相同的输出。 – brettdj

+0

划痕我的评论的第二部分作为平衡证据它是空白(标题和示例)与OP想要的非空白(身体)。第一点重新定义iRow定义。干杯 – brettdj

+0

@brettdj:谢谢 - 这是纠正(我跑了我的本地测试的A列:)) - 它现在应该工作(并计数空白单元格,如你所说) – JMax