• 締切済み

初歩的な質問です!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#152429
noname#152429

みんなの回答

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

  • アクティブでないシートのセルを選択

    Excel VBAでアクティブでないシートのセルをSelectすることはできないのでしょうか。 Selectメソッドというのは,もともとそういうものなのでしょうか。 エラー: 「RangeクラスのSelectメソッドが失敗しました。」 コード Sub aaa() With Worksheets("Sheet2") .Range(.Cells(44, 1), .Cells(48, 21)).Select End With End Sub

  • ActiveX コントロールでのセル選択

    Excel VBA独学中の初心者です。 目的:ActiveX コマンドボタンをクリックして他のSheetのセルを選択する 環境例:シートが2個(Sheet1、Sheet2) Sheet2にActiveXコントロールのコマンドボタンを置く 【プログラム1】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 結果:この時次のようなエラーが出ました。 '実行時エラー'1004 'アプリケーション定義またはオブジェクト定義のエラーです。 -------------------------------- -------------------------------- 【プログラム2】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Worksheets(1).Range("A5").Select End Sub ---------------- 結果:OK ---------------- ---------------- ところが次の【比較1】【比較2】の場合、「Range("A5").Select」だけでOKでした。 ---------------- 【比較1】 コントロールの存在するSheetのセルを選択する場合は「Range("A5").Select」だけでOKでした。 ---------------- 【比較2】 Subマクロで記述する場合も「Range("A5").Select」だけでOKでした。 プログラムは以下 -------- Sub セル選択() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 【質問】 ActiveX コントロールを置いているSheetとは別のSheetのセルを選択する時は、選択しようとするセルの「Sheet名」から記述しなければならないのでしょうか。 「Range("A5").Select」だけでOKだった【比較1】【比較2】との違いを教えていただきたくお分かりの方宜しくお願いします。 (用語の使い方に誤りがありましたらすみません。)

  • シート間のコピー時の列幅と行の高さ

    マクロ初心者です。下記はシート間のコピーですが、列幅と行の高さも一緒にコピーするにはどのように書いたらよいでしょうか。マクロは"sheet1"に入っています。よろしくお願いいたします。 Sub macro1() Worksheets("sheet2").Activate Cells.Clear Worksheets("sheet1").Activate Worksheets("sheet1").UsedRange.Copy ActiveSheet.Paste Destination:=Worksheets("sheet2").Range("A1") End Sub

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • 複数シートの選択

    エクセルVBAで複数シートの選択をしたいのです。 シート名やシートの位置が変更される可能性があるので オブジェクトで指定したいのですが 記述方法が分かりません。 ##シートの位置 Sub mac1() Worksheets(Array(2,5)).Select End Sub ##シート名 Sub mac2() Worksheets(Array("aaa","あああ")).Select End Sub

  • 複数シートの選択範囲を一枚のシートに貼り付ける

    Excel2007使用のマクロ初心者です。 以下のコードで正常に、動作しています。 複数シートのセルB29からBQ60までのセル範囲を 「計算シート」の一枚に右列方向に、順次貼りつけています。 しかしこれは不要な部分も貼り付けしてるので セル範囲をB29からI60までと BM29からBM60までの2箇所を、上記同様に「計算シート」に 右列方向に貼りつけていきたいです。 このコードをどう修正したらよいでしょうか。また別方法ありますでしょうか。 Sub 計算表の一括複写() Application.ScreenUpdating = False Dim list, SheetName ActiveSheet.Unprotect Const EXCEPT_NAME = " 年月管理  最新明細 記録帳" Worksheets("計算").Activate Rows("2:33").Select Selection.Delete Shift:=xlUp Dim k As Long Dim ws As Worksheet Set ws = Worksheets("計算") Application.DisplayAlerts = False On Error Resume Next For k = 1 To Worksheets.Count - 8 If Worksheets(k).Name <> "計算" Then Range(Worksheets(k).Cells(29, "B"), Worksheets(k).Cells(60, "BQ")).Copy ws.Cells(2, Columns.Count).End(xlToLeft).Offset(, 1).Select Selection.PasteSpecial Paste:=xlPasteValues End If Next k Application.CutCopyMode = False 空白列の削除 End Sub

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが

    コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが以下のやり方では”RangeクラスのSelectメソッドが失敗しました。”のエラーが出てしまいます。どこがいけないのか教えてください。 Private Sub CommandButton1_Click() Worksheets("sheet2").Activate Range("a65536").End(xlUp).Offset(1).Select End Sub ちなみに、コマンドボタンはシート1にあります。 よろしくお願いします。

  • 複数のシートに 転記

    Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.ClearContents  End Sub シート1,3の3行目のデータを消したい もしくは Sub べんきょう()   Worksheets(Array(1, 3)).Select   Range("3:3").Activate   ActiveCell.Interior.color = xlNone  End Sub シート1,3の3行目の色を消したい うまくいかなくて困ってます…。 どなたかどうかご指導よろしくです。

  • なぜ・・・?

    下記のように選択したセルを別シートに転送するマクロを作りましたが うまく作動しません Sub Macro1() ' ' Macro1 Macro ' 転送' Rows("Cells.Select").Select Range("B200").Activate Selection.Copy Sheets("張付け").Select Range("A7:A8").Select ActiveSheet.Paste End Sub

専門家に質問してみよう