プロが教えるわが家の防犯対策術!

Rangeを指定するのに、
Workbooks("abc").Sheets("Sheet1").Range("A1").Select

と言う風に指定したいのですが、これを行なうと

--------------------------------------------
実行時エラー '1004':
RangeクラスのSelectメソッドが失敗しました。
--------------------------------------------

となってしまう為、いつもわざわざ下記のようにしています。

Workbooks("abc").Activate
Sheets("Sheet1").Select
Range("A1").Select

Selectだけでなく、Copyの貼り付け等の時も同様で
かなりの手間と、コードの長さになってしまっています。

どこかの設定を変えると出来たりするのでしょうか?

又、他に良い方法がありましたらお教え下さい。
よろしくお願いします。

A 回答 (2件)

こんにちは。

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")

と同意になります。
    • good
    • 0
この回答へのお礼

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

こんにちは。

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")

でよいわけです。
    • good
    • 0
この回答へのお礼

Wendy02さん、こんにちは!いつもありがとうございます!!
お礼が遅くなってしまい、申し訳ありません。

>こうしたコンテナタイプの書き方は、本来は有効なのですが、
>ここで示されているRangeプロパティは、Worksheet オブジェクトの配下になっている関係で、
>Activateされていない場所のものは、Selectできないのです。

へぇー、そうだったんですね!またまた1つ賢くなりました。

>ActiveSheet.Range("A1").Copy Workbooks("abc.xls").Sheets("Sheet1").Range("A1")

これを、有難く有効に使わせて頂くことにしました。
本当にいつもいつも助かっています。
ありがとうございました!

お礼日時:2005/10/21 15:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!