【方法】
・FormulaLocal で数式を取得
・正規表現で、絶対参照の文字列を列挙
【サンプル】
A1 =$B$1
A2 =($B$1+$C$1)*$D$1
A3 =Sheet2!$A$1+($B$1+$C$1)*$D$1*Sheet2!$C$2
・・・続く
などと入力して実行してください。
イミディエイトウィンドウに表示されます。
Option Explicit
Public Sub Test()
Dim suSiki As String
Range("A1").Select
Do Until ActiveCell.Value = ""
'数式を取得
suSiki = ActiveCell.FormulaLocal
'数式を書き出し
Debug.Print Replace(ActiveCell.AddressLocal, "$", "") & "[" & suSiki & "]"
'絶対参照を書き出し
Call ExtractCellRef(suSiki)
'次のセルへ
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
Private Sub ExtractCellRef(ByVal suSiki As String)
'正規表現オブジェクト
Dim oRe, oMatch, oMatches
'正規表現オブジェクトの参照をセット(新規作成)
Set oRe = CreateObject("VBScript.RegExp")
'正規表現オブジェクトのオプション設定
With oRe
.Global = True
.IgnoreCase = True
End With
'マッチパターン作成
oRe.Pattern = "(\$[A-Z]+\$[0-9]+)|([^=,\+\-\*\/]+!\$[A-Z]+\$[0-9]+)"
'正規表現実行
Set oMatches = oRe.Execute(suSiki)
'マッチした全てに対して処理する
For Each oMatch In oMatches
Debug.Print vbTab & oMatch.Value
Next
End Sub
※なお、正規表現のパターンはいささか自身がありません。
やりたいことは、以下のどれかでしょうか?
(1) A1に"Sheet2!B3"、A2に"C4"、A3に"Sheet2!B4"のように複数のセルにセル参照が記述してある。
(2) "Sheet2!B3,C4,Sheet2!B4"のように、1つのセルに複数のセル参照が記述してある。
(3) "Sheet2!B3:C4"のように、セル配列が記述してある。
(2)はセパレータをどうするかという問題があるので、今回は回答を避けます。
(1)は=INDIRECT(xxx)で実現できます。
(3)を以下に示します。
A1に文字列が入っていると仮定します。
B1
=IF(ISERROR(SEARCH("!",A1,1)),"",LEFT(A1,SEARCH("!",A1,1)-1))
B2
=IF(ISERROR(SEARCH("!",A1,1)),A1,RIGHT(A1,LEN(A1)-SEARCH("!",A1,1)))
B3
=IF(ISERROR(SEARCH(":",B2,1)),B2,LEFT(B2,SEARCH(":",B2,1)-1))
B4
=IF(ISERROR(SEARCH(":",B2,1)),B3,RIGHT(B2,LEN(B2)-SEARCH(":",B2,1)))
B5
=ROW(INDIRECT($B$4,TRUE))-ROW(INDIRECT($B$3,TRUE))+1
B6
=COLUMN(INDIRECT($B$4,TRUE))-COLUMN(INDIRECT($B$3,TRUE))+1
B7
=IF($B$1="",$B$3,$B$1&"!"&$B$3)
C1~の範囲に以下の式
=IF(AND($B$5-ROW()>=0,$B$6-COLUMN()+2>=0),OFFSET(INDIRECT($B$7,TRUE),ROW()-1,COLUMN()-3,1,1),"")
式を展開して組み立てればBの列は必要ありませんが、分かりやすさのため、今回はあえてこのようにしました。
回答として適切かどうか分かりませんが、いかがでしょうか?
ありがとうございます。出来たらVBAで処理をしたいと思っています。
【方法】
・FormulaLocal で数式を取得
・正規表現で、絶対参照の文字列を列挙
【サンプル】
A1 =$B$1
A2 =($B$1+$C$1)*$D$1
A3 =Sheet2!$A$1+($B$1+$C$1)*$D$1*Sheet2!$C$2
・・・続く
などと入力して実行してください。
イミディエイトウィンドウに表示されます。
Option Explicit
Public Sub Test()
Dim suSiki As String
Range("A1").Select
Do Until ActiveCell.Value = ""
'数式を取得
suSiki = ActiveCell.FormulaLocal
'数式を書き出し
Debug.Print Replace(ActiveCell.AddressLocal, "$", "") & "[" & suSiki & "]"
'絶対参照を書き出し
Call ExtractCellRef(suSiki)
'次のセルへ
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
Private Sub ExtractCellRef(ByVal suSiki As String)
'正規表現オブジェクト
Dim oRe, oMatch, oMatches
'正規表現オブジェクトの参照をセット(新規作成)
Set oRe = CreateObject("VBScript.RegExp")
'正規表現オブジェクトのオプション設定
With oRe
.Global = True
.IgnoreCase = True
End With
'マッチパターン作成
oRe.Pattern = "(\$[A-Z]+\$[0-9]+)|([^=,\+\-\*\/]+!\$[A-Z]+\$[0-9]+)"
'正規表現実行
Set oMatches = oRe.Execute(suSiki)
'マッチした全てに対して処理する
For Each oMatch In oMatches
Debug.Print vbTab & oMatch.Value
Next
End Sub
※なお、正規表現のパターンはいささか自身がありません。
ありがとうございます。正規表現を勉強してみます。
ありがとうございます。正規表現を勉強してみます。