嗨獲得行引用我一直在考慮用一些公式片在其中,例如:如何從公式VBA
=SUM(D4:D1051)
- 可以假裝這是在細胞(1,1)
用VBA我怎樣才能取出行開始和行結束?
理想情況下,我會有lRowStart = 4
和lRowEnd = 1051
但我不確定使用何種語法來獲得此。
嗨獲得行引用我一直在考慮用一些公式片在其中,例如:如何從公式VBA
=SUM(D4:D1051)
- 可以假裝這是在細胞(1,1)
用VBA我怎樣才能取出行開始和行結束?
理想情況下,我會有lRowStart = 4
和lRowEnd = 1051
但我不確定使用何種語法來獲得此。
可以使用獲取在公式中引用的單元格.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
但是要小心,因爲區域將如果緊挨着彼此組合。
它似乎也不能很好地處理對其他工作表的引用。
像這樣的事情
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,只需要分割得到的範圍地址。
如果範圍D4:D1051中的單元格本身具有公式,該怎麼辦? –
公式是字符串,因此您可能必須對此字符串進行parese並獲取行開始/結束。 – dee
沒有對公式性質的一些假設,這是有些不明確的。做所有你感興趣的公式取決於單個連續的單元塊嗎? –