求助:VBA运行时错误'91'(对象变量或With块变量未设置)解决
排查VBA运行时错误'91':对象变量未设置
嘿,我来帮你搞定这个烦人的错误!运行时错误'91'本质就是你声明了对象变量,但没给它分配实际的对象实例——虽然你说脚本功能正常,那大概率是错误出现在某个你没完全贴出来的代码分支里,比如初始化过程或者调用的子过程中。
先拆解可能的问题点:
1. UserForm_Initialize过程里的wb变量未赋值
你只写了Dim wb As Workbook...,但如果后续代码里用到了这个wb对象(比如wb.Sheets("XXX")),却没执行Set语句给它分配具体工作簿,就会直接触发错误91。
修复示例:
Public Sub UserForm_Initialize() Dim wb As Workbook ' 必须用Set给对象变量赋值,这里用ThisWorkbook指代当前运行代码的工作簿 Set wb = ThisWorkbook ' 如果你要指定其他工作簿,就写:Set wb = Workbooks("你的文件名.xlsm") ' 后续用到wb的代码... End Sub
2. GetCabinet1子过程存在未初始化的对象变量
你没贴这个过程的代码,但它是触发错误的高危区域。如果里面声明了对象类型变量(比如Worksheet、Range、Chart),却没通过Set语句绑定具体对象,直接调用对象的方法/属性就会报错。
错误示例(会触发91):
Sub GetCabinet1() Dim ws As Worksheet ' 错误:直接给对象变量赋值,没加Set ws = Sheets("CabinetSheet") ws.Range("B5").Value = "Test" End Sub
正确写法:
Sub GetCabinet1() Dim ws As Worksheet ' 用Set绑定具体工作表对象 Set ws = ThisWorkbook.Sheets("CabinetSheet") ws.Range("B5").Value = "Test" End Sub
3. 额外优化:避免不必要的Select操作
你的CommandButton1_Click里的rng.Select完全没必要,直接给rng赋值就行。Select方法依赖当前激活的工作表,反而容易引发其他问题,删掉它代码会更稳定:
Public Sub CommandButton1_Click() Dim rng As Range Set rng = Range("F24:I24") ' 删掉rng.Select If TextBox1.Text = "" Then MsgBox ("Must insert Temperature you dingus!") Else rng = TextBox1.Text Call GetCabinet1 End If Unload Me End Sub
按照上面的步骤检查补全代码,应该就能彻底消除这个错误啦!
内容的提问来源于stack exchange,提问作者Bill Woodward




