明明只有几MB的表格,却能卡到你怀疑人生
你是不是也遇到过这种情况:打开一个Excel文件,右下角一直转圈,鼠标变成圆圈圈,点哪儿都没反应;或者只是想删掉一行数据,Excel直接“未响应”,半小时的工作没保存……
如果你经常被Excel卡到崩溃,那很可能不是电脑的问题,而是你的表格里藏了太多“垃圾”。
当你从网页复制数据、频繁插入删除行、或者模板被人反复修改后,Excel会悄悄积累大量看不见的东西——透明的小图形、失效的链接、空白格式的残留……
这些东西你看不见,但它们确实存在。有人清理过一个看似简单的表格,结果发现了超过1万个隐藏对象。Excel要处理它们,能不卡吗?
Excel确实有个“定位对象”功能,但当隐藏对象成千上万时,一用这个功能Excel就直接卡死。
所以,我们需要一个更聪明的办法——VBA一键清理工具。
今天分享的代码,是升级版:
Option Explicit' 主程序:选择文件并优化Sub OptimizeSelectedWorkbook() Dim filePath As Variant Dim targetWb As Workbook Dim originalSize As Long Dim backupPath As String Dim answer As VbMsgBoxResult ' 让用户选文件 filePath = Application.GetOpenFilename( _ FileFilter:="Excel文件 (*.xls;*.xlsx;*.xlsm;*.xlsb),*.xls;*.xlsx;*.xlsm;*.xlsb", _ Title:="请选择要优化的Excel文件", _ MultiSelect:=False) If filePath = False Then Exit Sub ' 检查文件是否已打开 On Error Resume Next Set targetWb = Workbooks(filePath) On Error GoTo 0 If Not targetWb Is Nothing Then MsgBox "文件 '" & targetWb.Name & "' 已在Excel中打开,请先关闭。", vbExclamation Exit Sub End If ' 加速设置 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ' 打开文件 Set targetWb = Workbooks.Open(filePath, UpdateLinks:=0, ReadOnly:=False) originalSize = FileLen(filePath) ' 询问备份 answer = MsgBox("是否在优化前创建备份?", vbYesNo + vbQuestion, "备份提示") If answer = vbYes Then backupPath = CreateBackup(targetWb) MsgBox "备份已创建:" & vbCrLf & backupPath, vbInformation End If ' 执行优化 OptimizeWorkbook targetWb, originalSize ' 关闭文件(已保存) targetWb.Close SaveChanges:=False ' 恢复设置 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True MsgBox "优化完成!", vbInformationEnd Sub' 创建备份Function CreateBackup(wb As Workbook) As String Dim folder As String, nameOnly As String, ext As String folder = wb.Path & Application.PathSeparator nameOnly = Left(wb.Name, InStrRev(wb.Name, ".") - 1) ext = Mid(wb.Name, InStrRev(wb.Name, ".")) CreateBackup = folder & nameOnly & "_备份_" & Format(Now, "yyyymmdd_hhmmss") & ext wb.SaveCopyAs CreateBackupEnd Function' 核心优化Sub OptimizeWorkbook(wb As Workbook, originalSize As Long) Dim ws As Worksheet, lastCell As Range, shp As Shape, pt As PivotTable Dim nm As Name, sty As Style, i As Long Dim startTime As Double, newSize As Long startTime = Timer On Error Resume Next For Each ws In wb.Worksheets Set lastCell = ws.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious) If Not lastCell Is Nothing Then If lastCell.Column < ws.Columns.Count Then ws.Range(ws.Cells(1, lastCell.Column + 1), ws.Cells(ws.Rows.Count, ws.Columns.Count)).Delete End If If lastCell.Row < ws.Rows.Count Then ws.Range(ws.Cells(lastCell.Row + 1, 1), ws.Cells(ws.Rows.Count, ws.Columns.Count)).Delete End If End If Set lastCell = ws.UsedRange Next ws For Each nm In wb.Names If InStr(1, nm.RefersTo, "#REF!", vbTextCompare) > 0 Then nm.Delete Next nm Application.CutCopyMode = False Application.DisplayAlerts = False For Each ws In wb.Worksheets If Application.WorksheetFunction.CountA(ws.Cells) = 0 Then ws.Delete Next ws Application.DisplayAlerts = True For Each ws In wb.Worksheets For i = ws.Shapes.Count To 1 Step -1 Set shp = ws.Shapes(i) If shp.Visible = msoFalse Then shp.Delete ElseIf shp.Top > ws.UsedRange.Height + 500 Or shp.Left > ws.UsedRange.Width + 500 Then shp.Delete ElseIf shp.Height = 0 Or shp.Width = 0 Then shp.Delete ElseIf shp.Type <> msoPicture And shp.Fill.Visible = msoFalse And shp.Line.Visible = msoFalse Then shp.Delete End If Next i Next ws For Each ws In wb.Worksheets For Each pt In ws.PivotTables pt.PivotCache.MissingItemsLimit = xlMissingItemsNone pt.PivotCache.Refresh Next pt Next ws For Each sty In wb.Styles If Not sty.BuiltIn Then On Error Resume Next If Not sty.InUse Then sty.Delete On Error GoTo 0 End If Next sty On Error GoTo 0 wb.Save newSize = FileLen(wb.FullName) MsgBox "✅ 优化完成!" & vbCrLf & _ "原始大小: " & Format(originalSize / 1024, "#,##0.0") & " KB" & vbCrLf & _ "当前大小: " & Format(newSize / 1024, "#,##0.0") & " KB" & vbCrLf & _ "节省: " & Format((originalSize - newSize) / 1024, "#,##0.0") & " KB (" & _ Format((originalSize - newSize) / originalSize, "0.0%") & ")" & vbCrLf & _ "耗时: " & Format(Timer - startTime, "0.0") & " 秒", _ vbInformation, "减肥报告"End Sub快试试你的Excel能瘦多少斤吧!
由于公众号推送规则调整,“设为星标” 是确保您能准时收到我们原创内容的最佳方式。
✨ 请您花2秒完成:
点击顶部公众号名称,进入主页。
点击右上角 【…】,选择 【设为星标】。
您的👍 点赞 +
转发 +
在看,是对我们持续分享的最大支持!
感谢您阅读至此。
为保障账号持续运营与内容创作,文中或文末可能会穿插由平台智能推荐的内容,仅供参考,您可根据自身需求自由选择。我们的核心始终不变:与您一起,每天进步一点!💪