【问题标题】:counting blank cells after after applying a filter应用过滤器后计算空白单元格
【发布时间】:2022-11-26 07:05:57
【问题描述】:

这不是我的代码,因为有人在 stackflow 上帮助了我。但是我仍然坚持它所以再次发布。

本质上,代码对 E 列中的空白单元格进行计数,因此逻辑有效。但是,在计算空白单元格之前,我想从 H 列中排除“现金”。

下面是代码,它确实在 H 列(不包括现金)上应用过滤器,但是空白单元格被计算为包含现金的数据。

Sub exampleTHis()

    ActiveSheet.Range("H:H").AutoFilter Field:=8, Criteria1:="<>Cash", _
    Operator:=xlAnd

Dim ws As Worksheet, testRange As Range, aCount As Long, zAnswer

For Each ws In ThisWorkbook.Worksheets

Set testRange = Intersect(ws.Range("E:E"), ws.UsedRange)
 'Set testRange = ws.Range("E2", Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
 
    If Not testRange Is Nothing Then
        
        aCount = Application.WorksheetFunction.CountBlank(testRange)
        If aCount > 0 Then
         'blank cells found....
            zAnswer = MsgBox(aCount & " blank values found in at " & ws.Name & testRange.Address & ".  Continue macro?", vbYesNo)
            
            If zAnswer = vbNo Then Exit For
            
        End If
    End If
    
Next ws

End Sub
'''

【问题讨论】:

  • 您要将此用于包含此代码 (ThisWorkbook) 的工作簿中的所有工作表 (For Each ws In ...) 还是用于特定工作表?如果是后者,它的(标签)名称是什么?这些空白单元格是空的还是有公式,例如IfError(Something, "")?您的工作表的屏幕截图会创造奇迹。请在您的帖子中添加任何其他信息。
  • 仅在工作簿选项卡名称“资产”中的一个工作表上
  • 空白单元格为空(其中没有公式)

标签: excel vba


【解决方案1】:

使用 AutoFilterSpecialCells 计算自动筛选列中的空白

  • 为了能够在消息框中写入关键单元格的地址,复杂性是必需的。如果你只是在数数之后,你可以简化。
Sub CountBlanksInFilteredColumn()
    ' Not blank:           "<>"
    ' Blank:               "" or "=" (includes Empty)
    ' Blank but not empty: "<=>"
    ' Empty? Anybody?
    
    Const SHEET_NAME As String = "Assets"
    Const BLANK_COLUMN As Long = 5
    Const BLANK_CRITERION As String = ""
    Const CASH_COLUMN As Long = 8
    Const CASH_CRITERION As String = "<>Cash"
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets(SHEET_NAME)
    
    Dim vrg As Range
    
    With ws
        If .FilterMode Then .ShowAllData ' clear filters
        Dim rg As Range: Set rg = ws.UsedRange
        With rg
            Dim crg As Range ' without header
            Set crg = .Columns(BLANK_COLUMN).Resize(.Rows.Count - 1).Offset(1)
            .AutoFilter BLANK_COLUMN, BLANK_CRITERION
            .AutoFilter CASH_COLUMN, CASH_CRITERION
            On Error Resume Next
                Set vrg = crg.SpecialCells(xlCellTypeVisible)
            On Error GoTo 0
        End With
        .AutoFilterMode = False ' turn off auto filter
    End With
    
    Dim Blanks As Long, vrgAddress As String
    
    If Not vrg Is Nothing _
        Then Blanks = vrg.Cells.Count: vrgAddress = vrg.Address(0, 0)
    
    MsgBox "Found " & Blanks & " blank cell" _
        & IIf(Blanks = 1, "", "s") _
        & IIf(Blanks = 0, "", ":" & vbLf & vrgAddress) & ".", _
        IIf(Blanks = 0, vbExclamation, vbInformation)
    
End Sub

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多