87本目 数式のシート間の依存関係をチェック

VBA100本ノック

VBA100本ノック 87本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

「相関表」に数式の依存関係を作成してください。
B列のシートの数式が2行目のシートを参照している場合に交点に”○”を入れてください。
※画像参照
セルの数式のみ対象です。
以下は考慮しない。
・INDIRECT関数、串刺し計算、名前定義、条件付き書式、入力規則、文字定数。

解答

Sub マトリクス表内をループ()
    
    Dim ws As Worksheet: Set ws = Sheets("相関表")
    Dim rng As Range:       Set rng = ws.Range("B2").CurrentRegion
    Dim i, j
    Dim rng_search As Range, r As Range
    Dim ws元Name As String
    
    For i = 2 To rng.Rows.Count
        On Error Resume Next
        Set rng_search = Sheets(i).Cells.SpecialCells(xlCellTypeFormulas)
        If Err.Number = 0 Then 'もし数式セルが一つもなかった場合の分岐用
            For j = 2 To rng.Columns.Count
                ws元Name = Sheets(j).Name
                Sheets(j).Name = Sheets(j).Name & "@"
                If i <> j Then  '斜線以外に処理する
                    For Each r In rng_search  '数式セルの中の一つ一つのセルを見に行く
                        If r.Formula Like "*'" & Sheets(j).Name & "'!*" Then
                            rng.Cells(i, j).Value = "〇"
                        End If
                    Next
                End If
                Sheets(j).Name = ws元Name
            Next j
        End If
        On Error GoTo 0
    Next i
    
End Sub

■考え方・流れ
①マトリクス表内をループ
➁数式が入っているセル(シート)を取得
③数式セルの式を確認して表に”〇”をつける
④シート名を置換

86本目の続きの問題!

新人君
新人君

86本目を無駄にしないように
頑張りましょうね!!

ブチョ
ブチョ

別にここまで十分
頑張ったしいいんじゃない?

新人君
新人君

んなわけねーだろ!!

マトリクス表内をループ

86本目同様、B2セルを基準とした表範囲として考えていきます。

とりあえず”rng”にB2のCurrenntRegionをぶち込み!

あ、一応シートも定義してます↓
次は表部分(見出し、項目以外)をループ!

ま、これは正直難しくない…。
For Nextとrng.Rows.Countあたりを使えばいいので。
それに加えて斜線部分の処理は飛ばすように条件分岐が必要ですね。

その辺はこんな感じで書いてみました!↓
マトリクス表なので、Rows.CountとColumns.countは同じ数値になるんですが、
一応書き分けてます。
その方がわかりやすいかと思って。

この辺までは、基本的なループ、条件分岐がわかってたらOK!

数式が入っているセル(シート)を取得

続いては数式が入っているセルのみ取得する方法。
これは序盤で出てきましたが、rngのSpecialCellsメソッドさんを使えばできましたね。

変数名は”rng_search”にしてますが…センスねぇなぁ…

但し、実は「Sheet5」はなーーーんも入ってないまっさらなシートなんです。
つまりSpecialCellsが使えずエラーになっちゃう!

数式セルがない場合はそのシートの処理は抜けちゃいましょう!

ここはうまいことエラーハンドリングしちゃって下さい!

ループの最初でOn Error Resume Nextを入れて…
最後にOn Error GoTo 0 でErr.Numberを戻してあげる!

Err.Numberが0以外のみ、For Nextの処理をしてあげる感じだね~♪

数式セルの式を確認して表に”〇”をつける

数式セルを取得できたら…あとはそのセルたちをループしてあげればヨシ!!
“r”だけ定義して、あとはFor Eachさんを発動!

Like演算子さんを使って、Sheets(j)の名前が入っていたら〇ってつけちゃう!(一旦)

これはこんな感じ↓

ほんで…どこのセルに〇をつけたいかというと…

表範囲(rng)の、i行目の、j列目だケロ~!

これで(ほぼ)完成~!↓

ぐっじょ~ぶ

シート名を置換

これは56本目の完全なる復習!
シート名が特殊だった場合の分岐を入れてあげたほうが丁寧と言うか…
エラーがなくなるというか…
この辺は時と場合によってコードを追加していく感じかな~!

いや…マジでしらんwwww
シングルコーテーションとかwwwwww

これはもう霊夢ちゃんが言ってる通りですww
①シート名を変数に格納
➁シート名にとりあえずなんか記号(アットマークとか)を追加し、変更
③シングルコーテーションありきの処理を書く
④シート名を元に戻す
こんな流れでコードを書ければOK!

以上!完成~!!

ブチョ
ブチョ

お疲れ様!
頑張ったね!

新人君
新人君

あざます!

あとがたり

おはこんばんちは。uぷ主です。
87本目、シート間の数式の依存関係をチェックする問題でした。

問題見た最初、”数式の依存関係って何?”と、日本語よわよわマンが発動。
コード見てやっと意味に気づきましたねw

なるほどなぁ~!
このコードどこかに持ってたら、たぶん
活用できるときあるだろうなぁ~!
他の人から良くわからんExcelもらったときとか…
役に立つだろうなぁ~!

と、思ってます。
思ってます。

思ってるだけです…。

でも…実際実務で色々焦ってる時は…忘れちゃうんだろうな…

はい。とまあそんな感じで、今回も超々楽しかったです~!!

神髄さん!ありがとうございましたぁぁあああ!!

そして最後までご視聴いただいたみなさん!ありがとうございました!!感謝!

コメント

タイトルとURLをコピーしました