You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:22:55