- 締切済み
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 =略 のように、変数を使わずに記述するとエラーになりません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kagakusuki
- ベストアンサー率51% (2610/5101)
まず、 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 の値も先に指定しておかなければなりません。
- dogs_cats
- ベストアンサー率38% (278/717)
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がエラーになります。実際はループするコードなのでしょうか。 変数は型式宣言、又宣言位置は冒頭に纏めて記載するようにしましょう。 他人が見ても分かりやすいコードになります。
お礼
ご回答ありがとうございます。 ご回答で、エラーなく動くようになりました。 ありがとうございました。 >実際はループするコードなのでしょうか。 抜粋したコードですので、不備がありました。失礼しました。 >変数は型式宣言、又宣言位置は冒頭に纏めて記載 ご親切にありがとうございます。 確かに、そのように記載した方が見やすいですね。
- m_and_dmp
- ベストアンサー率54% (987/1817)
Set ra = Range("C2") ra でセルの場所を指定したいのだと思いますが、ra はC2 に入力されている値になります。仮に、C2 に1 が入力されていると、stest.ra は、Worksheets("TEST").1 となり、意味を成しません。 C2 にセルのアドレス、たとえば A1 と記入し、 stest.ra.Value = を stest.Range(ra).Value= とすると、期待した動作をすると思います。
お礼
ご回答ありがとうございます。 私の理解不足が恥ずかしいかぎりです。 ご指摘ありがとうございます。 なるほど。そのような方法もあるのですね。勉強になりました。
お礼
ご回答ありがとうございます。 非常に明快な回答で、感謝いたします。