「プロシージャの呼び出し、または引数が不正です。」の原因とは

エラー

はじめに

 このエラーは、対象のプロシージャの引数が許可されている範囲を超えている場合に起こります。
 また、現在のプラットフォーム(WimdowsかMac)で有効でないプロシージャを呼び出した場合にも発生します。

 ここで言う「プロシージャ」とは主にExcelVBA固有のプロシージャを指しているようで、個人が作成したプロシージャの場合は、別のエラーが発生するようです。

ExcelVBA固有のプロシージャ(関数)の引数を誤った

 「プロシージャの呼び出し、または引数が不正です。」というエラーを再現してみます。

文字列関数の場合

 例えば、文字列関数の Left は、文字列の先頭から取り出す文字数を第二引数で指定しますが、0 未満の数値を指定すると「プロシージャの呼び出し、または引数が不正です。」というエラーとなります。
 これは分かりやすいでしょう。
 Left の第二引数を変数にしている場合などは代入される値を確認してみましょう。

Sub MacroError1()
    Dim str As String
    str = Left("abcde", -1)  '第二引数は 0 以上でなければならない。
    Debug.Print str
End Sub

Dir関数の場合

 Dir関数は、ワイルドカード(test*.txt)などを指定すると、呼び出すたびに該当するパスを返す関数で使い方に少々クセがあります。もし、存在しないパスを指定すると、空白文字列(文字列数が0の文字列)を返し、存在するパスかを見極めるためにも使います。
 ただし、初回で引数が無い場合や、引数に空白を渡してしまった場合には、エラー(「プロシージャの呼び出し、または引数が不正です。」)が発生します。

Sub testDir1()
    Dim str As String
    str = Dir   '初回で引数がないのでエラーとなる。
End Sub

 上記は、初回で引数を省略した例です。

Sub testDir2()
    Dim str As String
    str = Dir("C:\aaaaaaaaa\test.txt")      '存在しないパス
    Debug.Print str        'エラーとならずに空白文字列を返す。
    str = Dir       	   '空白文字列を返した直後に引数を省略するとエラーとなる。
End Sub

上記のプログラムで、最初のDirで存在するパスをしてした場合、2回目のDirでは空白文字列を返すのでエラーは発生しません。

自作のプロシージャで引数の指定ミス

 もし自作のプロシージャで引数の指定を誤った場合、「プロシージャの呼び出し、または引数が不正です。」というエラーの代わりに「型が一致しません。」「引数は省略できません。」などのエラーが発生します。

プラットフォーム(Windows,Mac)の違い

 当然ですが、WindowsとMacではシステムが違いますので、ファイルを扱うような処理では仕様が異なります。そのため、それらのプロシージャも専用のものが用意されていますので、Mac上でWindowsのExcelVBAを動作させようとすれば、エラーとなります。
 異なるプラットフォームで使用する場合は、該当する部分を変更する必要があるでしょう。

Excelのバージョンにより仕様が変わったケース

 古いプログラムを実行しているなど、作られたファイルと実行するExcelのバージョンが異なるような場合、仕様の変更などから「プロシージャの呼び出し、または引数が不正です。」というエラーが発生する事が考えられます。
 このような時は、デバッグで停止したプロシージャ(関数)をよく観察して、適切な引数に変更すれば直る可能性があります。

まとめ

 「プロシージャの呼び出し、または引数が不正です。」はExcelVBA固有のプロシージャで引数に問題がある場合に発生します。
 ケースとしては、以下のような場合です。
 
 ・対象のプロシージャの引数が許可されている範囲を超えている
 ・現在のプラットフォーム(WimdowsかMac)で有効でないプロシージャを呼び出した

 また、Excelのバージョンが異なる場合、VBA固有のプロシージャに変更があった場合にはこのエラーが発生する可能性が高いでしょう。

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