Excel中VBA的Union Range为何选中未指定的单元格?
问题根源及修复方案
兄弟,你的问题出在构建unionRange的代码里!
错误原因分析
看这行代码:
Set unionRange = Union(.Range("G48:G48"), .Range("G51:G51"), .Range("G55:G55"), .Range("G58:G58"), .Range("G60:G60"), .Range("G61:G61", .Range("G63:G63")))
这里的.Range("G61:G61", .Range("G63:G63"))是关键错误——VBA中Range对象的双参数语法Range(单元格1, 单元格2),表示的是从单元格1到单元格2的连续区域,而不是两个独立的单元格。所以这行代码实际生成的是G61:G63这个连续范围,自然包含了你没打算选中的G62单元格,它也就跟着执行了+1的操作。
修复后的代码
把G61和G63拆成两个独立的.Range()参数,加入到Union函数中即可:
Sub Fill_123() Dim unionRange As Range Dim ws As Worksheet Set ws = Worksheets(1) With ws Set unionRange = Union(.Range("G48"), .Range("G51"), .Range("G55"), .Range("G58"), .Range("G60"), .Range("G61"), .Range("G63")) ' 顺便提一句:单个单元格可以直接写.Range("G48"),不用写成.Range("G48:G48"),效果一样更简洁 End With Dim myCell As Range For Each myCell In unionRange If myCell.Address = "$G$60" Then myCell = myCell + 1 ElseIf myCell.Address = "$G$63" Then myCell = myCell + 3 Else myCell = myCell + 1 End If Next End Sub
另外,你代码里的If-ElseIf-Else逻辑可以简化,因为G60和其他非G63的单元格都是+1,可以改成:
For Each myCell In unionRange If myCell.Address = "$G$63" Then myCell = myCell + 3 Else myCell = myCell + 1 End If Next
这样代码更简洁,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者NielsStenden
相关产品推荐
相关产品推荐

