Kato Ryo Official Site

抽象度とエネルギーを上げる

【Excel VBA】Selectメソッドを実行した際に発生するエラーについて

2018/02/10
 
この記事を書いている人 - WRITER -
Pocket

WorksheetやRangeのSelectメソッドを実行した際に発生するエラーについて、ちょっとした備忘録。

今までVBAのコードを書いている中で、WorksheetやRangeのSelectメソッドを使用すると、「実行時エラー9 : インデックスが有効範囲にありません」というエラーが出ることがよくあった。

 

この理由だが、例えば、

Worksheets(“Sheet1”).Range(“A1”).Select

という文で、「Sheet1」のセル「A1」を選択しようとしたとき、Sheet1がアクティブ(=選択された状態)の時はエラーにならないが、アクティブでない場合にはエラーとなる。

 

ThisWorkbook.Worksheets(“Sheet1”).Select

も原理は同じ。
ThisWorkbook(=VBAのコードが書かれているブック)がアクティブな時はエラーにならないが、そうでない場合にはエラーになる。

 

そもそも選択したいセルの前にシート名を付けたり、シート名の前にブック名を付けるのは、複数のシートやブックを扱うのが前提となっている時だと思う。こういう時に、例えばSheet1が絶対に選択されているとわかっているのなら、

Worksheets(“Sheet1”).Range(“A1”).Select

と書いても良い。
だが、それだったらそもそもエラーは発生しないので、最初から問題にならない。

 

エラーを確実に回避するには、Select文を使ってシートやセルを選択する際に、そもそも上記のように繋げて書かずに、

Worksheets(“WorksheetやRangeのSelectについて、”).Select
Range(“A1”).Select

のように2文に分けて書く方が間違いないと最近は思う。(正確には、単純に2文に分けているのではなく、「Sheet1」を選択してからセル「A1」を選択するという、2段階の手続きを踏んでいる。)

 

もし、2文に分けると無駄に行数が増えてしまうと感じる場合は、

Worksheets(“Sheet1”).Select : Range(“A1”).Select

としても、可読性はほとんど落ちることはないだろう。

 

最初、なぜSelect文でエラーになるのかよくわからず、ネットで調べてもその理由は判明しなかったが、実際に動かしてみると、上記のような挙動になっているのがわかったので、記事としてみた次第。

この記事を書いている人 - WRITER -

- Comments -

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Copyright© 抽象度とエネルギーを上げる , 2017 All Rights Reserved.