Excel重置" UsedRange"

时间:2016-03-02 15:41:01

标签: excel excel-vba vba

不知道我错过了什么,但我看到的示例似乎没有用。

我从网络查询导入数据。我设置查询以在重新查询时清除未使用的单元格。 As shown here in the last radio button

我使用此导入的数据生成可变长度的报告。

但是,如果用户(因为他们需要在我的情况下)插入行,则会扩展ActiveSheet.UsedRange。这意味着我不能再做一个" Ctrl-End"在执行新查询时查找数据集中的最后一行。

我可以使用ActiveSheet.UsedRange.Clear轻松清除任何数据。但是,如果先前的查询生成了2或3页报告,那么任何后续查询也将是那么长,即使数据较少,因为" UsedRange"仍然指向最后一排那里。

示例如

ActiveSheet.UsedRange
ActiveSheet.UsedRange.Clear
a = ActiveSheet.UsedRange.Rows.Count

不要重置范围。

MS将UsedRange定义为readOnly属性。

似乎需要发生的事情是"文件保存"为了完成行动。

ActiveWorkbook.Save

有一篇帖子指出,在旧版本的Excel中,您还必须关闭工作簿并重新打开它才能完成操作。

我想知道 1.此行为发生变化的版本截止点是什么? 2.是否有其他方法使用VBA宏来重置范围?

13 个答案:

答案 0 :(得分:2)

最适合我的代码:

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

答案 1 :(得分:0)

如果您单独拨打Worksheet.UsedRange property,它将会重置。

    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

在安装了所有适当的服务包的xl2010及更高版本中,此额外步骤是不必要的。

答案 2 :(得分:0)

以下是我插入代码的方式。

    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

这是包含数据的完整使用范围 Ctrl-End shows usedRange

以下是代码执行后的使用范围 enter image description here

范围的结束应该是i7而不是它仍然是i26

然而,我注释掉的代码确实将范围重置为i7

从你所说的只是确认。我注释掉的代码仅适用于Excel 2010及更高版本。我们有一些2007版本。对于那些工作簿实际上必须关闭并重新打开以重置范围?

注意 - 代码示例在2016版本上执行

答案 3 :(得分:0)

这可能适合或不适合您的数据需求,但如果您的数据全部在一个连续的块中,您可以使用CurrentRegion而不是UsedRange,如下所示:

With Cells(1, 1).CurrentRegion
 MsgBox "I have " & .Rows.Count & " rows and " & .Columns.Count & " columns of data."
End With

当然,如果您关注的区域不是从单元格A1开始,或者您的工作表包含您关心的多个连续区域,则此选项将不起作用。根据数据的可预测程度,通常可以在每个数据块中找到至少一个单元格,一旦有了这个单元格,CurrentRegion将为您提供整个数据块的范围。

答案 4 :(得分:0)

我已经使用了Jeeped解决方案并在我添加时为我工作。激活,所以:

With Worksheets("Sheet1")
        Debug.Print .UsedRange.Address(0, 0)
        .UsedRange.Clear
        .UsedRange   
        .Activate
        Debug.Print .UsedRange.Address(0, 0)
  End With

我正在使用Excel2013

答案 5 :(得分:0)

感谢克劳斯提供了正确的答案,但是答案还不完整,他在主要帖子上发表了评论,以完成此操作。我将在此处回答,以将有用的内容组合为一个可行的解决方案。

注意:我没有尝试变型来查看哪些步骤是必需的,但是这些步骤可以清除不必要的使用范围。

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

答案 6 :(得分:0)

这是我使用的解决方案。

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

答案 7 :(得分:0)

  1. 在要重置UsedRange属性的任何工作表中选择单元格1,1
  2. 计算所有打开的工作簿中的所有工作表,  无论自上次计算以来它们是否发生了变化 (要完全计算Ctrl + Alt + F9)
  3. 保存工作簿

适用于所有版本的excel

答案 8 :(得分:0)

我只需要使用 Worksheets(“ Sheet1”)。UsedRange.Calculate 删除行以重置范围后。

答案 9 :(得分:0)

这对我有用:

Worksheets("Sheet1").UsedRange.Clear
Worksheets("Sheet1").UsedRange = ""

似乎将一个值插入UsedRange会将其重置。完成此操作后,我可以去

MyCurrentRow = Worksheets("Sheet1").Range("A:A").SpecialCells(xlCellTypeLastCell).Row

MyCurrentRow现在回到1,我可以从那里开始计数。当我未将值分配给UsedRange时,该LastCell值未重置。无需保存。

答案 10 :(得分:0)

这就是最终为我工作的原因。我觉得必须有更好的方法,但没有其他方法适合我。

Sub ClearRangeData()
Dim S1 As Worksheet

Set S1 = Sheets("Your Sheet Name")     'Define what sheets we are using

'------- Remove all the old data -----
S1.Activate
With ActiveSheet
    S1_rows = S1.UsedRange.Rows.Count
    For I = S1_rows To 1 Step -1
        Cells(I, 1).EntireRow.Delete
    Next
End With
End Sub

答案 11 :(得分:-1)

我仔细检查以确保已经安装了所有最新的补丁和服务包,并且它们是。

我正在跑步 Windows 10和 Excel 2016版本16.0.6568.2034

我发现范围只会通过

重置
ActiveSheet.UsedRange.Clear

最重要的是

ActiveWorkbook.Save

没有save命令,范围不会重置

答案 12 :(得分:-1)

这适用于Excel 2010:

fileName = "C:\Users\Jeff Hardy\Desktop\index.txt"
chars = 0
words = 0
lines = 0

def file_stats(in_file):
    global lines, words, chars
    with open(in_file, 'r') as fd:
        for line in fd:
            lines += 1
            wordsList = line.split()

        words += len(wordsList)

        for word in wordsList:
            chars += len(word)

file_stats(fileName)
print("Number of lines: {0}".format(lines))
print("Number of words: {0}".format(words))
print("Number of chars: {0}".format(chars))