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)
みたいな感じで、セル範囲のアドレスの文字列を作ってやる方法でも動作しますが、ちょっと面倒ですね
コメント
コメントを投稿