Excel2000を使用しています。セルに入力した絶対番地表示の数式の文字列データから、参照先のセルのアドレスを抜き出そうと考えています。自身のシート以外のシートを参照している場合には、シート名と参照先のセルアドレスの情報が必要です。参照が複数の場合には全ての参照情報を抜き出したいのです。参考になる情報やうまい実現方法がありましたら教えて下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/03/03 08:05:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:llusall No.2

回答回数505ベストアンサー獲得回数61

ポイント100pt

【方法】

・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

※なお、正規表現のパターンはいささか自身がありません。

id:okehara

ありがとうございます。正規表現を勉強してみます。

2007/03/01 01:40:44

その他の回答1件)

id:drill256 No.1

回答回数175ベストアンサー獲得回数7

ポイント35pt

やりたいことは、以下のどれかでしょうか?

(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の列は必要ありませんが、分かりやすさのため、今回はあえてこのようにしました。

回答として適切かどうか分かりませんが、いかがでしょうか?

id:okehara

ありがとうございます。出来たらVBAで処理をしたいと思っています。

2007/03/01 01:34:26
id:llusall No.2

回答回数505ベストアンサー獲得回数61ここでベストアンサー

ポイント100pt

【方法】

・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

※なお、正規表現のパターンはいささか自身がありません。

id:okehara

ありがとうございます。正規表現を勉強してみます。

2007/03/01 01:40:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません