質問: "下準備ボタンを先に押してください" Exit Sub End If '以下、省略 End Sub すると、Range("C3").Value は、Sheets("計算用") の"C3"ではなく、 Sheets("基本画面") の方の"C3"を対象として読み込んでしまいました。私はシートのコードを書くことはあまり多くなく、標準モジュールと同じ感覚で、Sheets("計算用") の"C3"の値を読んだつもりだったのですが、シートのコードと標準モジュールでは、どのような違いに注意したら良いのでしょうか。 さらに不思議なことに、この"C3"を"C7"などに変えると、Ataiの中身が "準備完了" などの文字列になったのです。しかしこの"準備完了"という文字列は、現在のブックにはどこにもありません。今のファイルの前の前ぐらいまで、確かに、 Sheets("基本画面") の"C7"には、"準備完了" と書き込んでいました。なぜ、昔のセルの中身(値)がゴーストのように残ってしまうのでしょうか・・・。 ツリーで、標準モジュールは標準モジュールで、シート専用マクロはExcel Objects で、はっきりわかれていますから、私はここの違いから理解できていなくてこんな馬鹿な質問をしてしまうのだと思います。他のシートのセルをオブジェクトとして指定したければ、モジュールが増えて多少猥雑になってでも、Call などで標準モジュールを呼び出すしかありませんか? よろしくお願いします。
回答: こんばんは。 >さらに不思議なことに、この"C3"を"C7"などに変えると、Ataiの中身が"準備完了" 名前登録などで出てきているのかもしれません。ただ、 >昔のセルの中身(値)がゴーストのように残ってしまうのでしょうか・・・。 フォントを白で見えなくしていない限りは、その現象は、ブックが少しずつ壊れつつあります。そのブックの継続的な使用はやめたほうがよいです。シートコピーではなく、セルコピーで、新しいシートにコピーしてください。また、名前-登録は、また同じく、ワークシートの中に値がもぐりこむ現象があります。なかなか、ややこしい現象です。 >モジュールが増えて多少猥雑になってでも、Call などで標準モジュールを呼び出すしかありませんか? ということはありませんが、「VBA」の根本的なことかもしれませんが、「猥雑」というほど、問題ではありません。VBAは、プライベートのものですから、問題なければ、それを押し通しても結構だと思います。ただ、人に教える場合のみ、そういう書き方は、イレギュラーだと覚えていてもよいです。 もう一つは、私自身、シートモジュールに必要以上にコードを書くのは、このましくないと思っています。複雑なコードがあるのなら、やはり、Call を作って、標準モジュールに書く方法もあります。 Private Sub CommandButton1_Click() Hidzuke = Range("A1").Value Atai = Worksheets("計算用").Range("C3").Value If Atai <> Hidzuke Then MsgBox "下準備ボタンを先に押してください" Exit Sub End If '続き End Sub Worksheets("計算用").Range("C3").Value こういう書き方を、コンテナといいます。 親オブジェクトから書きます。また、ブックが違うときには、ブックから書いてあげるのが良いわけです。 シートモジュール(ローカル)は、標準モジュール(グローバル)と違って、親オブジェクトは、シート(または、ブック)です。 Range("A1").Value ↓ これは、Worksheets("基本画面").Range("A1").Value ですが、省略することが可能です。しかし、標準モジュールのように、ActiveSheet が親オブジェクトになるのと違って、シートオブジェクトが親オブジェクトになります。 Me というキーワードも使えます。いくら、別のシートにSelect しても、その親オブジェクトのつながりを断ち切ることは出来ません。 ここらはややこしいので、標準的にマクロを書くのは、「標準モジュール」と覚えて使っていたほうがよいです。(Excelのみ)シートモジュール(ローカル)にマクロを書く場合は、よほど気をつけないと、エラーを発生することもあります。Me キーワードを利用してみるという手もあります。