如何从公式VBA获取行引用

时间:2016-10-13 10:12:47

标签: excel vba excel-vba

您好我已经获得了一张包含一些公式的表格,例如:

=SUM(D4:D1051) - 可以假装这是在单元格(1,1)

使用VBA,我如何拉出行开始和行结束?

理想情况下,我会lRowStart = 4lRowEnd = 1051,但我不确定用于获取此内容的语法。

2 个答案:

答案 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。行,只需要拆分就可以得到范围地址。