我正在尝试自动执行一个过程,该过程会按月报告并根据数据生成异常报告。由于报告中的数据量每月不同,我需要考虑到这一点。什么方法最适合引用变量范围?
例如,我想引用包含任何数据的整个范围,而不是引用范围A1:F7087。尽管看起来很简单,但我还没有找到任何指导。感谢任何输入。感谢
答案 0 :(得分:4)
Dim rng As Range
Set rng = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell))
这会将rng
设置为包含截至上次填充的所有单元格,它还将包含所有空行和列。
您还应该阅读this,这篇文章的重要部分是关于xlLastCell
:
根据您要完成的操作,此单元格可能不是您实际需要的单元格。这是因为,例如,如果在单元格A1,A2和B1中键入值,Excel会将最后一个单元格视为B2,这可能具有值...
答案 1 :(得分:1)
您选择引用要包含在报告中的动态数据块的方法有利有弊。
.SpecialCells(xlLastCell)
附带的警告是它可能包含以前使用但不再属于数据范围的单元格。如果您的数据从一个月缩小到下一个月,可能会发生这种情况,尽管最近为Excel 2010/2013提供的Service Pack和更新将通过保存工作簿来缩小流氓最后一个单元。我确信我们中的许多人曾经错误地将一个值输入AZ1048576
并且不得不通过箍来获取Excel以在内部调整实际数据的范围。如前所述,对于更高版本的Excel,这个问题在历史上只是一个脚注。
最后要注意的是,格式化为纯粹的常规的格式的单元格将停止收缩,因此,如果上个月的报告格式化了小于50行的小行,那么它是本月,.SpecialCells(xlLastCell)
将引用50行太长的区域。
如果您有一个连续的数据块,可能有一些空白单元格,但没有完全空白的行或列将您的数据分隔成 islands ,那么我更喜欢以下方法。
With sheets("Sheet1")
Set rng = .Cells(1, 1).CurrentRegion
End With
上述代码引用的区域可以通过选择A1并点击Ctrl+A
一次(两次是A1:XFD1048576)来演示。选择的单元格将是一个矩形,包含带有数据的最后一列,最后一行包含数据作为范围。之前使用的以前报告中保留格式的单元格和单元格无效;只有单元格值和公式。但是,必须强调的是, island 数据会在第一个完全空白的行或列停止。
我要提到的最后一个方法是定位(也就是.Select
或以其他方式开始)A1并使用.Find
向后搜索通配符,以便最终从XFD1048576开始并搜索A1对于第一个值或公式,它可以先按行查找,然后按列重复。
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
这是获得数据块准确表示的唯一真正方法,但通常不需要它的彻底性。
答案 2 :(得分:0)
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