VBAのRangeでセル範囲を動的に取得しようとすると「400」というエラーが発生する

 VBAでセル範囲を動的に取得しようとしたときに、「400」と書かれたダイアログが表示され、デバッグモードにもならずマクロが終了してしまうことがあります。

VBAのコードとしてはこんな感じで、指定したシートのセル範囲を取得しようとしています


Dim WS As Worksheet

Dim Rng As Range

Dim AX, AY, BX, BY As Long

Set WS = Worksheets("名簿")

'AX, AY, BX, BY の値は別途設定されているものとします

Set Rng = Range(WS.Cells(AX, AY), WS.Cells(BX, BY))


実行してみると、「400」というエラーが発生する場合があります。

検索してみると、存在しない範囲を取得しようとするとエラーが発生するとか書かれていたりするんですが、セル座標に使用している変数の値に問題はない。そもそも同じようなやり方で以前は動いたはず・・・。と悩んでいましたが、このエラーの原因がわかりました。

その理由は、

コードを書く場所を間違っている

正確に言うと、

コードを書く場所によって記述方法が異なる

というものでした。


VBAのコードを記述する場所には、

標準モジュール・クラスモジュール・ブックモジュール・シートモジュールの4種類があります。シートモジュール以外であれば、上記の書き方でも動作します。

しかし、シートモジュールに記述して、他のシートの範囲を取得しようとすると、エラーが発生します。

シートモジュールに記述する場合は、

Set Rng = WS.Range(WS.Cells(AX, AY), WS.Cells(BX, BY))

このように、Range関数、その引数として使われているCells関数、どちらもどのワークシートのセル範囲なのかを明記してやれば、シートモジュール上でも問題なく動作します

それ以外の方法として、

Set Rng = WS.Range(Chr(AX+64) & AY & ":" & Chr(BX+64) & BY)

みたいな感じで、セル範囲のアドレスの文字列を作ってやる方法でも動作しますが、ちょっと面倒ですね

コメント

このブログの人気の投稿

VBAでOutlookメールのフォントを変更する

映画「ウイッシュ」のエア感想

VBA 引数として渡す変数とその宣言