概要
今回はExcelで設定した『名前の定義』の存在チェックを簡単・簡潔にやる方法を紹介します。
結果だけを見たい場合は後半までスクロールしてください。
いろいろなサイトを見ているとWorkbookオブジェクトのNamesで繰り返し処理を行っているのをよく見かけます。
例)Namesメソッドで繰り返し(Sheet1で印刷範囲が設定されていることを確認する)
1 2 3 4 5 6 7 8 9 10 |
Dim Nm As Name Dim IsName As Boolean For Each Nm In ActiveWorkbook.Names If Nm.Name = "Sheet1!Print_Area" Then IsName = True: Exit For Next Set Nm = Nothing ・・・① If IsName Then Msgbox Sheet1.Range("Print_Area").Address |
上記コードの場合、コードだけで10行近くもあり複数の『名前の定義』を確認しないといけない時にどうしてもコードが煩雑になりますよね。
また、Nmを解放(①)してあげないとファイルを閉じるときにMicrosoftのバグで不具合を起こす可能性があります。
次の章でこれらの問題を解決していきます。
IsRef関数を使おう
Excelの関数の1つ、IsRef関数を使います。
IsRef関数はExcelのセルで利用できるもので、セルの参照先が存在するか判定します。
存在する場合はTrue、存在しない場合はFalseが返ります。
Excelで印刷範囲が設定されているか確認する場合は以下のような式をセルに入力します。
例)印刷範囲が設定されているか確認する
1 |
=IsRef(Print_Area) |
また、シートが分かっている場合は以下のような式をセルに入力します。
例)Sheet1シートで印刷範囲が設定されているか確認する
1 |
=IsRef(Sheet1!Print_Area) |
次の章でセルで使ったIsRef関数をVBA(マクロ)に組み込んでいきます。
IsRef関数をVBA(マクロ)で使うには?
では実際にセルで使えたIsRef関数をVBA(マクロ)で使ってみましょう。
セルで利用できる大抵の関数はVBAでも利用できます。
しかしながら、ApplicationオブジェクトのWorksheetFunctionにはIsRef関数が存在しません。
でも発想を変えることで利用できる方法があります。
引数に指定した式を評価して結果を返すEvaluateメゾットを利用することです。
Evaluateメゾットを使えば引数に関数式を指定することで評価することが可能になります。
以下のコードで、印刷範囲が設定されているか確認します。
例)[VBA]印刷範囲が設定されているか確認する
1 2 3 4 5 |
If Excel.Application.Evaluate("IsRef(Sheet1!Print_Area)") Then Msgbox Sheet1.Range("Print_Area").Address End If |
たったの1行で判定ができましたね。
Excel内であれば『Excel.Application.』は省略可能です。
また、EValuateメソッドは[]記号で省略できます。
例)[VBA]印刷範囲が設定されているか確認する(省略版)
1 2 3 4 5 |
If [IsRef(Sheet1!Print_Area)] Then Msgbox Sheet1.Range("Print_Area").Address End If |
EValuateを省略すると、Excelの関数をVBAで直接利用しているように見えるのでおすすめです!
Sum関数などもVBAで簡単に利用できるので、ぜひ試してみてください。
例)セルF13からセルF15までの合計を返す。
1 |
Lng = [Sum(F13:F15)] |
いかがだったでしょうか?
わからないところがあれば下の問い合わせからお願いします。
今回はここまで。
ノシ
---コメント---