こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Rangeなどを変数でエラー

Excel VBAについて。
以下のコードで「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
エラーが発生します。原因は何でしょうか?

Sub A()

Dim stest
Set stest = Worksheets("TEST")

Dim ra
Set ra = Range("C2")
stest.ra.Value = Sheets("Sheet1").Cells(i, 2).Value ★
End Sub

★をSheets("TEST"). Range("C2").Value =略
のように、変数を使わずに記述するとエラーになりません。

投稿日時 - 2015-06-29 19:19:37

QNo.9003106

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

 まず、

Cells(i, 2)

の中の変数 i の値が設定されていない事によってエラーとなる事は確かですが、その場合のエラーは

「実行時エラー '1004'
アプリケーション定義またはオブジェクト定義エラーです。」

になる筈ですので、

「オブジェクトは、このプロパティまたはメソッドをサポートしていません」

というエラー表示になったという事は、「変数 i の値が設定されていない事」が直接の原因ではないという事になります。
 おそらく

「実行時エラー '438'
オブジェクトは、このプロパティまたはメソッドをサポートしていません。」

というエラー表示が現れているものと思われますが、その原因は

Set ra = Range("C2")

の所で変数 ra にC2セルを設定してから、

stest.ra.Value =

の様に「後からシートを指定した」ためです。

Set ra = Range("C2")

の様に「どのシートのC2セル」であるのかを指定せずに「C2セルである事だけを指定」したからと言って、変数 ra にシートの情報が設定されない訳ではないのです。

Set ra = Range("C2")

の様に「どのシートのC2セル」であるのかを指定しなかった場合には、

Set ra = ActiveSheet.Range("C2")

と同じ意味になるのです。
 つまり、変数 ra の中には

ActiveSheet.Range("C2")

というシートが指定されたセルが入っているというのに、その後で

stest.ra.Value =

としたのでは、

Sheets("TEST").ActiveSheet.Range("C2").Value =

と記述したのと同じ事になってしまい、「TESTシートの中のActiveSheet」などという訳の解らない記述内容となってしまうため「このプロパティまたはメソッドをサポートしていません。」というエラーになる訳です。
 ですから、変数 ra にセルを格納する際に、

Set ra = Range("C2")

ではなく、

Set ra = stest.Range("C2")

という具合に「"どのシートの"C2セルであるのか」という事を明確にした形式でセルを格納した上で、

stest.ra.Value =

の所では、既に変数 ra の中にシートの情報が含まれているのですから、「stest.」は付けずに

ra.Value =

として下さい。

 勿論、その事とは別に、

Cells(i, 2)

の中の変数 i の値も先に指定しておかなければなりません。


  

投稿日時 - 2015-06-30 01:14:23

お礼

ご回答ありがとうございます。

非常に明快な回答で、感謝いたします。

投稿日時 - 2015-06-30 21:36:53

ANo.2

Sub A()

Dim stest As Worksheet
Dim ra As Range

Set stest = Worksheets("TEST")
Set ra = stest.Range("C2")
ra.Value = Sheets("Sheet1").Cells(i, 2).Value

End Sub

変数iはどこにも記載されていないのでSet ra を修正してもCells(i, 2).Valueがエラーになります。実際はループするコードなのでしょうか。

変数は型式宣言、又宣言位置は冒頭に纏めて記載するようにしましょう。
他人が見ても分かりやすいコードになります。

投稿日時 - 2015-06-29 21:02:50

お礼

ご回答ありがとうございます。

ご回答で、エラーなく動くようになりました。
ありがとうございました。

>実際はループするコードなのでしょうか。
抜粋したコードですので、不備がありました。失礼しました。

>変数は型式宣言、又宣言位置は冒頭に纏めて記載
ご親切にありがとうございます。
確かに、そのように記載した方が見やすいですね。

投稿日時 - 2015-06-29 22:21:39

ANo.1

Set ra = Range("C2")
ra でセルの場所を指定したいのだと思いますが、ra はC2 に入力されている値になります。仮に、C2 に1 が入力されていると、stest.ra は、Worksheets("TEST").1 となり、意味を成しません。

C2 にセルのアドレス、たとえば A1 と記入し、
stest.ra.Value = を
stest.Range(ra).Value=
とすると、期待した動作をすると思います。

投稿日時 - 2015-06-29 19:51:37

お礼

ご回答ありがとうございます。

私の理解不足が恥ずかしいかぎりです。
ご指摘ありがとうございます。

なるほど。そのような方法もあるのですね。勉強になりました。

投稿日時 - 2015-06-29 22:24:25

あなたにオススメの質問