VBA按列号引用列时如何避免使用Select方法
优化后代码(移除Select且保留原有Copy逻辑)
' 变量声明建议放在循环外,VBA循环内重复声明变量不会缩小作用域,属于冗余写法 Dim ValCol As Long Dim lRow As Long For i = 1 To 300 ValCol = 9 + i ' 所有单元格对象显式指定所属工作表,无需提前激活选择 Sheet19.Range(Sheet19.Cells(2, ValCol), Sheet19.Cells(23, ValCol)).Copy ' 每次粘贴前计算目标表的最新追加行,可根据业务逻辑调整该行的位置 lRow = Sheet25.Cells(Sheet25.Rows.Count, "A").End(xlUp).Row + 1 Sheet25.Range("J" & lRow & ":J" & lRow + 21).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Next
更高性能的优化版本(无需Copy,直接赋值)
不需要操作剪切板,运行效率更高,代码更简洁:
Dim ValCol As Long Dim lRow As Long For i = 1 To 300 ValCol = 9 + i lRow = Sheet25.Cells(Sheet25.Rows.Count, "A").End(xlUp).Row + 1 ' 源区域和目标区域大小匹配时,可直接赋值传递内容 Sheet25.Range("J" & lRow & ":J" & lRow + 21).Value = Sheet19.Range(Sheet19.Cells(2, ValCol), Sheet19.Cells(23, ValCol)).Value Next
可选简化写法(With语句避免重复写工作表名)
Dim ValCol As Long Dim lRow As Long With Sheet19 For i = 1 To 300 ValCol = 9 + i lRow = Sheet25.Cells(Sheet25.Rows.Count, "A").End(xlUp).Row + 1 Sheet25.Range("J" & lRow & ":J" & lRow + 21).Value = .Range(.Cells(2, ValCol), .Cells(23, ValCol)).Value Next End With
修改说明
- 原有代码必须使用
Select的核心原因:未显式指定所属工作表的Range、Cells对象,默认指向当前活动工作表,所以必须先选中Sheet19才能保证操作的是目标表的单元格 - 给所有单元格对象前加上所属工作表的限定,就完全不需要依赖激活/选择操作
- 直接赋值的方式避免了剪切板操作,大批量数据处理时速度优势会非常明显
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

