• 締切済み

初歩的な質問です!sheetの選択

よろしくお願いします! エクセル2003,Sheet1を右クリック>コードを表示を選択して、下のように記述したところ、予想と違う動作をしました。 sheet1,2のそれぞれのA1セルに各々のsheet名を入力したかったのですが、失敗した原因はどうしてでしょうか。activateをselectにしても変わりませんでした。 初歩的なことだと思いますが、どうぞよろしくお願いします! Sub macro() Worksheets("sheet1").Activate Cells(1, 1) = "sheet1です。" Worksheets("sheet2").Activate Cells(1, 1) = "sheet2です。" End Sub

みんなの回答

noname#158634
noname#158634
回答No.8

や、ですから問題はそんなところじゃないってことは#5でも#6でも言ってるんですがね…つまり#6のお礼で言われている「新たな疑問」の中身は全部が根本的にとんでもない勘違いです。すごく意味不明な誤解をしている。処理を記憶とか暗に行われるとかそんなのはないので忘れてください。 もう一度同じ説明をしますよ? あなたのサンプルの「Cells(1, 1)」は、「どのシートの」という部分を記述していません。そしてそのコードはSheet1に書かれています。シートに属するコードの中で、シートを指定していないCellsは「そのシートの」セルを指定していると認識されるわけです。Sheet2をアクティブにしようが、「Cells(1, 1)」が指すのはSheet1のA1です。だからSheet1のA1に"sheet2です"と入るんです。 質問文のコードの形をできるだけ保った状態で希望の動作に修正するには、「Activesheet.Cells(1,1)」と指定しなくてはいけません。

noname#152429
質問者

お礼

ご回答ありがとうございました!

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.2です! No.1さんのお礼欄を読ませてもらって・・・ >sheet2を指定せずに、以降の命令がsheet2に行われるようにするにはどのように記述したらよいでしょうか。 とありますので、Sheet1のVBE画面にコードを記述し、別Sheetの操作をしたい!ということだとすると 下記のような方法で可能です。 Sub test() Dim ws2 As Worksheet Set ws2 = Worksheets("Sheet2") ws2.Cells(1, 1) = ws2.Name & "です。" End Sub これでSheet2をアクティブにしなくてもSheet2のA1セルに表示されます。 それから当方の勇み足かもしれませんが、あるSheetをアクティブにするとそのSheetのA1セルに Sheet名を表示したい場合は Alt+F11キー → 画面左下の「This Workbook」をダブルクリック → ↓のコードをコピー&ペーストして好みのSheetをアクティブにしてみてください。 これでアクティブになったSheetのA1セルにそのSheet名が表示されるはずです。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Cells(1, 1) = ActiveSheet.Name & "です。" End Sub ※ 余計なお世話だったらごめんなさいね。m(_ _)m

noname#152429
質問者

お礼

ご回答ありがとうございました!

すると、全ての回答が全文表示されます。
noname#158634
noname#158634
回答No.6

#5です。 #1へのお礼を読んだので追記。 後半の疑問(というか質問本文からあなたの意図を私が読み取ったもの)への答えは#5でしましたから、 >sheet2を指定せずに、以降の命令がsheet2に行われるようにするにはどのように記述したらよいでしょうか。 への回答です。 Withを使用してください。 With~End Withの間では、Withで指定したオブジェクトを基準点にすることができるので、 With Sheets("Sheet2")  .Cells(1, 1).value = "A1"  .Cells(2, 1).value = "A2" End With という書き方ができます。

noname#152429
質問者

お礼

度々ご回答ありがとうございます! お陰様でここまでの疑問が解決致しました。対象のシートに対して記述した命令は、属するシートに対して行われるのですね。 しかし、ここで新たな疑問が浮かんできてしまいました。 VBに限らず、プログラムというのは上から順に実行していくものだと認知しております。 今回の件ではsheet2をアクティブにしたにもかかわらず、CellsプロパティはSheet2のオブジェクト(セルA1)に対して行われませんでした。これは、シートにコードを記述した場合、次の命令が前の命令の処理を記憶しておらず、それぞれの命令が独立で行われているという考えでよろしいでしょうか?つまり、次の命令(またはwithステートメントのような命令群)の間に、シートのselectが暗に行われているということになるのでしょうか。 それともこれは、VB独自の動作なのでしょうか。 言わんとすることが、上手く伝わらないと思いますが、ご理解頂ければ幸いです。

すると、全ての回答が全文表示されます。
noname#158634
noname#158634
回答No.5

>右クリック>コードを表示を選択して こうすると、記述したコードはSheet1に属することになります。 ですから、ワークシートの指定を省略した「Cells(1, 1)」は「Sheet1の」A1セルを示すことになります。これは案外繰り返してしまう間違いなので、この機にしっかり覚えてください。 Activesheet.Cells(1, 1)とするか、シートの指定を省略せず書く(この場合は、シートをアクティブにする必要がない)かすればお望みの動作をします。

noname#152429
質問者

お礼

ご回答ありがとうございました!

すると、全ての回答が全文表示されます。
  • mar00
  • ベストアンサー率36% (158/430)
回答No.4

シート名をすでにsheet1から変更しているのではないでしょうか。 その場合"sheet1"を選択しようとしてもエラーが起きます。 下記はブック内の全てのシートを対象にしています。 For i = 1 To Worksheets.Count Sheets(i).Cells(1, 1) = Sheets(i).Name Next i 一番最初と2番目のシートだけを対象としたい場合は For i = 1 To Worksheets.Countの所を For i = 1 To 2に直してください。

noname#152429
質問者

お礼

ご回答ありがとうございます! シート名は変更しておりませんが、今回は特定のsheetに対してコードを記述したことが原因でした。

すると、全ての回答が全文表示されます。
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

>Sheet1を右クリック>コードを表示を選択して、下のように記述したところ、予想と違う動作をしました。 イベントマクロを実行するなら、たとえば以下のようなコードでシートをアクティブにしたときに値を入れるようにします。 Private Sub Worksheet_Activate()  Cells(1, 1) = "sheet1です。" End Sub 元のマクロを生かしたいなら、VBE画面で「挿入」から「標準モジュール」をクリックして、そこに例示のコードをコピーして、それを「ツール」「マクロ」から実行してください。

noname#152429
質問者

お礼

ご回答ありがとうございます! 標準モジュールならどのシートにも属することなく、全シートが対象になるのですね。

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! せっかくコードをお考えのようですが・・・ ごくごく単純に Sub test() Dim i As Long For i = 1 To 2 Worksheets(i).Cells(1, 1) = Worksheets(i).Name & "です。" Next i End Sub ※ 私的には「Activate」や「Select」は動作が遅くなるのであまり使用しないようにしています。 こんな感じではどうでしょうか?m(_ _)m

noname#152429
質問者

お礼

>「Activate」や「Select」は動作が遅くなるのであまり使用しないようにしています そうなのですか!実務経験ゼロ故に、記述するコードも長くなることはないので、動作の快適性については考慮していませんでした。 ご回答ありがとうございました!勉強になります。

すると、全ての回答が全文表示されます。
  • tenda
  • ベストアンサー率0% (0/1)
回答No.1

下記で良いのでしょうか? Sub macro() Worksheets("sheet1").Activate Cells(1, 1) = "sheet1です。" Sheet2.Select : '特に必要ないけど・・・ Worksheets("sheet2").Cells(1, 1) = "sheet2です。" End Sub

noname#152429
質問者

お礼

ご回答ありがとうございます! 確かにその方法でもできます。 しかし、以降の命令文を記述していくのに、毎回sheet2を指定しなければならないのでしょうか。 sheet2を指定せずに、以降の命令がsheet2に行われるようにするにはどのように記述したらよいでしょうか。 worksheets("sheet2").activate '←この時点でsheet2がアクティブになり cells(1,1) = "sheet2です" '←この動作はアクティブなシートに行われると考えていたが・・・

すると、全ての回答が全文表示されます。

関連するQ&A