Excel VBA; 引用variables范围

我试图自动化一个需要每月报告的stream程,并根据这些数据生成exception报告。 由于报告中的数据量因月份而异,因此我需要对此进行说明。 哪种方法最适合引用可变范围?

例如,而不是引用范围A1:F7087,我想引用包含任何数据的整个范围。 就像看起来那么简单,我一直没有find任何指导。 欣赏任何input。 谢谢

Dim rng As Range Set rng = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)) 

这将设置为包含所有单元格,直到最后填充,它也将包含所有空行和列。 您还应该阅读本文中关于xlLastCell重要部分:

根据你想要完成的事情,这个单元格可能不是你实际寻找的单元格。 这是因为,例如,如果您在单元格A1,A2和B1中键入一个值,Excel将最后一个单元格视为B2,它可能有一个值或不…

您select引用您希望包含在报告中的dynamic数据块的方法几乎都有优点和缺点。

.SpecialCells(xlLastCell)一起提供的警告是,它可能包含之前使用但不在数据范围内的单元格。 这可能会发生,如果您的数据从一个月收缩到下一个尽pipe最近提供的Excel 2010/2013服务包和更新将通过保存该工作簿缩小stream氓最后一个单元格 。 我相信我们中的许多人曾经AZ1048576了一个inputAZ1048576的价值,并且不得不跳过Excel来让内部调整实际数据的大小。 如前所述,对于Excel的更高版本,这个问题只不过是历史上的一个脚注。

最后要注意的是,单元格格式化为普通简单的一般会缩小收缩,所以如果上个月的报告在本月的格式化.SpecialCells(xlLastCell)行数低于50行的时候, .SpecialCells(xlLastCell)将引用一个区域50行太长。

如果你有一些空白单元格可能连续的数据块,但没有完全空白的行或列将数据分隔成岛,那么我更喜欢以下方法。

With sheets("Sheet1") Set rng = .Cells(1, 1).CurrentRegion End With

上面代码引用的区域可以通过selectA1并点击Ctrl+A一次(两次是A1:XFD1048576)来演示。 选中的单元格将是一个矩形,其中包含数据的最后一列和最后一行以数据为范围的数据。 以前使用的单元格和保留以前的格式的单元格不起作用; 只有单元格的值和公式。 但是,必须强调的是,数据停在第一个完全空白的行或列上。

我要提到的最后一个方法是定位(aka。select或以其他方式从A1开始),并使用.Find和向后search的通配符,以便从XFD1048576开始并向A1search第一个值或公式先按行再按列重复。

 Dim lr As Long, lc As Long, rng As Range With Sheets("Sheet3") lr = .Cells.Find(What:=Chr(42), After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row lc = .Cells.Find(What:=Chr(42), After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Set rng = .Cells(1, 1).Resize(lr, lc) End With 

这确实是获得数据块准确表示的唯一真实方法,但其通常并不是必需的。

 Sub highlight() Dim obj As Range For Each obj In Sheet1.UsedRange If obj.Value = Range("A1").Value Then obj.Interior.Color = vbYellow Else obj.Interior.Color = vbWhite End If Next obj End Sub