VBA编译错误:调用CountIf时提示“Method or data member not found”
问题分析与代码修正
错误提示翻译
编译错误:未找到方法或数据成员
核心问题点
ws1未初始化且方法调用错误:- 仅声明了
ws1 As Worksheet但未通过Set语句赋值(如Set ws1 = ActiveSheet),导致对象引用无效。 - Worksheet对象没有
CountIf方法,该方法属于WorksheetFunction对象;且原需求是统计单元格内"B"的出现次数,CountIf只能统计符合条件的单元格数量,无法满足需求。
- 仅声明了
- Range参数语法错误:
Range(lrNew, "K")写法错误,Range的参数需为单元格地址格式(如Range("K" & lrNew)表示单个单元格,Range("K2:K" & lrNew)表示区域)。
- 未声明变量:
sr、lr变量未声明,违反VBA变量声明规范,易引发逻辑错误。
- 逻辑偏差:
- 原代码仅检查最后一行的K列值,未遍历所有行统计符合条件的单元格,不符合"统计K列所有同时包含CS55和B的单元格中B的出现次数"的需求。
修正后的代码
Option Explicit Sub PaintCS55() Dim ws1 As Worksheet, lrNew As Long, n As Long, n1 As Long, n2 As Long Dim sr As Long, lr As Long, cell As Range Dim bCount As Integer ' 初始化目标工作表 Set ws1 = ActiveSheet lrNew = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row sr = 2 lr = lrNew ' 补充原代码未定义的lr变量,假设与最后行号一致 n = 0 ' 遍历K列,统计同时包含CS55和B的单元格中B的出现次数总和 For Each cell In ws1.Range("K" & sr & ":K" & lrNew) If cell.Value Like "*CS55*" And cell.Value Like "*B*" Then ' 通过替换字符计算B的出现次数(不区分大小写) bCount = (Len(cell.Value) - Len(Replace(UCase(cell.Value), "B", ""))) / Len("B") n = n + bCount End If Next cell ' 修正SumIfs的区域引用,统一使用lrNew If ws1.Cells(lrNew, "K").Value Like "*CS55**Black*" Then n1 = WorksheetFunction.SumIfs(ws1.Range("C" & sr & ":C" & lrNew), _ ws1.Range("K" & sr & ":K" & lrNew), "*CS55**Black*") n2 = n1 * 0.000666 * 7.48 * 2 End If If ws1.Cells(lrNew, "K").Value Like "*CS55*" And n = 1 Then n1 = WorksheetFunction.SumIfs(ws1.Range("C" & sr & ":C" & lrNew), _ ws1.Range("K" & sr & ":K" & lrNew), "*CS55**B*") n2 = n1 * 0.000666 * 7.48 End If If ws1.Cells(lrNew, "K").Value Like "*CS55*" And n = 2 Then n1 = WorksheetFunction.SumIfs(ws1.Range("C" & sr & ":C" & lrNew), _ ws1.Range("K" & sr & ":K" & lrNew), "*CS55**B*") n2 = n1 * 0.000666 * 7.48 * 2 End If lrNew = lrNew + 1 ' 使用With简化工作表对象引用 With ws1 .Cells(lrNew, "A") = .Cells(lr, "A") .Cells(lrNew, "B") = "." .Cells(lrNew, "C") = n2 .Cells(lrNew, "D") = "F62655" .Cells(lrNew, "I") = "Purchased" .Cells(lrNew, "K") = "CS55 Black" If .Cells(lrNew, "C").Value Like "*0*" Then .Rows(lrNew).Delete End If End With ' 释放对象资源 Set ws1 = Nothing End Sub
关键修正说明
- 添加
Option Explicit:强制变量声明,避免未声明变量引发的隐性错误。 - 初始化工作表对象:明确操作的工作表,避免ActiveSheet切换导致的错误。
- 遍历统计B的出现次数:通过
Len和Replace函数计算每个符合条件的单元格中B的出现次数,累加得到总次数。 - 修正Range引用:统一使用规范的单元格区域格式,确保引用正确。
- 简化代码结构:使用
With语句减少重复的工作表对象引用,提升代码可读性。
内容的提问来源于stack exchange,提问作者Zac
相关产品推荐
相关产品推荐

