VBA运行时错误'91':对象变量或With块变量未设置求助
解决Run-time error '91':对象未设置的问题
嘿,这个Run-time error '91'太常见了——你已经声明了wb和ws这两个对象变量,但完全没给它们赋值指向实际的工作簿/工作表,VBA根本不知道要操作哪张表,可不就报错了嘛!
核心问题分析
你的代码里只做了变量声明:
Dim wb As Workbook Dim ws As Worksheet
但没有用Set语句把它们绑定到具体的文件或工作表上。打个比方,你告诉别人“我要拿杯子喝水”,但没说拿哪个杯子,别人肯定懵圈。
另外,你的循环还有个潜在大坑:如果所有行的日期都满足<= DateAdd("d",14,Now())的条件,循环会一直往下读空单元格,不仅可能触发新的错误,还会无限运行。
修改后的完整代码
我帮你修正了对象绑定、循环边界,还优化了行索引逻辑(避免原代码里容易搞混的count+1):
Sub Button1_Click() Dim wb As Workbook Dim ws As Worksheet Dim count As Integer Dim lastRow As Long ' 存储数据最后一行的行号,防止无限循环 ' 关键步骤:给对象变量赋值,明确指定要操作的工作簿和工作表 Set wb = ThisWorkbook ' 指当前运行这段代码的工作簿 Set ws = wb.Worksheets("Sheet1") ' 替换成你实际的工作表名称,比如"数据表" count = 0 ' 获取A列最后一行有数据的行号 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row Do While (2 + count) <= lastRow ' 先判断是否超出数据范围 Dim currentIssueDate As Date ' 临时捕获日期转换错误,避免遇到非日期单元格崩溃 On Error Resume Next currentIssueDate = CDate(ws.Cells(2 + count, 1).Value) On Error GoTo 0 ' 仅当日期有效且满足条件时执行着色逻辑 If Not IsEmpty(currentIssueDate) And currentIssueDate <= CDate(DateAdd("d", 14, Now())) Then ' 给Issue Date列对应行着色 ws.Range("A" & (2 + count)).Interior.Color = RGB(250, 50, 50) ' 对比Issue Date和Maturity列的值 If CDate(ws.Cells(2 + count, 1).Value) <> CDate(ws.Cells(2 + count, 2).Value) Then If ws.Range("C" & (2 + count)).Value <> "In Sub" Then ws.Range("C" & (2 + count)).Interior.Color = RGB(250, 50, 50) Else ws.Range("C" & (2 + count)).Interior.ColorIndex = 44 End If End If End If count = count + 1 Loop End Sub
重要修改点说明
- 对象绑定:通过
Set wb = ThisWorkbook和Set ws = wb.Worksheets("Sheet1")明确告诉VBA要操作哪个文件和工作表,一定要把"Sheet1"改成你实际的工作表名称! - 循环边界控制:用
lastRow获取数据最后一行,避免循环无限运行或读取空单元格 - 行索引优化:直接用
2 + count对应数据行(你的数据从第2行开始),比原代码的count+1更直观,不容易出错 - 错误防护:添加了日期转换的错误捕获,防止遇到非日期格式的单元格导致程序崩溃
内容的提问来源于stack exchange,提问作者rbonac




