嗨获得行引用我一直在考虑用一些公式片在其中,例如:如何从公式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
没有对公式性质的一些假设,这是有些不明确的。做所有你感兴趣的公式取决于单个连续的单元块吗? –