VBA宏求助:实现仅复制单元格值至新文档
修改建议:仅复制单元格值的VBA宏调整
你的代码里有两处复制操作,其中第二处循环内的复制逻辑直接使用Copy方法,会保留源单元格的公式。同时,针对筛选后的可见行,也可以优化获取方式,避免不必要的循环判断。以下是修改后的代码:
Sub TestThat() Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Estimated Bill of Materials") Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Copyable ROM") Dim sourceRange As Range: Set sourceRange = ws1.Range("B2:C7") Dim targetRow As Long Dim visibleRows As Range, rw As Range ' 复制B2:C7区域的值 ws2.Visible = xlSheetVisible sourceRange.Copy ws2.Range("B2").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False ' 清空目标区域 ws2.Range("B12:J100").Clear ' 处理筛选后的可见行(第12行及以下,第1-7列) Set visibleRows = ws1.Range("A12:G" & ws1.Range("B100").End(xlUp).Row).SpecialCells(xlCellTypeVisible) For Each rw In visibleRows.Rows targetRow = ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1 ' 仅复制值到目标行 ws2.Range("A" & targetRow & ":G" & targetRow).Value = rw.Value Next rw ' 复制工作表到新工作簿 ws2.Copy ws2.Visible = xlSheetHidden End Sub
关键修改点:
- 循环内的复制逻辑:替换原有的
Copy方法,直接通过.Value = rw.Value赋值的方式仅复制单元格值,彻底避免公式被复制。 - 筛选可见行的获取:使用
SpecialCells(xlCellTypeVisible)直接获取筛选后的可见行,替代原有的循环判断第9列是否为*,更贴合“筛选后可见内容”的需求(如果原判断逻辑是业务需要,可保留循环,但复制部分仍需改成赋值方式)。 - 取消不必要的Activate/Select:VBA代码应尽量避免使用
Activate和Select,直接通过工作表对象引用单元格,提升代码稳定性和效率。
内容的提问来源于stack exchange,提问作者Zachary Naylor
相关产品推荐
相关产品推荐

