Excel VBA;引用变量范围

时间:2014-11-15 18:55:04

标签: excel vba excel-vba range

我正在尝试自动执行一个过程,该过程会按月报告并根据数据生成异常报告。由于报告中的数据量每月不同,我需要考虑到这一点。什么方法最适合引用变量范围?

例如,我想引用包含任何数据的整个范围,而不是引用范围A1:F7087。尽管看起来很简单,但我还没有找到任何指导。感谢任何输入。感谢

3 个答案:

答案 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