- ベストアンサー
ECXEL VBA - Selectメソッドの失敗
Rangeを指定するのに、 Workbooks("abc").Sheets("Sheet1").Range("A1").Select と言う風に指定したいのですが、これを行なうと -------------------------------------------- 実行時エラー '1004': RangeクラスのSelectメソッドが失敗しました。 -------------------------------------------- となってしまう為、いつもわざわざ下記のようにしています。 Workbooks("abc").Activate Sheets("Sheet1").Select Range("A1").Select Selectだけでなく、Copyの貼り付け等の時も同様で かなりの手間と、コードの長さになってしまっています。 どこかの設定を変えると出来たりするのでしょうか? 又、他に良い方法がありましたらお教え下さい。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。Wendy02です。 >Workbooks("abc").Sheets("Sheet1").Range("A1").Select こうしたコンテナタイプの書き方は、本来は有効なのですが、ここで示されているRangeプロパティは、Worksheet オブジェクトの配下になっている関係で、Activateされていない場所のものは、Selectできないのです。 Application.Goto Workbooks("abc.xls").Sheets("Sheet1").Range("A1") とすればよいことですが、しかし、こういう場面に出会うということは、そんなに多いものではないのです。実際、Select すること自体は、最終のシートやセルをActive にさせる以外は必要がないのです。 >Selectだけでなく、Copyの貼り付け等の時も同様で >かなりの手間と、コードの長さになってしまっています。 Copy の時は、Destination をあわせるだけでよいのですが、コンテナタイプの書き方をすれば、 ActiveSheet.Range("A1").Copy Workbooks("abc.xls").Sheets("Sheet1").Range("A1") でよいわけです。
その他の回答 (1)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 【Wendy02 さんのコメントより引用】 > 実際、Select すること自体は、最終のシートやセルをActive > させる以外は必要がないのです。 私も同感です。Select や Activate が本当に必要なケースは ごくわずかです。 例えば、A1セルに数字の値を入力したいなら、 Workbooks("abc").Activate Sheets("Sheet1").Select Range("A1").Select ActiveCell.Value = 10 みたいなコードになるわけですが、#1 で Wendy02 さんが解説され た理由で Select に失敗するのであれば、 Workbooks("abc").Sheets("Sheet1").Range("A1").Value = 10 と書いても求める結果は一緒です。Select メソッドで失敗するなら、 Select しなければ良い、、、といったところでしょうか。 無論 Select してからでないと失敗するメソッドがあり、それらは 例外となりますが。 > ...かなりの手間と、コードの長さになってしまっています。 そのために Set ステートメントや With ステートメントがあります。 例) Dim SH as Worksheet Set SH = Wrokbooks("abc").Sheets("Sheet1") で、以降 SH.Range("A1") と書けば、 Wrokbooks("abc").Sheets("Sheet1")..Range("A1") と同意になります。
お礼
KenKen_SPさん、早速ご回答ありがとうございました! お礼が遅くなってしまい、申し訳ありません。 >Select メソッドで失敗するなら、 >Select しなければ良い、、、といったところでしょうか。 そうなんですよね、私もSelectしない方が処理も早くなるし Selectせずに進めたいのですが、なかなかうまく行かない時があったりして、頭を悩ませています。。。 それが >無論 Select してからでないと失敗するメソッドがあり、それらは >例外となりますが。 の時なのでしょうかね?! >そのために Set ステートメントや With ステートメントがあります。 >(中略) >Dim SH as Worksheet >Set SH = Wrokbooks("abc").Sheets("Sheet1") >で、以降 SH.Range("A1") と書けば、 >Wrokbooks("abc").Sheets("Sheet1")..Range("A1") >と同意になります。 ありがとうございます! この辺りは初心者の私でもなんとか知っている範囲でしたので できるだけ使うようにしているのですが まだまだ、効率の悪いコードになっていることであろうと 情けなく思っています。 これから色々勉強して行きたいと思っています。 ありがとうございました!
お礼
Wendy02さん、こんにちは!いつもありがとうございます!! お礼が遅くなってしまい、申し訳ありません。 >こうしたコンテナタイプの書き方は、本来は有効なのですが、 >ここで示されているRangeプロパティは、Worksheet オブジェクトの配下になっている関係で、 >Activateされていない場所のものは、Selectできないのです。 へぇー、そうだったんですね!またまた1つ賢くなりました。 >ActiveSheet.Range("A1").Copy Workbooks("abc.xls").Sheets("Sheet1").Range("A1") これを、有難く有効に使わせて頂くことにしました。 本当にいつもいつも助かっています。 ありがとうございました!