求和A、B两行至C列时触发"对象变量未设置"错误,类模块代码报错求助
解决VBA中"object variable or with block variable not set"错误及类模块sum方法报错问题
我来帮你一步步排查和解决这两个问题:
首先,分析核心错误原因
你遇到的object variable or with block variable not set(运行时错误91),本质是类里的对象变量c没有被赋值指向一个实际的Excel单元格区域(Range对象),就直接在sum方法里调用它的Offset属性了。另外你的sum方法代码里还有个明显的拼写乱码错误,这也会导致语法报错。
第一步:修正类模块clscustomer的代码
先把类里的错误语法和逻辑漏洞补上,这里是修正后的代码:
Public z As Integer Public rng As Range Public c As Range Public Sub sum(x As Integer, y As Integer) ' 先做安全检查:如果c还没赋值,直接提示并退出 If c Is Nothing Then MsgBox "请先为c对象指定一个有效的单元格!", vbExclamation Exit Sub End If z = x + y ' 加法逻辑本身没问题,只要x/y是有效整数 c.Offset(0, 2).Value = z ' 删掉了原来的乱码错误 End Sub
第二步:确保调用类时正确实例化并赋值对象变量
光改类还不够,你在调用这个类的代码里,必须用Set关键字给c赋值一个真实的Range对象,同时要先实例化类本身。比如在标准模块里写调用代码:
Sub CalculateAndStoreSum() Dim cust As clscustomer ' 必须先实例化类对象,不能直接用 Set cust = New clscustomer ' 给c赋值为你要操作的单元格,比如A1(根据你的实际需求改) Set cust.c = ThisWorkbook.Sheets("Sheet1").Range("A1") ' 传入A行和B行的数值,比如A1和B1的值,调用sum方法 cust.sum _ x:=ThisWorkbook.Sheets("Sheet1").Range("A1").Value, _ y:=ThisWorkbook.Sheets("Sheet1").Range("B1").Value End Sub
关键注意点
- 对象变量必须用
Set赋值:普通变量用=,但Range、类对象这类引用类型,必须用Set关键字赋值,这是VBA的核心规则。 - 避免空对象调用:在使用任何对象变量(比如
c)之前,一定要确认它不是Nothing(也就是已经指向了实际对象),否则就会触发错误91。 - 语法错误要仔细检查:你原来代码里的
\error hereva是无效的语法,属于手误,必须删掉或者改成正确的注释(用'开头)。
额外优化建议
为了让代码更健壮和易读,你可以:
- 给变量起更有意义的名字:比如把
z改成sumResult,c改成sourceCell,别人(包括未来的你)看代码时能瞬间明白用途。 - 给类添加初始化事件:在类模块里加
Class_Initialize事件,在实例化类时可以做一些默认配置,比如:
Private Sub Class_Initialize() ' 可以默认指定c为Sheet1的A1,或者留空让外部赋值 ' Set c = ThisWorkbook.Sheets("Sheet1").Range("A1") End Sub
内容的提问来源于stack exchange,提问作者kuldeep singh
相关产品推荐
相关产品推荐

