Excel重置“UsedRange”

不知道我错过了什么,但我看到发布的例子似乎没有工作。

我从Web查询中导入数据。 我设置查询来清除未使用的单元格,当它重新查询。 如最后一个单选按钮所示

我使用这个导入的数据来生成一个可变长度的报告。

但是,如果用户(因为他们需要在我的情况下)插入行,然后ActiveSheet.UsedRange展开。 这意味着我不能再执行“Ctrl-End”查找数据集中的最后一行。

我可以使用ActiveSheet.UsedRange.Clear轻松清除任何数据。 但是,如果以前的查询生成了2页或3页报表,则即使数据较less,后续查询也将会持续很长时间,因为“UsedRange”仍然指向最后一行。

示例显示

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

不要重置范围。

MS将UsedRange定义为readOnly属性。

看来需要发生的是“文件保存”以完成操作。

 ActiveWorkbook.Save 

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

我想知道1.什么是该行为改变的版本截止? 2.是否有其他方法使用VBAmacros将重置范围?

我再次检查,以确保所有最新的补丁和服务包已经安装,他们是。

我正在运行Windows 10和Excel 2016版本16.0.6568.2034

我发现范围只会重置

 ActiveSheet.UsedRange.Clear 

最重要的是

 ActiveWorkbook.Save 

没有保存命令的范围不会被重置

如果您自己调用Worksheet.UsedRange属性 ,它将重置。

  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及以上版本中,不需要额外的步骤,并安装了所有适当的服务包。

这是我如何插入你的代码。

  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显示usedRange

代码执行完毕后,这里是使用的范围 在这里输入图像说明

范围的结束应该是I7而不是I26

但是,我注释的代码重置范围为i7

从你说的只是为了确认。 我注释掉的代码只适用于Excel 2010及更新版本。 我们有一些2007版本在附近。 对于那些工作簿实际上将不得不被closures并重新打开的范围重置?

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

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

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

当然,如果您所关心的区域没有从单元格A1开始,或者如果工作表包含您关心的多个连续区域,则此选项将不起作用。 根据数据的可预测性,通常可以在每个数据块中至lessfind一个单元格,一旦有了这个单元格,CurrentRegion会给出整个块的范围。