整天和数据打交道的同行,多少都遇到过这种崩溃时刻——
一份汇总表套了七八层公式,引用了十几个外部工作簿,好不容易算完了,结果要发给领导审阅或者存档时,打开一看满屏「#REF!」「#VALUE!」。为啥?因为源文件路径变了,或者对方根本没收到你引用的那些工作簿。
还有一种情况:别人发来的表格,每个单元格都带着蓝色下划线,点一下就跳转到不知名的网页或文件位置,想批量去掉又无从下手,一个个右键清除超链接,光一个表就得点几十次。
更头疼的是外部链接,藏在公式深层引用里,你「编辑链接」里看得到,但断开的时候一个接一个弹确认框,断完手都酸了。
那么有没有快速的解决的方法呢?试试VBA吧
先说解决方案:打开 Excel 自带的 VBA 编辑器(快捷键 Alt + F11),粘贴一段代码,按一下运行,三秒钟搞定。
下面是具体操作步骤:
第一步:打开 VBA 编辑器
在 Excel 中按快捷键 Alt + F11,会弹出 VBA 编辑器窗口。
如果你是第一次打开这个界面,别慌,不用学编程,照着下面操作就行:
在左侧的「工程资源管理器」窗口里,找到你的工作簿名称(通常显示为 Project (你的文件名.xlsx)),右键点击 →「插入」→「模块」。右侧会弹出一个空白代码窗口,这就是我们写代码的地方。

第二步:粘贴代码
把下面这段代码完整复制粘贴进去:
Sub 清除公式和链接()Dim wb As WorkbookDim ws As WorksheetDim wsList As CollectionDim cell As RangeDim formulaCells As RangeDim usedRng As RangeDim linkSources As VariantDim i As LongDim formulaCount As LongDim linkCount As LongDim hyperCount As LongDim wsCount As LongDim formatFixCount As LongDim scope As StringDim confirmResult As VbMsgBoxResultDim origValue As VariantDim needRestore As BooleanSet wb = ActiveWorkbookIf wb Is Nothing ThenMsgBox "没有活动工作簿。", vbExclamationExit SubEnd If' 确认弹窗confirmResult = MsgBox("本操作将清除所有公式(转为数值)和链接," & vbCrLf & _"原表格内容和格式保持不变。" & vbCrLf & vbCrLf & _"是否继续?", vbYesNo + vbExclamation, "清除公式和链接")If confirmResult = vbNo Then Exit Sub' 选择范围scope = InputBox("请选择清除范围:" & vbCrLf & _"1 - 当前工作表" & vbCrLf & _"2 - 整个工作簿", "清除公式和链接", "2")If scope = "" Then Exit SubIf scope <> "1" And scope <> "2" ThenMsgBox "输入无效,请输入1或2。", vbExclamationExit SubEnd IfformulaCount = 0linkCount = 0hyperCount = 0formatFixCount = 0Application.ScreenUpdating = FalseApplication.Calculation = xlCalculationManual' 构建工作表集合Set wsList = New CollectionIf scope = "1" ThenwsList.Add ActiveSheetwsCount = 1ElseFor Each ws In wb.WorksheetswsList.Add wsNext wswsCount = wsList.CountEnd If' 1. 断开外部链接(仅整个工作簿模式,BreakLink为工作簿级操作)If scope = "2" ThenlinkSources = wb.LinkSources(xlExcelLinks)If IsArray(linkSources) ThenFor i = 1 To UBound(linkSources)On Error Resume Nextwb.BreakLink Name:=linkSources(i), Type:=xlLinkTypeExcelLinksOn Error GoTo 0linkCount = linkCount + 1Next iEnd IfEnd If' 2. 遍历工作表:清除超链接 + 公式转值For Each ws In wsList' 清除超链接hyperCount = hyperCount + ws.Hyperlinks.Countws.Hyperlinks.Delete' 公式转值On Error Resume NextSet usedRng = ws.UsedRangeOn Error GoTo 0If Not usedRng Is Nothing ThenOn Error Resume NextSet formulaCells = usedRng.SpecialCells(xlCellTypeFormulas)On Error GoTo 0If Not formulaCells Is Nothing ThenFor Each cell In formulaCellsOn Error Resume NextorigValue = cell.ValueIf Err.Number = 0 ThenneedRestore = False' 仅对文本类型值做精度保护' VarType 8 = vbStringIf VarType(origValue) = vbString Then' 转值:公式结果写入单元格cell.Value = origValue' 检测类型是否从文本变为数值' 如果变了,说明Excel把文本当数字解析了If VarType(cell.Value) <> vbString ThenneedRestore = TrueEnd IfElse' 数值/日期/错误等类型,直接转值无精度问题cell.Value = origValueEnd If' 精度丢失 → 强制文本格式写回原始完整值If needRestore Thencell.NumberFormat = "@"cell.Value = origValueformatFixCount = formatFixCount + 1End IfformulaCount = formulaCount + 1ElseErr.ClearEnd IfOn Error GoTo 0Next cellEnd IfEnd IfSet usedRng = NothingSet formulaCells = NothingNext wsApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = True' 结果输出Dim msg As StringIf scope = "1" Thenmsg = "当前工作表已处理完毕。" & vbCrLf & vbCrLfElsemsg = "已处理 " & wsCount & " 个工作表。" & vbCrLf & vbCrLfEnd Ifmsg = msg & "公式转值:" & formulaCount & " 个" & vbCrLfIf scope = "2" Thenmsg = msg & "外部链接断开:" & linkCount & " 个" & vbCrLfEnd Ifmsg = msg & "超链接清除:" & hyperCount & " 个" & vbCrLfmsg = msg & "格式修正(精度保护):" & formatFixCount & " 个"MsgBox msg, vbInformation, "清除公式和链接"End Sub
第三步:运行代码
在代码窗口任意位置点一下,然后按快捷键 F5(或点击上方工具栏的绿色播放按钮),代码就开始执行了。


可以根据需求处理当前工作表,或者整个工作簿,如果你的工作簿有非常多工作表(比如几十个),运行时会多花几秒钟,属正常现象,耐心等提示框弹出即可。
运行完毕后,会弹出一个提示框,关掉窗口,回到 Excel 看看所有公式已经变成了纯数值,外部链接全部断开,超链接也清干净了。整份表变成了一份「静态数据」,发给谁都不会再出问题。格式也完全没有乱。

补充说明:
运行前建议先保存一份原始文件备份,因为公式一旦转为数值就不可逆了,万一后面还需要用公式,还能找回来。

夜雨聆风