Excel resetting “UsedRange”

前端 未结 12 2067
醉酒成梦
醉酒成梦 2021-01-05 15:42

Don\'t know what I\'m missing, but the examples I see posted do not appear to work.

I import data from a web query. I set the query to clear unused cells when it re

相关标签:
12条回答
  • 2021-01-05 15:59

    Best code that worked for me:

    Sub DeleteUnused()
    Dim myLastRow As Long
    Dim myLastCol As Long
    Dim dummyRng As Range
    Dim AnyMerged As Variant
    'http://www.contextures.on.ca/xlfaqApp.html#Unused
    'Helps to reset the usedrange by deleting rows and columns AFTER your true used range
    
        'Check for merged cells
        AnyMerged = ActiveSheet.UsedRange.MergeCells
        If AnyMerged = True Or IsNull(AnyMerged) Then
            MsgBox "There are merged cells on this sheet." & vbCrLf & _
                   "The macro will not work with merged cells.", vbOKOnly + vbCritical, "Macro will be Stopped"
            Exit Sub
        End If
    
        With ActiveSheet
            myLastRow = 0
            myLastCol = 0
            Set dummyRng = .UsedRange
            On Error Resume Next
            myLastRow = _
            .Cells.Find("*", after:=.Cells(1), _
                        LookIn:=xlFormulas, lookat:=xlWhole, _
                        searchdirection:=xlPrevious, _
                        searchorder:=xlByRows).Row
            myLastCol = _
            .Cells.Find("*", after:=.Cells(1), _
                        LookIn:=xlFormulas, lookat:=xlWhole, _
                        searchdirection:=xlPrevious, _
                        searchorder:=xlByColumns).Column
            On Error GoTo 0
    
            If myLastRow * myLastCol = 0 Then
                .Columns.Delete
            Else
                .Range(.Cells(myLastRow + 1, 1), _
                       .Cells(.Rows.Count, 1)).EntireRow.Delete
                .Range(.Cells(1, myLastCol + 1), _
                       .Cells(1, .Columns.Count)).EntireColumn.Delete
            End If
        End With
    
    End Sub
    
    0 讨论(0)
  • 2021-01-05 16:02

    Here is how I inserted your code.

        Sheets("Edit Data").Select
    '    Range("A6").Select
    '    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    '    Selection.Delete Shift:=xlUp
    '    ActiveWorkbook.Save
        With Worksheets("Edit Data")
            Debug.Print .UsedRange.Address(0, 0)
            .UsedRange.Clear
            .UsedRange    '<~~ called by itself will reset it
            Debug.Print .UsedRange.Address(0, 0)
        End With
    

    Here is the full used range with data

    Here is the used range after your code executed

    The end of range should be i7 instead it is still i26

    However the code which I commented out does reset range to i7

    From what you are saying just to confirm. My commented out code will only work for Excel 2010 and newer. We have some 2007 versions hanging around. For those the workbook will actually have to be closed and reopened for the range to reset?

    Note- the code examples were executed on version 2016

    0 讨论(0)
  • 2021-01-05 16:03

    Thanks to Claus for having the correct answer, but it is incomplete, and he completed it with a comment on the main post. I'll answer here to combine the useful bits into a single working solution.

    Note: I have not tried variations to see which steps are necessary, but these steps work to clear unnecessary used range.

    Sub ResetUsedRange()
    dim rngToDelete as range
    
    set rngToDelete = 'Whatever you want
    
    rngToDelete.EntireRow.Clear
    rngToDelete.EntireRow.Select
    Selection.Delete Shift:=xlUp
    
    ActiveWorkbook.Save 'This step has been stated to be necessary for the range to reset.
    
    End Sub
    
    0 讨论(0)
  • 2021-01-05 16:05

    This is the solution I used.

    Sub CorrectUsedRange()
        Dim values
        Dim usedRangeAddress As String
        Dim r As Range
        'Get UsedRange Address prior to deleting Range
        usedRangeAddress = ActiveSheet.UsedRange.Address
        'Store values of cells to array.
        values = ActiveSheet.UsedRange
        'Delete all cells in the sheet
        ActiveSheet.Cells.Delete
        'Restore values to their initial locations
        Range(usedRangeAddress) = values
    End Sub
    
    0 讨论(0)
  • 2021-01-05 16:06

    If you call the Worksheet.UsedRange property by itself, it will reset.

        With Worksheets("Sheet1")
            Debug.Print .UsedRange.Address(0, 0)
            .UsedRange.Clear
            .UsedRange    '<~~ called by itself will reset it
            Debug.Print .UsedRange.Address(0, 0)
        End With
    

    This extra step is unnecessary in xl2010 and above with all appropriate service packs installed.

    0 讨论(0)
  • 2021-01-05 16:08

    I double checked to make sure all the latests patches and service packs have been installed and they were.

    I'm running Windows 10 and Excel 2016 version 16.0.6568.2034

    I found that the range would only reset with the

    ActiveSheet.UsedRange.Clear
    

    And most importantly

    ActiveWorkbook.Save
    

    without the save command the range is not reset

    0 讨论(0)
提交回复
热议问题