VBA实现跨工作表排除区域功能时出现Intersect方法报错
报错核心原因
Intersect是全局Application对象下的方法,有两个不可绕过的调用限制:
- 传入的两个Range参数必须属于同一张工作表,跨表的Range对象直接传入时,会直接触发
Method 'Intersect' of object '_Global' failed错误 - 如果传入的Range对象本身是Nothing(比如ListObject没有数据行时,DataBodyRange会返回空值),也会连带触发方法调用失败
原代码的问题触发路径
你代码里的逻辑是遍历两个分属Sheet1、Sheet2的表格列范围,每次都拿当前作用域下的Target和遍历到的rRange直接传给Intersect做相交判断:
- 当遍历到和Target所属工作表不一致的rRange时,两个跨表的Range对象被直接传入Intersect,就是触发报错的直接原因
- 代码没有做空值校验,如果两个表格没有填充有效数据行,赋值给rExclude数组的就是空对象,后续遍历环节也会触发对象引用错误
修正后的可运行代码
Dim rExclude(1) As Range, idx As Integer, rRange As Range ' 赋值阶段增加容错,避免DataBodyRange为空导致的赋值报错 On Error Resume Next Set rExclude(0) = ThisWorkbook.Worksheets("Sheet1").ListObjects("Table").ListColumns("Column").DataBodyRange Set rExclude(1) = ThisWorkbook.Worksheets("Sheet2").ListObjects("Table").ListColumns("Column").DataBodyRange On Error GoTo 0 For idx = 0 To 1 ' 跳过空的排除范围 If Not rExclude(idx) Is Nothing Then ' 仅当两个范围属于同一张工作表时,才调用Intersect做相交判断,从根源避免跨表传参的报错 If rExclude(idx).Worksheet.Name = Target.Worksheet.Name Then If Not Intersect(Target, rExclude(idx)) Is Nothing Then Exit Sub End If End If Next idx
逻辑说明:如果你这段代码是写在工作表Change/SelectionChange这类事件过程里,Target本身就只会是当前触发事件工作表上的范围,和其他工作表的范围本来就不可能产生交集,之前跨表传参给Intersect的逻辑本身就是无效操作。增加工作表匹配判断之后,既不会触发方法报错,也完全实现了“跨表配置排除区域,命中对应工作表的排除列就退出过程”的功能。
内容的提问来源于stack exchange,提问作者user2319146
相关产品推荐
相关产品推荐

