VBA遍历D6至第6行行尾添加字典键报91错误如何修复
VBA运行触发91错误修复方案
错误原因
运行时错误91是对象变量未设置/未实例化,你的代码存在3个核心问题:
With tg块里的tg对象没有提前声明、也没有通过Set赋值,VBA找不到对应工作表对象,是触发91错误的直接原因。- 遍历范围参数完全错位:
Cells的参数规则是(行号, 列号),你写的.Cells(.Columns.Count, 2).End(xlToLeft)实际是取B列最后一行位置向左查找非空单元格,和你要遍历第6行D列向右区域的需求完全不符。 - 声明的
Dim i As Long变量从未被调用,属于冗余代码。
修复步骤
- 补充
tg工作表变量的声明与赋值:如果操作当前激活的工作表就写Set tg = ActiveSheet,如果操作指定名称的工作表就写Set tg = ThisWorkbook.Worksheets("你的工作表实际名称") - 修正遍历范围逻辑:第6行最右侧非空单元格的正确写法是
.Cells(6, .Columns.Count).End(xlToLeft),行号固定为6,从最大列位置向左查找非空值作为遍历终点 - 可选:删除未使用的
i变量声明,精简代码
修复后完整代码
Function list() Dim currCell As Range Dim dict As Object Dim tg As Worksheet ' 补充缺失的工作表对象声明 Set dict = CreateObject("Scripting.Dictionary") ' 赋值要操作的工作表,可根据实际需求替换为指定工作表 Set tg = ActiveSheet With tg ' 修正遍历范围:从D6开始,到第6行最右侧非空单元格截止 For Each currCell In .Range("D6", .Cells(6, .Columns.Count).End(xlToLeft)) If Not dict.Exists(currCell.Value) And Not IsEmpty(currCell) Then dict.Add currCell.Value, "" End If Next currCell End With Set list = dict End Function
补充边界处理提示:如果第6行D列右侧完全没有内容,
.End(xlToLeft)会定位到D列左侧的单元格,导致遍历范围反向。如果需要强制至少遍历D6单元格,可以提前判断终点列号,若列号小于4(D列对应列号为4),就把遍历终点手动设为D6即可。
内容的提问来源于stack exchange,提问作者Jia Hannah
相关产品推荐
相关产品推荐

