如何避免复制.xlsm工作表到.xlsx时生成源文件链接?
解决复制xlsm工作表到xlsx时出现外部链接的问题
手动操作方案
复制前预处理(推荐)
- 打开源xlsm文件,切换到「数据」选项卡,点击「编辑链接」
- 在弹出的窗口中选中所有外部链接,点击「断开链接」并确认
- 再按你之前的步骤复制工作表到目标xlsx,新文件不会携带指向原xlsm的链接
复制后补救
如果已经完成复制才发现链接问题,打开目标xlsx文件:
- 同样进入「数据」→「编辑链接」,选中所有链接执行「断开链接」即可清除
VBA自动化方案(适配Excel最新更新)
以下代码可直接实现无链接、无ActiveX问题的工作表复制,替代失效的直接另存为方法:
Sub CopySheetsToXLSXWithoutLinks() Dim sourceWB As Workbook Dim targetWB As Workbook Dim ws As Worksheet Dim links As Variant Dim i As Integer ' 关闭警告和屏幕刷新,提升效率 Application.DisplayAlerts = False Application.ScreenUpdating = False ' 定义源工作簿(当前运行代码的xlsm文件) Set sourceWB = ThisWorkbook ' 新建空白xlsx工作簿 Set targetWB = Workbooks.Add(xlWBATWorksheet) ' 复制指定工作表(示例为复制无ActiveX控件的工作表,可按需修改) For Each ws In sourceWB.Worksheets ' 跳过含ActiveX控件的工作表,避免保存报错 If ws.Shapes.Count = 0 Then ws.Copy After:=targetWB.Sheets(targetWB.Sheets.Count) End If Next ws ' 删除目标工作簿默认的空白工作表 If targetWB.Sheets.Count > 1 Then targetWB.Sheets(1).Delete End If ' 断开目标工作簿所有外部链接 links = targetWB.LinkSources(xlExcelLinks) If Not IsEmpty(links) Then For i = LBound(links) To UBound(links) targetWB.BreakLink Name:=links(i), Type:=xlExcelLinks Next i End If ' 保存目标文件,替换为你的实际保存路径 targetWB.SaveAs Filename:="C:\YourFolder\YourTargetFile.xlsx", FileFormat:=xlOpenXMLWorkbook targetWB.Close sourceWB.Activate ' 恢复Excel默认设置 Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
代码说明
- 自动跳过含ActiveX控件的工作表,若需保留工作表可添加
ws.Shapes.Delete代码移除控件(注意区分普通形状和ActiveX控件) - 主动扫描并断开目标文件的所有外部链接,彻底清除原xlsm的引用
- 采用「新建xlsx+复制工作表」的逻辑,规避Excel更新后直接另存为xlsx的兼容性问题
内容的提问来源于stack exchange,提问作者pandre45
相关产品推荐
相关产品推荐

