2015-12-03 101 views
1

在包含數據的工作表中,有一列帶有應用過濾器的列以限制顯示的數據。用戶在列中選擇一個或多個單元格(不一定是連續的)並執行VBA代碼。 在VBA代碼中,我想遍歷所選單元格並對它們進行一些操作,但是在僅選擇一個單元格(以Excel方式激活)時,Excel行爲存在差異。VBA,Excel - 遍歷篩選列中選定的單元格

Sub Macro1() 
    If Selection.count = 1 Then 
     counter = 1 
     Debug.Print Selection.Text 
    Else 
     counter = Selection.SpecialCells(xlCellTypeVisible).count 
     For Each c In Selection.SpecialCells(xlCellTypeVisible) 
      Debug.Print c.Text 
     Next c 
    End If 
    Debug.Print counter 
End Sub 

問題:即工作代碼 有沒有一種方法,更優雅,乾淨的解決方案做到這一點?爲了擺脫If-Then?

Selection.SpecialCells(xlCellTypeVisible).count 

生成如果只有一個細胞被激活(我想的Excel擴展選擇,以整個工作表),如果只選擇了一個小區

ActiveCell.Select 
Selection.SpecialCells(xlCellTypeVisible).count 

返回2溢出錯誤(返回選擇的記錄兩次)

編輯 請注意:過濾器是由用戶手動應用而不是由VBA代碼。用戶還可以從過濾視圖中手動選擇單元格,然後在VBA代碼中使用所選單元格。

+0

因此....你正在從可見標題中刪除一行並調整範圍以使用'.Rows.Count-1'處理......?然後看着一列...?儘量避免使用「選擇」作爲確定待處理範圍的手段。無論如何,它將是'Selection.SpecialCells(xlCellTypeVisible).Count'而不是'Selection.Count'。 – Jeeped

+0

不,用戶從過濾表中的1到多個單元格中進行選擇。這個選擇是宏必須與之合作的。標題在這裏並不重要。正如我寫Selection.SpecialCells(xlCellTypeVisible).Count不工作,如果用戶只選擇一個記錄。 – b0rek

回答

1

以下是基於此示例數據。

 Column A Column A Column C 
     a   b   c 
1 AA-01  BB-01  1 
2 AAA-02  BBB-02  2 
3 AAAA-03  BBBB-03  2 

這些是我使用的AutoFilter Method的方法。我在處理一個或多個可見行時沒有任何問題,並且不需要區分這些過濾器集合。

Sub filter_test() 
    With Worksheets("Sheet16") '<~~set this properly 
     If .AutoFilterMode Then .AutoFilterMode = False 
     With .Cells(1, 1).CurrentRegion 
      .AutoFilter field:=3, Criteria1:=1 
      'report on column A 
      With .Resize(.Rows.Count - 1, 1).Offset(1, 0) 
       If CBool(Application.Subtotal(103, .Cells)) Then 
        reportVisibleCells visRng:=.Cells 
       Else 
        Debug.Print "no visible cells with 1" 
       End If 
      End With 
      .AutoFilter field:=3 
      .AutoFilter field:=3, Criteria1:=2 
      'report on column B 
      With .Resize(.Rows.Count - 1, 1).Offset(1, 1) 
       If CBool(Application.Subtotal(103, .Cells)) Then 
        reportVisibleCells visRng:=.Cells 
       Else 
        Debug.Print "no visible cells with 2" 
       End If 
      End With 
      .AutoFilter field:=3 
      .AutoFilter field:=3, Criteria1:=3 
      'report on column C 
      With .Resize(.Rows.Count - 1, 1).Offset(1, 2) 
       If CBool(Application.Subtotal(103, .Cells)) Then 
        reportVisibleCells visRng:=.Cells 
       Else 
        Debug.Print "no visible cells with 3" 
       End If 
      End With 
      .AutoFilter field:=3 
     End With 
     If .AutoFilterMode Then .AutoFilterMode = False 
    End With 
End Sub 

Sub reportVisibleCells(visRng As Range) 
    Dim vr As Range 

    With visRng.SpecialCells(xlCellTypeVisible) 
     For Each vr In .Cells 
      Debug.Print vr.Text 
     Next vr 
     Debug.Print .Count 
    End With 
End Sub 

設置您的桌面,以便您可以看到工作表和VBE窗口。打開VBE的立即窗口(Ctrl + G),以便您可以看到Debug.Print報告。將光標放在filter_test的子文件夾中,並開始點擊F8來瀏覽。

VBE立即窗口的預期結果。

AA-01 
1 
BBB-02 
BBBB-03 
2 
no visible cells with 3 
+0

感謝您的回答,但您認爲過濾器是通過代碼應用來計算可見記錄的數量。事實並非如此。過濾和選擇單元由用戶手動完成。然後執行VBA代碼。所以**用戶選擇是爲VBA代碼**輸入的。我想以統一的方式遍歷選定的單元格。 – b0rek

+0

你是說你不能將'Selection'作爲參數拋入reportVisibleCells子類? – Jeeped

+1

我可以,但是當只選擇1個單元格時(實際上只激活了),Excel會選擇整個表格作爲範圍,reportVisibleCells會以永久結束。類似的問題在這裏描述[鏈接] http://www.excelforum.com/excel-programming-vba-macros/849135-help-with-overflow-error-runtime-6-when-using-specialcells-xlcelltypevisible-count。 HTML [/鏈接] – b0rek