2016-10-13 67 views
0

嗨获得行引用我一直在考虑用一些公式片在其中,例如:如何从公式VBA

=SUM(D4:D1051) - 可以假装这是在细胞(1,1)

用VBA我怎样才能取出行开始和行结束?

理想情况下,我会有lRowStart = 4lRowEnd = 1051但我不确定使用何种语法来获得此。

+0

公式是字符串,因此您可能必须对此字符串进行parese并获取行开始/结束。 – dee

+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 

但是要小心,因为区域将如果紧挨着彼此组合。

它似乎也不能很好地处理对其他工作表的引用。

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范围.Rows,只需要分割得到的范围地址。

+1

如果范围D4:D1051中的单元格本身具有公式,该怎么办? –