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