You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA编译错误:调用CountIf时提示“Method or data member not found”

问题分析与代码修正

错误提示翻译

编译错误:未找到方法或数据成员

核心问题点

  1. ws1未初始化且方法调用错误:
    • 仅声明了ws1 As Worksheet但未通过Set语句赋值(如Set ws1 = ActiveSheet),导致对象引用无效。
    • Worksheet对象没有CountIf方法,该方法属于WorksheetFunction对象;且原需求是统计单元格内"B"的出现次数,CountIf只能统计符合条件的单元格数量,无法满足需求。
  2. Range参数语法错误:
    • Range(lrNew, "K")写法错误,Range的参数需为单元格地址格式(如Range("K" & lrNew)表示单个单元格,Range("K2:K" & lrNew)表示区域)。
  3. 未声明变量:
    • sr、lr变量未声明,违反VBA变量声明规范,易引发逻辑错误。
  4. 逻辑偏差:
    • 原代码仅检查最后一行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:15:20