• ベストアンサー

VBAのオブジェクト変数について

人に教えなければいけないことなので、、、 困っています。 あるVBAのテキストを見て、そのテキストをそのまま入力しても実行できません。 (条件としては、Book1.xlsとBook2.xlsというファイルを開いた状態で、Book1.xlsのほうに、以下のモジュールを入力します。) Sub Set1() Dim myBook As Workbook Dim mySheet As Worksheet Dim myCell As Range Set myWBook = Workbooks("Book2.xls") Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") myWBook.Activate myWSheet.Activate myCell.Value = "ABC" End Sub これを実行すると、アクティブな状態のファイルにしか、値"ABC"が入ってこないのです。テキストでは、Book2.xlsのSheet2のA1:D10に値"ABC"が入ってくると言っていますが、Book1.xlsに値が入ってしまったりします。 長くなってしまってすみません。 もちろん、他の方法で実現することができるのはわかるのですが、なぜこのコードが実行できないのかがわかりません。 理由を教えていただけたら・・・と思います。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 ちゃんとWorksheetsオブジェクトとRangeオブジェクトに、ブック・シートを指定して下さい。 現在のコードだと省略されているので、アクティブブックのアクティブシートを参照します。 そして、 myWBook.Activate で、Book2.xlsをアクティブにする前にオブジェクトへの参照(Setステートメント)を記述しているので、このコードを実行する際にアクティブなブック(Book1.xls)のSheet2を参照することになってしまいます。 (Rangeも同様で、もしSheet1がアクティブなら、そちらを参照します。) 以下のように変更。 Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") ↓ Set myWSheet = myWBook.Worksheets("Sheet2") Set myCell = myWSheet.Range("A1:D10") ちなみに、値を代入するだけなら、 myWBook.Activate myWSheet.Activate の2行は不要です。 あえて、アクティブにしたいというなら別ですが。 テキストの条件も2つのブックが出てくるなら、そのテキストはまったく不適切な内容というしかありません。

sea-anemone
質問者

お礼

返事が遅くなってすみません。 シートやセルには、結果としてアクティブな状態の フルパスが入ってしまうんですね。 勉強になりました。 ありがとうございました。 (ちなみにテキストはやはり、不適切だったと思います・・・)

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

本当は x=Excel.Application B=Book S=Sheet C=Cell(Range)と略記すると 基本は、X.B.S.Cとオブジェクトの各階層をすべて左から指定するものと考える。 このとき B1=x.B   X.Bを置換え S1=B1.S  X.B.Sを置換え C1=S1.C のような表現が出来る。 本例ではB1、S1に値するものがない。 B1、S1の指定がないとActiveWorkBookやActiveSheetの 扱い(の救済的措置)になる。 CurrentフォルダとFullパスのようなイメージ。 イメージ的で語弊などあればご免。

sea-anemone
質問者

お礼

返事が遅くなってすみません。 ありがとうございました。

回答No.2

Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") の部分を以下のように変更してはどうでしょうか? Set myWSheet = myWBook.Worksheets("Sheet2") Set myCell = myWSheet.Range("A1:D10") どのブックの、どのシートかを指定しないとまずいです。 (複数のファイルを開いているため) 単体のファイルで、VBAを組んで、実行させる分には、いいのですが。でも、ちゃんと指定した方が今後のためにも、いいと思います

sea-anemone
質問者

お礼

返事が遅くなってすみません。 ありがとうございました。