2011-09-18 92 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