2017-02-01 12 views
1

空のExcelブックを作成すると、1,000,000以上の行をすべて使用しないでファイルサイズを小さく保ちます。ただし、データがすべての行に追加されると、データが削除されても行は存在し、ファイルサイズが大きくなります。私はこれらの行がスクロールバーのサイズのために存在することを知っています。そして、私が下にスクロールすると、新しいワークブックでは起こりません。私はこれがVBAのUsedRangeと呼ばれるだろうと思いますか?未使用のExcel行を完全に削除する

私はこの状況にある別の開発者からブックを継承しており、サイズを縮小する方法を探しています。私は使用されたデータを新しい空のワークブックにのみコピーできますが、実際のUsedRangeを減らす方法を知っている人はいますか?

次のコードは動作しない。

Sub test() 
Dim r As Range 

    Set r = Range("10000:1000000") 
    r.Delete 

End Sub 

も、手動で行をハイライトヘッダをクリックすると

+1

が行を選択してみてくださいセルではなく数字(左端の列)を右クリックして削除(左端の列でも)して、完全な行を削除します。行を削除すると、関連するすべてのデータと書式が削除されます。また、プログラミングに関してではないので、おそらくこの質問は他のスタック交換に属します。 – Zero

+0

'ActiveSheet.UsedRange.EntireRow.Delete'を使用してください – user3598756

+0

各シートの未使用の行と列を非表示にして、ファイルを保存するだけです。 Ctrl + Endキーを使用すると違いが見えます。 ;) – R3uK

答えて

1

開く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 
+0

すごい。ありがとう!私はUsedRangeが範囲を返す関数に過ぎないと思った –

+0

Excelを開くたびにコンテキストメニューに追加するコードを追加しました(このコードをPERSONAL.XLSBに入れます) – Jonathan

+0

このメソッド使用されている範囲をリセットすることは、大きな範囲と最近のExcelバージョンでは失敗することがよくあります。 –

0

すべてのシート内のすべての未使用の行と列をクリアするには:

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 
関連する問題