VBA用户窗体调用函数出现Error 91(对象变量未设置)问题求助
问题分析与解决方法
核心问题1:函数名拼写错误
你的函数定义是find_prevconfig,但内部赋值时写成了find_preconfig(少了一个字母v),这导致函数根本没有返回正确的Range对象,始终返回Nothing,这是Error 91的主要原因。
核心问题2:未处理函数无匹配的情况
如果循环遍历完0到30行都没找到"Y",函数没有设置返回值,此时orivalue会是Nothing,直接用MsgBox(orivalue)就会报错。
核心问题3:未明确指定工作表
用户窗体中使用Range时,默认指向当前激活的工作表,可能和你实际要操作的工作表不符,导致查找失败。
核心问题4:直接输出Range对象
MsgBox不能直接输出Range对象,需要调用它的.Value属性来获取单元格内容。
修正后的代码
1. 修正后的函数
Function find_prevconfig(x2 As Integer) As Range ' 明确指定工作表,替换成你实际使用的表名 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") Dim y As Integer ' 声明变量y,避免使用未声明的变体变量 For y = 0 To 30 If ws.Range("E590").Offset(y, x2).Value = "Y" Then Set find_prevconfig = ws.Range("C590").Offset(y, 0) Exit Function End If Next y ' 没找到匹配项时明确返回Nothing Set find_prevconfig = Nothing End Function
2. 修正后的事件子程序
Private Sub btn_confirm_Click() Dim orivalue As Range Dim i As Integer Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") ' 同步指定工作表 For i = 0 To 30 ' 明确引用工作表的Range,避免激活表变化引发错误 If ws.Range("E26").Offset(0, i).Value = ws.Range("J6").Value Then Set orivalue = find_prevconfig(i) ' 先判断对象是否存在,再执行输出 If Not orivalue Is Nothing Then MsgBox orivalue.Value ' 输出单元格的值而非对象本身 Else MsgBox "未找到匹配的配置项" End If End If Next i End Sub
额外建议
- 在所有VBA模块顶部添加
Option Explicit,开启强制变量声明,编译器会提醒你未声明的变量(比如原代码中未声明的y),减少低级错误。 - 所有Range操作都明确指定工作表,彻底避免因激活表变化导致的引用错误。
内容的提问来源于stack exchange,提问作者taqiuddin yusri
相关产品推荐
相关产品推荐

