VBA复制其他工作簿工作表时值错误,如何修改为仅粘贴值和格式?
修改后的VBA代码
Sub GetSheets() Dim Path As String Dim Filename As String Dim SourceWb As Workbook Dim SourceWs As Worksheet Dim TargetWs As Worksheet Path = "XXXX" '替换为你的实际路径 Filename = Dir(Path & "*.xlsx") Do While Filename <> "" '打开源工作簿,只读模式 Set SourceWb = Workbooks.Open(Filename:=Path & Filename, ReadOnly:=True) On Error Resume Next '防止源工作簿没有"SAC Input"工作表报错 Set SourceWs = SourceWb.Worksheets("SAC Input") On Error GoTo 0 If Not SourceWs Is Nothing Then '在当前工作簿新建工作表,放在最前面 Set TargetWs = ThisWorkbook.Sheets.Add(Before:=ThisWorkbook.Sheets(1)) '命名新工作表为源工作簿名称(去掉.xlsx后缀) TargetWs.Name = Left(Filename, Len(Filename) - 5) '复制源工作表的已使用区域 SourceWs.UsedRange.Copy '粘贴值,切断外部链接 TargetWs.Range("A1").PasteSpecial Paste:=xlPasteValues '粘贴格式(含单元格样式、列宽) TargetWs.Range("A1").PasteSpecial Paste:=xlPasteFormats TargetWs.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths Application.CutCopyMode = False '清除复制状态 End If '关闭源工作簿,不保存任何修改 SourceWb.Close SaveChanges:=False Set SourceWs = Nothing Set SourceWb = Nothing Filename = Dir() Loop End Sub
核心改动说明
- 放弃直接复制整个工作表的方式,改为复制源表已使用区域+选择性粘贴,彻底避免外部链接和公式错误。
- 新增错误处理逻辑:如果源工作簿没有"SAC Input"工作表,代码自动跳过该文件,不会中断运行。
- 用明确的对象变量(
SourceWb、TargetWs)替代不稳定的ActiveSheet引用,提升代码可靠性。 - 工作表命名自动去掉
.xlsx后缀,避免名称冗余或触发命名规则冲突。
内容的提问来源于stack exchange,提问作者Apex
相关产品推荐
相关产品推荐

