如何修改Excel VBA代码以跳过带背景色的零值单元格?
修改VBA代码:跳过带红色背景的零值单元格
关键修改说明
原代码通过数组读取单元格值,无法获取背景色信息,因此需要在判断零值的同时,检查对应单元格的背景色:
- 跳过背景色为红色的零值单元格
- 仅统计无背景填充(或蓝色背景,根据实际需求调整)的零值
修改后的完整代码
Option Explicit Sub OB_Raport_brakow() Dim i As Long, j As Long Dim arrData As Variant Dim rngData As Range Dim arrRes, iR As Long Dim LastRow As Long, wsOB As Worksheet Dim DataRange As Range ' 查找透视表最后一行 LastRow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row Set wsOB = Sheets("OB") ' 让用户选择数据截止列 Dim strCol As String strCol = InputBox("请输入数据截止列(如R):", "选择列范围") Set rngData = wsOB.Range("B4:" & strCol & LastRow + 1) arrData = rngData.Value ReDim arrRes(1 To UBound(arrData) * 31, 0) iR = 0 ' 遍历列(从第3列开始) For j = LBound(arrData, 2) + 2 To UBound(arrData, 2) If arrData(4, j) = "T" Then ' 遍历行(从第5行开始) For i = LBound(arrData) + 4 To UBound(arrData) ' 新增背景色判断:跳过红色背景的零值,仅统计目标格式的零值 If arrData(i, j) = 0 And Not IsEmpty(arrData(i, j)) Then ' 情况1:统计无背景填充的零值(对应"无背景格式"描述) ' If rngData.Cells(i, j).Interior.ColorIndex = xlColorIndexNone Then ' 情况2:统计蓝色背景的零值(蓝色ColorIndex通常为5,可根据实际格式调整) If rngData.Cells(i, j).Interior.ColorIndex = xlColorIndexNone Or rngData.Cells(i, j).Interior.ColorIndex = 5 Then iR = iR + 1 arrRes(iR, 0) = arrData(i, 2) & "-" & arrData(i, 1) & "-" & Format(arrData(2, j), "dd.mm.yyyy") End If End If Next End If Next ' 处理报表工作表:存在则激活,不存在则新建 On Error GoTo Catch Sheets("OB Rp").Select GoTo Finally Catch: Sheets.Add(After:=Sheets("OB")).Name = "OB Rp" Finally: On Error GoTo 0 ' 清空报表区域并写入数据 Sheets("OB Rp").Activate Range("B1:D600").ClearContents Range("B1:B" & iR).Value = arrRes ' 按姓名列排序 Range("B1").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:=xlYes End Sub
重点调整部分
- 背景色判断逻辑:在原零值判断条件后,新增了单元格背景色的检查:
- 若需统计无背景填充的零值,启用
xlColorIndexNone的判断 - 若需统计蓝色背景的零值,替换为对应蓝色的
ColorIndex(可通过录制宏获取实际颜色值)
- 若需统计无背景填充的零值,启用
- 保留了原代码的用户交互、报表创建及排序逻辑,仅修改核心的零值筛选条件
内容的提问来源于stack exchange,提问作者KMYozz
相关产品推荐
相关产品推荐

