VBA如何不使用Select和PasteSpecial跨工作表复制值与格式
实现方案
直接通过区域值直接赋值的方式即可实现需求,全程不需要使用.Select选中操作,也不需要调用PasteSpecial.Values剪贴板粘贴逻辑,运行效率远高于原生复制粘贴,改造成本极低,适合批量修改数百段同类代码。
原代码的等价替换版本
你给出的示例代码可以直接替换为以下内容,运行效果和原代码完全一致:
Dim sourceRng As Range ' 绑定源区域 Set sourceRng = Sheets("Regular Tournament").Range("B22:B221") With Sheets("Score Input-Flights").Range("D13").Resize(sourceRng.Rows.Count, sourceRng.Columns.Count) ' 直接写入数值,自动忽略源区域公式,等价于值粘贴 .Value = sourceRng.Value ' 同步数字格式,等价于格式粘贴的核心效果 .NumberFormat = sourceRng.NumberFormat End With
批量修改通用模板
你手里的数百段同类代码,都可以套用下面的模板快速替换,只需要修改4处参数即可:
' ---只需要修改下面4个参数即可--- Const SOURCE_SHEET_NAME As String = "源工作表名称" Const SOURCE_RANGE_ADDR As String = "源区域地址,比如B22:B221" Const TARGET_SHEET_NAME As String = "目标工作表名称" Const TARGET_START_CELL As String = "目标粘贴起始单元格,比如D13" ' ---参数修改结束--- Dim srcRng As Range, tgtRng As Range Set srcRng = Sheets(SOURCE_SHEET_NAME).Range(SOURCE_RANGE_ADDR) Set tgtRng = Sheets(TARGET_SHEET_NAME).Range(TARGET_START_CELL).Resize(srcRng.Rows.Count, srcRng.Columns.Count) ' 写入纯数值 tgtRng.Value = srcRng.Value ' 如需同步格式,取消对应注释即可 ' tgtRng.NumberFormat = srcRng.NumberFormat ' 数字格式 ' tgtRng.Font.Name = srcRng.Font.Name ' 字体 ' tgtRng.Font.Size = srcRng.Font.Size ' 字号 ' tgtRng.Interior.Color = srcRng.Interior.Color ' 填充色
方案优势
- 无工作表切换、无选中操作,运行时不会出现屏幕跳闪
- 不调用系统剪贴板,不会干扰用户当前复制的内容,大区域数据传输速度比复制粘贴快10倍以上
- 逻辑稳定,不会出现因为工作表未激活、选区错位导致的粘贴位置错误问题
内容的提问来源于stack exchange,提问作者Charles Langston
相关产品推荐
相关产品推荐

