人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: okehara
●カテゴリ:コンピュータ
✍キーワード:うまい アドレス セル データ 入力
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● かえる
●35ポイント

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

(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で処理をしたいと思っています。


2 ● llusall
●100ポイント ベストアンサー

【方法】

・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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ