永久删除未使用的Excel行

创build空白Excel工作簿时,由于不使用全部1,000,000多行而使文件大小保持较小。 但是,一旦将数据添加到所有行中,即使数据被删除,行仍然存在,从而导致巨大的文件大小。 我知道这些行仍然存在,因为滚动条的大小,事实上,如果我滚动到底部,我最终在1000000行,这不会发生在一个新的工作簿。 我想这将在VBA中被称为UsedRange?

我从另一个开发人员那里inheritance了一个工作手册,在这种情况下,我正在寻找一种减小尺寸的方法。 我可以将使用的数据复制到一个新的空白工作簿,但没有人知道一种方法来减less实际UsedRange?

以下代码不起作用:

Sub test() Dim r As Range Set r = Range("10000:1000000") r.Delete End Sub 

也不手动突出显示行,单击标题并单击删除

打开VBA并在即时窗口中键入ActiveSheet.UsedRange。

我把它添加到我的右键菜单,因为我经常使用它。

编辑:

以下是我用来将其添加到上下文菜单的代码:

 Private Sub Auto_Open() On Error Resume Next 'delete the control if it exists Application.CommandBars.FindControl(Tag:="MY_TAG").Delete On Error GoTo 0 With Application.CommandBars("Cell").Controls 'add reset range button With .Add(Type:=msoControlButton) .Caption = "Reset used range" .OnAction = ThisWorkbook.Name & "!ResetRange" .Tag = "MY_TAG" .BeginGroup = True End With End With End Sub Private Sub ResetRange() ActiveSheet.UsedRange End Sub 

清除所有表中所有未使用的行和列:

 Sub ReduceFileSize() Dim wB As Workbook Dim wS As Worksheet Set wB = ThisWorkbook For Each wS In wB.Sheets DeleteUnUsed wS Next wS wB.Save End Sub Sub DeleteUnUsed(wS As Worksheet) Dim r As Range Dim LastRow As Double LastRow = LastRow_1(wS) Dim LastCol As Double LastCol = LastCol_1(wS) With wS .Range(LastRow + 1 & ":" & .Rows.Count).EntireRow.Delete .Range(collet(LastCol) & ":" & collet(.Columns.Count)).EntireColumn.Delete End With End Sub Public Function LastRow_1(wS As Worksheet) As Double With wS If Application.WorksheetFunction.CountA(.Cells) <> 0 Then LastRow_1 = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else LastRow_1 = 1 End If End With End Function Public Function LastCol_1(wS As Worksheet) As Double With wS If Application.WorksheetFunction.CountA(.Cells) <> 0 Then LastCol_1 = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column Else LastCol_1 = 1 End If End With End Function Public Function ColLet(x As Integer) As String With ActiveSheet.Columns(x) ColLet = Left(.Address(False, False), InStr(.Address(False, False), ":") - 1) End With End Function