您好我已经获得了一张包含一些公式的表格,例如:
=SUM(D4:D1051)
- 可以假装这是在单元格(1,1)
使用VBA,我如何拉出行开始和行结束?
理想情况下,我会lRowStart = 4
和lRowEnd = 1051
,但我不确定用于获取此内容的语法。
答案 0 :(得分:0)
您可以使用.Precedents
Dim rng As Range
Dim rowStart As Long
Dim rowEnd As Long
On Error Resume Next 'in case there are no precedents
Set rng = Cells(1, 1).Precedents
On Error GoTo 0
If Not rng Is Nothing Then
rowStart = rng.Row 'or rng.Areas(1).Row (see edit)
rowEnd = rng.Row + rng.Rows.Count - 1 'or rng.Areas(1).Row and rng.Areas(1).Rows.Count
Else
rowStart = 0
rowEnd = 0
End If
编辑有一些案例很棘手。如果公式包含多个引用,例如=SUM(B1:B2) + SUM(D3:D4)
你将获得范围联合。如果引用的单元格本身引用了其他单元格,则情况也是如此。
在这些情况下,您可以使用.Areas
来获取范围所包含的各个区域。我不确定他们是如何准确订购的,但似乎是"顶级"引用是第一位的。例如:
Dim rng As Range
Dim ar As Range
Range("A1").Formula = "=sum(B5:B7) + B1"
Range("B6").Formula = "=B3"
Set rng = Range("A1").Precedents
For Each ar In rng.Areas
Debug.Print ar.Address
Next ar
输出:
$B$5:$B$7
$B$1
$B$3
但是要小心,如果彼此相邻,则会合并区域。
它似乎也无法很好地处理对其他工作表的引用。
答案 1 :(得分:0)
像这样的东西
for x = range("a1").Precedents(1).row to range("a1").Precedents(range("a1").Precedents.Count).row
如果范围内没有公式:)
或沿着这些方向的东西。
Dim strFormula
Dim lngStartRow As Long
Dim lngEndRow As Long
strFormula = Replace(Replace(Cells(1, 1).Formula, "=SUM(", vbNullString), ")", vbNullString)
lngStartRow = Range(Split(strFormula, ":")(0)).Row
lngEndRow = Range(Split(strFormula, ":")(1)).Row
甚至提取范围地址然后在范围上使用foreach。行,只需要拆分就可以得到范围地址。