投稿

9月, 2023の投稿を表示しています

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