VBA操作Range触发run time error 91对象变量未设置报错求助
错误根因
运行时错误91的触发原因非常明确:你声明了AllData Range类型对象变量,但从未用Set关键字将实际单元格区域赋值给该变量。Selection.Name = "AllData"只是在工作表中创建了一个名为"AllData"的命名区域,并没有把这个区域和你定义的AllData变量做关联,此时AllData变量值为Nothing,访问其属性自然会报错。
原代码还存在几个潜在问题:
- 依赖
Select/Selection操作单元格,稳定性差,一旦工作表未激活、用户选中区域变化就会出问题 - 用
Integer类型存储行数,当数据行数超过32767时会触发溢出错误 AllData("D" & i)的单元格引用写法不符合Range对象规则,容易出现列定位偏移
修正后代码
Sub ChngColW() Dim AllData As Range Dim No_Of_Rows As Long Dim i As Long Dim ws As Worksheet ' 绑定当前工作表,避免激活状态干扰 Set ws = ActiveSheet ' 直接定位A1所在连续数据块,和手动按Ctrl+方向键选中效果一致,无需选中操作 Set AllData = ws.Range("A1").CurrentRegion ' 为区域命名 AllData.Name = "AllData" No_Of_Rows = AllData.Rows.Count ' 如果数据有表头,循环起始值改为2即可跳过表头行 For i = 1 To No_Of_Rows ' 定位区域内第i行第4列(D列)判断值 If AllData.Cells(i, 4).Value = "X" Then ' 修改对应行第23列(W列)的值 AllData.Cells(i, 23).Value = "No" End If Next i End Sub
关键修改说明
- 用
Set AllData = ws.Range("A1").CurrentRegion直接将数据区域赋值给对象变量,从根源解决对象未实例化的91错误。如果要保留原代码先选中再命名的逻辑,只需要在Selection.Name = "AllData"后加一行Set AllData = Range("AllData")也能解决报错,但直接绑定区域不做选中操作的写法稳定性更高。 - 将
No_Of_Rows的类型从Integer改为Long,避免数据量较大时出现溢出问题。 - 把错误的
AllData("D" & i)引用方式改为AllData.Cells(i, 列序号),通过区域内相对坐标定位单元格,不会受工作表其他区域影响,定位更准确。 - 显式绑定工作表对象,避免跨工作表操作时出现区域定位错误。
内容的提问来源于stack exchange,提问作者Kaveh Dianati
相关产品推荐
相关产品推荐

