2016-10-13 103 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中的單元格本身具有公式,該怎麼辦? –