6

以下はExcelで設定した例です。

[column1] [column2]

A1  =C3-C5

A2  =((C4-C6)/C6)

A3  =C4*C3

A4  =C6/C7

A5  =C6*C4*C3

数式で使用されている参照を抽出する必要があります

例えば、

for "A1", I simply need to get the C3 and C5.
for A2, I need to get the C4 and C6.
4

3 に答える 3

5

これは次の更新です。

ローカル シート参照には機能しますが、オフシート参照には機能しません。— brettdj 14 5月. 142014-05-14 11:55:00

Larrys メソッドを使用して、objRegEx.Pattern を次のように変更します。

(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+))

この意志:

  1. オプションの外部リンクを検索します。(['].*?['!])?
  2. オプションのシート参照を検索します。([[A-Z0-9_]+[!])?
  3. 次の手順を優先順に実行します。
  4. 行番号 (およびオプションの $) で範囲を検索します。\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?
  5. 行番号なしで範囲を検索します (およびオプションの $):\$?[A-Z]+:\$?[A-Z]+
  6. 1 セル参照 (およびオプションの $) を検索します。(\$?[A-Z]+\$?(\d)+)

この結果:

Sub testing()
Dim result As Object
Dim r As Range
Dim testExpression As String
Dim objRegEx As Object

Set r = Cells(1, 2)  ' INPUT THE CELL HERE , e.g.    RANGE("A1")
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.Global = True
objRegEx.Pattern = """.*?"""  ' remove expressions
testExpression = CStr(r.Formula)
testExpression = objRegEx.Replace(testExpression, "")
objRegEx.Pattern = "(([A-Z])+(\d)+)"  'grab the address

objRegEx.Pattern = "(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[A-Z]+\$?(\d)+(:\$?[A-Z]+\$?(\d)+)?|\$?[A-Z]+:\$?[A-Z]+|(\$?[A-Z]+\$?(\d)+))"
If objRegEx.test(testExpression) Then
    Set result = objRegEx.Execute(testExpression)
    If result.Count > 0 Then
        For Each Match In result
            Debug.Print Match.Value
        Next Match
    End If
End If
End Sub

これを行うと、考えられるすべての参照の値が得られます。(問題を解決する必要があったため、この投稿を更新しました)。

于 2015-10-15T11:07:35.123 に答える
1

代替手段を提供するために...セルが複数回呼び出されると、これは重複した結果を返すことに注意してください

Sub testing()
Dim result As Object
Dim r As Range
Dim testExpression As String
Dim objRegEx As Object

Set r = Cells(1, 2)  ' INPUT THE CELL HERE , e.g.    cells("A1")
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.Global = True
objRegEx.Pattern = """.*"""  ' remove expressions
testExpression = CStr(r.Formula)
testExpression = objRegEx.Replace(testExpression, "")
objRegEx.Pattern = "(([A-Z])+(\d)+)"  'grab the address

If objRegEx.test(testExpression) Then
    Set result = objRegEx.Execute(testExpression)
    If result.Count > 0 Then
        For Each Match In result
            Debug.Print Match.Value
        Next Match
    End If
End If
End Sub

結果は「Match.Value」に保存されます

于 2012-12-12T09:46:39.137 に答える