繁体   English   中英

Excel VBA; 引用变量范围

[英]Excel VBA; Referencing Variable Ranges

我正在尝试使需要每月报告并根据数据生成异常报告的过程自动化。 由于报告中的数据量每个月都有所不同,因此我需要考虑一下。 哪种方法最适合引用可变范围?

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

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

这会将rng设置为包含所有上一次填充的单元格,还将包含所有空行和列。 你也应该阅读 ,从本文对重要组成部分xlLastCell

根据您要完成的工作,此单元可能不是您实际要查找的单元。 这是因为,例如,如果您在单元格A1,A2和B1中键入一个值,则Excel会将最后一个单元格视为B2,该单元格可能有值也可能没有值...

您选择引用要包含在报告中的动态数据块的几乎任何方法都各有利弊。

.SpecialCells(xlLastCell)附带的警告是,它可能包含以前使用的单元格,但不再包含在数据范围内。 如果您的数据从一个月缩减到下一个月,则可能会发生这种情况,尽管为Excel 2010/2013提供的最新Service Pack和更新将通过保存工作簿来缩小流氓最后一个单元格 我确定我们很多人一次或一次将值错误输入AZ1048576 ,不得不跳越圈让Excel在内部调整实际数据的范围。 如前所述,在更高版本的Excel中,此问题几乎只是历史记录中的脚注。

最后要注意的一点是,格式化为纯简将军格式的单元格将停止收缩,因此如果上个月的报表在本月的位置下方有一个格式化的小计行50行,则.SpecialCells(xlLastCell)将引用一个区域50行太长。

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

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

可以通过选择A1并点击一次Ctrl+A (两次为A1:XFD1048576)来演示上述代码所引用的区域。 选定的单元格将是一个矩形,其中包含最后一个包含数据的列和最后一个包含数据作为范围的行。 以前使用的单元格以及保留了先前报告格式的单元格均无效。 仅单元格值和公式。 但是,必须强调的是,数据停在第一个完全空白的行或列。

我要提到的最后一种方法是将A1定位(也称为.Select或以其他方式开始),然后使用.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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM