Excel VBA中Target.Address配合Offset使用及代码无响应问题
问题背景
需求为修改工作表G4单元格内容时,自动复制G4所在行的对应列区域内容。实际运行时修改G4单元格后,代码无任何执行响应。
原有代码如下:
Private Sub Worksheet_Change3(ByVal Target As Range) If Target.Address = "$G$4" Then Range("G4").Select Selection.Offset(0, -6).Resize(Selection.Rows.Count + 0, _ Selection.Columns.Count + 2).Copy End If End Sub
故障原因
- 事件过程命名不符合Excel VBA的固定规则:工作表内容修改触发的Change事件,要求过程名必须严格为
Worksheet_Change,你写的Worksheet_Change3属于普通自定义过程,不会在单元格内容变更时被自动调用,这是代码完全不运行的核心原因。 - 代码中使用
Select、Selection操作选中单元格的写法属于冗余逻辑,不仅效率低,还容易因为工作表激活状态、选中对象变化触发运行时错误。
修正方案
将以下代码粘贴到对应工作表的代码模块中即可正常触发:
Private Sub Worksheet_Change(ByVal Target As Range) ' 判断当前修改的单元格是否为G4 If Target.Address = "$G$4" Then ' 直接定位目标区域复制,无需选中单元格:从G4向左偏移6列(即A列)开始,取1行3列的区域(A:C列)执行复制 Target.Offset(0, -6).Resize(1, 3).Copy ' 如果需要指定复制粘贴的目标位置,可按如下格式书写,示例为粘贴到J4起始位置 ' Target.Offset(0, -6).Resize(1, 3).Copy Range("J4") End If End Sub
提示:如果需要调整复制的列范围,直接修改
Resize方法的第二个参数即可,参数值为需要复制的总列数。
内容的提问来源于stack exchange,提问作者Ophelia Vallee
相关产品推荐
相关产品推荐

