【发布时间】:2010-07-26 17:26:54
【问题描述】:
在 VBA / VB.NET 中,您可以将 Excel 范围值分配给数组,以便更快地访问/操作。有没有办法有效地将其他单元格属性(例如,顶部、左侧、宽度、高度)分配给数组?即,我想做类似的事情:
Dim cellTops As Variant : cellTops = Application.ActiveSheet.UsedRange.Top
该代码是程序的一部分,用于以编程方式检查图像是否与工作簿中使用的单元格重叠。我目前在 UsedRange 中迭代单元格的方法很慢,因为它需要反复轮询单元格的顶部/左侧/宽度/高度。
更新:我将继续接受 Doug 的回答,因为它确实比简单迭代更快。最后,我发现非天真的迭代工作得更快为了检测与内容填充单元格重叠的控件。步骤基本上是:
(1) 通过查看每行中第一个单元格的顶部和高度,在使用范围内找到有趣的行集(我的理解是该行中的所有单元格必须具有相同的顶部和高度,但是不是左和宽度)
(2) 遍历感兴趣行中的单元格,只使用单元格的左右位置进行重叠检测。
查找感兴趣的行集的代码如下所示:
Dim feasible As Range = Nothing
For r% = 1 To used.Rows.Count
Dim rowTop% = used.Rows(r).Top
Dim rowBottom% = rowTop + used.Rows(r).Height
If rowTop <= objBottom AndAlso rowBottom >= objTop Then
If feasible Is Nothing Then
feasible = used.Rows(r)
Else
feasible = Application.Union(used.Rows(r), feasible)
End If
ElseIf rowTop > objBottom Then
Exit For
End If
Next r
【问题讨论】:
-
UsedRange 可以不连续吗? Range.Top 属性 (msdn.microsoft.com/en-us/library/…) 不会对所有单元格都相同吗?
-
UsedRange 返回的范围是一个连续的范围,但可以包含未使用的单元格。但是,该范围内的每个单元格都有自己的 Top / Left / Height / Width 属性。您可以通过在工作表周围散布一些值然后遍历“UsedRange”中的单元格来观察这一点。我在这里发布了一些示例代码:codepad.org/eu68TTRf