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の貼り付け等の時も同様で
かなりの手間と、コードの長さになってしまっています。
どこかの設定を変えると出来たりするのでしょうか?
又、他に良い方法がありましたらお教え下さい。
よろしくお願いします。
投稿日時 - 2005-10-19 16:27:10
こんにちは。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")
でよいわけです。
投稿日時 - 2005-10-19 16:45:25
お礼
Wendy02さん、こんにちは!いつもありがとうございます!!
お礼が遅くなってしまい、申し訳ありません。
>こうしたコンテナタイプの書き方は、本来は有効なのですが、
>ここで示されているRangeプロパティは、Worksheet オブジェクトの配下になっている関係で、
>Activateされていない場所のものは、Selectできないのです。
へぇー、そうだったんですね!またまた1つ賢くなりました。
>ActiveSheet.Range("A1").Copy Workbooks("abc.xls").Sheets("Sheet1").Range("A1")
これを、有難く有効に使わせて頂くことにしました。
本当にいつもいつも助かっています。
ありがとうございました!
投稿日時 - 2005-10-21 15:25:11
3人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(1件中 1~1件目)
こんにちは。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")
と同意になります。
投稿日時 - 2005-10-20 00:37:59
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")
>と同意になります。
ありがとうございます!
この辺りは初心者の私でもなんとか知っている範囲でしたので
できるだけ使うようにしているのですが
まだまだ、効率の悪いコードになっていることであろうと
情けなく思っています。
これから色々勉強して行きたいと思っています。
ありがとうございました!
投稿日時 - 2005-10-21 15:35:43