VBA技術解説
省略可能なVariant引数の参照不可をラップ関数で利用

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2020-07-12 最終更新日:2020-07-12

省略可能なVariant引数の参照不可をラップ関数で利用


省略可能(Optional)なVariant引数を省略した場合、その引数は「参照不可」となります。
この「参照不可」の状態について説明します。
そして、これをあえて利用してワークシート関数のラップ関数を作成してみます。


省略可能なVariant引数を省略した場合

Sub sample()
  Call sample_sub
End Sub

Sub sample_sub(Optional arg)
  If IsMissing(arg) Then
    Stop
  End If
End Sub

上記VBAのsampleを実行します。
Stopで停止した時点で、イミディエイト ウィンドウには、
エラー 448
このように表示されます。

エラー番号448の説明についてはイミディエイト ウィンドウで確認できます。
?error(448)、これでEnterすると、

VBA マクロ 448 名前付き引数が見つかりません。

このように表示されます。
Error関数
指定したエラー番号に対応するエラー メッセージを返します。
Error [ (errornumber) ]
errornumberを省略した場合は、最後に発生した実行時エラーに対応するメッセージが返されます。
errornumberが有効でない場合(65536以上)はエラーが発生します。
定義されていないerrornumberの場合は、"アプリケーション定義またはオブジェクト定義のエラーです。"が返されます。
実行時エラーが発生していない場合、またはerrornumberが0の場合は、長さ0の文字列("")が返されます。

Stopで停止した時点で、ローカル ウィンドウを見て見ましょう。

VBA マクロ 参照不可 省略可能な引数

引数argの値は「参照不可」となっています。」
この状態の変数は、ほとんど利用する事が出来ません。
単純に比較演算で使ったり、Is関数以外で使用するとエラーになります。

VBA マクロ 参照不可 省略可能な引数


IsMissing関数

省略可能なバリアント型 (Variant) の引数がプロシージャに渡されたかどうかを調べるためには、
IsMissing関数を使用します。
・IsMissing関数 ・IsMissing関数の使用例 ・Is○○関数一覧

参照不可をワークシート関数のラップ関数作成に応用

以下では、省略可能なVariant引数が「参照不可」となっている状態の理解の一助として、
SumIfsのラップ関数を作成してみました。

Function SumIfs(合計範囲, ParamArray pArray())
  Dim tArray
  tArray = pArray
  
  Dim aArray(253) '引数の最大数
  Call Array2Array(aArray, tArray)
  
  'ここは使用する最大引数を記述する必要があります。
  '実際には必要と思われる最大数まで引数を列挙すれば良いでしょう。
  SumIfs = WorksheetFunction.SumIfs(合計範囲, _
       aArray(0), aArray(1), aArray(2), aArray(3), _
       aArray(4), aArray(5), aArray(6), aArray(7), _
       aArray(8), aArray(9), aArray(10), aArray(11), _
       aArray(12), aArray(13), aArray(14), aArray(15))
End Function

'コビー元の配列上限以降は「参照不可」にする
Sub Array2Array(aArray, pArray)
  Dim i As Long
  For i = 0 To UBound(aArray)
    If i > UBound(pArray) Then
      aArray(i) = UnRef
    Else
      If IsObject(pArray(i)) Then
        Set aArray(i) = pArray(i)
      Else
        aArray(i) = pArray(i)
      End If
    End If
  Next
End Sub

'「参照不可」を作成
Function UnRef(Optional arg)
  UnRef = arg
End Function

ParamArrayを使用することで、仮引数の記述を簡素化しています。
・引数の構文 ・名前付き引数について ・ParamArrayキーワード(パラメーター配列)とは ・ParamArrayキーワード(パラメーター配列)の使用例 ・サイト内の関連ページ

ParamArrayで受け取った配列の内容はSumIfsに渡す引数用の配列に各々代入します。
このとき、オブジェクトにはSetステートメントが必要になるので、IsObject関数で場合分けしています。
・IsObject関数の構文 ・IsObject関数の解説 ・IsObject関数の使用例 ・Is○○関数一覧
ParamArrayで受け取っていない(SumIfsに渡す引数の残り)分は、「参照不可」で渡しています。

一番下の関数UnRef参照不可を作り出しています。
変数をこの状態にすることで、引数を省略した状態として指定できます。

ただし、実際にSumifsを呼び出す部分では省略記法が無いので、必要な数の引数を指定しなければなりません。
この部分はどうしようもありません。

上記VBAの意味合いとしては、引数の指定を簡略化しただけになります。
それでも、引数を何十個も列挙せずに済ませる事には一定の意味があるのではないでしょうか。

もちろん引数の上限数が少なければ、以下のように引数を列記すれば良いことです。

Function SumIfs(合計範囲, _
        Optional 条件範囲1, Optional 条件1, _
        Optional 条件範囲2, Optional 条件2, _
        Optional 条件範囲3, Optional 条件3, _
        Optional 条件範囲4, Optional 条件4, _
        Optional 条件範囲5, Optional 条件5)
  SumIfs = WorksheetFunction.SumIfs(合計範囲, _
        条件範囲1, 条件1, _
        条件範囲2, 条件2, _
        条件範囲3, 条件3, _
        条件範囲4, 条件4, _
        条件範囲5, 条件5)
End Function

本記事では、省略可能なVariant引数の「参照不可」についての説明として、SumIfs関数のラッパーで説明してみました。
実際に使う事はほとんどないとは思いますが、VBAにおけるVariantの使い方の一つとして紹介してみました。



同じテーマ「マクロVBA技術解説」の記事

VBAでWMIの使い方について
アクティブシート以外のWindowを設定できるWorksheetView
LSetとユーザー定義型のコピー(100桁の足し算)
省略可能なVariant引数の参照不可をラップ関数で利用
ブックのいろいろな開き方(GetObject,参照設定,アドイン)
入力規則への貼り付けを禁止する
Select Caseでの短絡評価(ショートサーキット)の使い方
RangeオブジェクトのFor EachとAreasについて
画像が行列削除についてこない場合の対処
新関数SORTBYをVBAで利用するラップ関数を作成
LAMBDA以降の新関数はVBAで使えるか


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ