• ベストアンサー

シートのコード(マクロ)で別のシートを指定することはできますか?

環境はWINDOWS XP, EXCEL 2003 です。 VBAについて、初歩的な質問ですみません。 コードを書けるモジュールには Microsoft Excel Objects と標準モジュールとありますが、シートのコードでは、別のシート上のセルをオブジェクトとして指定することはできないのでしょうか? 今開いていて、ボタンのあるシートを、Sheet1 (基本画面)、読み込みたいデータがあるシート(同じブック内)をSheet3 (計算用)、とします。 基本画面のセルA1に日付を入力してから、「データ選択」ボタン(コントロールツールボックスで標準で出てくるボタンです)を押すと以下のマクロが動くようにしたため、このコードはSheet1のモジュールに書きました。 このマクロの前半に、日付が、計算用のC3に事前に書き込まれている日付と一致しているかどうかを判定させ、一致しない時は中断するようにさせたのです。マクロ後半は本題と関係ないと思うので省きます。 Private Sub データ選択_Click() '前半で下準備ができているか、チェック Hidzuke = Range("A1").Value Sheets("計算用").Select Atai = Range("C3").Value Sheets("基本画面").Select If Atai <> Hidzuke _ Then Range("A2").Value = "下準備ボタンを先に押してください" Exit Sub End If '以下、省略 End Sub すると、Range("C3").Value は、Sheets("計算用") の"C3"ではなく、 Sheets("基本画面") の方の"C3"を対象として読み込んでしまいました。私はシートのコードを書くことはあまり多くなく、標準モジュールと同じ感覚で、Sheets("計算用") の"C3"の値を読んだつもりだったのですが、シートのコードと標準モジュールでは、どのような違いに注意したら良いのでしょうか。 さらに不思議なことに、この"C3"を"C7"などに変えると、Ataiの中身が "準備完了" などの文字列になったのです。しかしこの"準備完了"という文字列は、現在のブックにはどこにもありません。今のファイルの前の前ぐらいまで、確かに、 Sheets("基本画面") の"C7"には、"準備完了" と書き込んでいました。なぜ、昔のセルの中身(値)がゴーストのように残ってしまうのでしょうか・・・。 ツリーで、標準モジュールは標準モジュールで、シート専用マクロはExcel Objects で、はっきりわかれていますから、私はここの違いから理解できていなくてこんな馬鹿な質問をしてしまうのだと思います。他のシートのセルをオブジェクトとして指定したければ、モジュールが増えて多少猥雑になってでも、Call などで標準モジュールを呼び出すしかありませんか? よろしくお願いします。

  • QoooL
  • お礼率100% (171/171)

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Atai = Sheets("計算用").Range("C3").Value と言ったように、どのシートなのかを明確にしておけばいいのでは。

QoooL
質問者

お礼

なるほど! 目が覚めました! お返事遅くなってすみません。たいへんすばやいご回答、ありがとうございました。 コンテナ、という言い方は忘れていましたが、どこのレンジなのか、名前を先に付けてやれば良かっただけなのですね。 難しく考え過ぎました。 Sheets("計算用").Select Atai = Range("C3").Value Sheets("基本画面").Select というのも、コンテナで書けば済むことをわざわざ3行で書いてしまって、見る人から見ればとても不格好だったでしょう。 的確なご回答ありがとうございました「。

その他の回答 (2)

  • Avirex
  • ベストアンサー率33% (1/3)
回答No.3

こんばんは。 私も初心者ですがMicrosoft Excel Objects のSheet部に(ThisWorkbook)以外にあえて記述するメリット?というか必要性があるのかなと、疑問に思っていました。 実際には全く使用したことがないので標準モジュールもしくはUserForm上のボタンorボックス等々上に必要なプログラムを記述すれば事足りるかなと思います。 ただその際には、n-junさんのアドバイスの通りシート名とかUserFormの番号UserForm1やUserForm2を指定します。 Sheets("計算用").Select Atai = Range("C3").Value Sheets("基本画面").Select 上を↓ Atari=Sheets("計算用").Range("C3").Value Sheets("基本画面").Select 計算用のシートがMicrosoft Excel Objects上でSheet3ならば Atari=Sheet3.Range("C3").Value Sheet1.Select と標準モジュールに書き込めばよいと思います。 今まで気にしていなかった疑問ですがMicrosoft Excel Objects のSheet部を使用するメリットがあればご指南ください。

QoooL
質問者

お礼

私の説明が足りなかった、というか私もその差がわかっていなかったのですが、私が 「データ選択」ボタン(コントロールツールボックスで標準で出てくるボタン) と言っているのはたぶん(自分のことなのに「たぶん」ですみません)ActiveX コントロールで、 Avirex様がおっしゃっているのは、ユーザーフォームコントロールのことではないですか? 私は、マクロを学び始めたのは、人(上司)がやっていることを真似ることからだったので、その後本を読んだりもしましたが、なかなか、「人がやっているのを見たことがある」こと以上には知識が広がりません。 (←言い訳がましいですが) >標準モジュールもしくはUserForm上のボタンorボックス等々上に必要なプログラムを記述すれば事足りるかな とおっしゃっている部分で、標準モジュールはわかりますが、ボタンorボックス等々上にプログラムを記述する、というのは、ボタン等にマクロを「登録する」ことを意味してらっしゃるのでしょうか? 私のエクセルでは、アイコンはActiveX コントロールのボタンの方になっているので(プロパティ、がある方)いつもこちらを多用していて、「マクロを登録」するメニューは出てきません。だからいつもボタンのあるシートのモジュールの方に Sub CommandButton1_Click() を書いています。シートじゃなくて標準モジュールの方に _Click()  を書いても発動することも、今回初めて知りました。だからなぜシートの方に書いているのかわかりません。 ユーザーフォームコントロールだと、マクロの登録をメニューで聞いてきて便利ですね。オートシェイプでは見たことありましたが、「ボタン を押すと~」の設定がクリックし続けるだけでできて、とても便利だと再認識しました。 n-jun様、Wendy02様、Avirex様(投稿順)ご回答ありがとうございました。私がお礼に質問ぽいことを書いてしまったので、この質疑はまだ続きそうですが、迷った末、回答はいったん締め切らせていただきます(18日朝に)。本題については既に、ご回答がでそろっていますので。私もさらなる疑問についてはよく調べた上で「別の質問」として再投稿したいと思います。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >さらに不思議なことに、この"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 キーワードを利用してみるという手もあります。

QoooL
質問者

お礼

返事が遅くなってすみませんでした! 前の方のお返事がたいへん早かったため、次点とさせていただきましたが、補足としてたいへん充実しており、大満足です。 私が構造からわかっていないのを察して、構造から説明してくださり、たいへん理解が進んで助かりました。 なるほど、Me キーワードというのは全く知りませんでした、とても活用できそうです! 本来、別の質問にわけるべきだったかも知れませんが、 昔のセルの中身(値)がゴーストのように残ってしまう 件についても答えていただいてありがとうございました。気になっていたのです。 >フォントを白で見えなくはしていない ので、 >ブックが少しずつ壊れて きているのでしょうね・・・。120MBの大きなファイルで計算式もグラフも多く、ボタンなどのオブジェクトも多い上にオブジェクトを何度も移動させていて、マクロもたくさん組んで長いので、壊れても不思議はないかも知れません。(この3つの中でも、オブジェクトが一番悪さ(というか予想外のエラー)の原因になりやすいのでしょうか) 解決方法まで提示してくださって助かります。 かゆいところに手の届くご回答で、本当にありがとうございました!

関連するQ&A

  • 指定記号のみ別シートにコピー

    sheet1(表-1)の入力文字「A,C,E」をsheet2へコピーする。 sheet2(表-3)のように[A,C,E」以外及びsheet1空白のセルはsheet2でも空白としたい。 その際、sheet2(表-2)に入力済みの記号「○、●、◎」はそのまま残したい。 下記のコードでは、sheet2に入力済みの記号「○、●、◎」が消えてしまいます。 どなたかコードがわかる方よろしくお願いします。 Sub シートコピー() Dim r As Range For Each r In Worksheets("Sheet1").Range("B1:D5") If WorksheetFunction.CountIf(Range("A8:A10"), r.Value) Then Sheets("sheet2").Range(r.Address).Value = r.Value Else Sheets("sheet2").Range(r.Address).Value = "" End If Next End Sub セルA11に"0"を入力して実行してもsheet1空白セルはsheet2でも空白となり困っています。

  • マクロ 新しいデータを別シートに追加する

    Sub Macro1()   ' Macro1 Macro   Sheets("Sheet1").Range("J3:X20").Copy   Sheets("Sheet2").Range("A3:O3").Insert Shift:=xlDown   Application.CutCopyMode = False   Sheets("Sheet2").Select   Sheets("Sheet2").Range("A3:O20").Value = Sheets("Sheet2").Range("A3:O20").Value End Sub 上記のように、マクロを作成しました。  Sheet1(J3:X20)のデータの中で毎月データが変化します。 これをSheet2(A3:O20)に移す場合にSheet1(J3:X20)にデータのあるもののみ(数式以外)だけをSheet2(A3:O20)に既存のデータに追加して行くとき、どのようなコードにしていけばいいのか、教えていただけませんか。

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • エクセルマクロ:範囲の選択

    マクロで範囲を指定したいのですが、 dataと名づけたシートA1に例えば8という値、A2に20という値があります。 この数字は他のセルから参照する計算式になっていて再計算をするたびに変わります。 この時、C8:E20の範囲を指定したいのですが、やみくもに Dim c As Integer c = 3 'C列 Range(Cells(Sheets("data").Range("A1").Value, c), Cells(Sheets("data").Range("A2").Value, c + 2)).Select Selection.Copy などと書いてみたのですが、うまくいきません。 どのように記述すればよいか、教えてください、宜しくお願いいたします。

  • エクセル2007マクロ シート間のセルコピー

    [Sheet1]にあるデータを[Sheet2]にコピーするマクロボタンを[Sheet2]に作りたいのですが、マクロがよく分からないので、「マクロの記録」で作成してみました。 Sub siken() ' ' siken Macro ' ' Sheets("Sheet1").Select Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B3").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B6:D6").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B6").Select ActiveSheet.Paste End Sub (実際はもっと多くのセルをコピーします) マクロを実行すると、ちゃんとコピーできるのですが、セルをコピーする都度[Sheet1]と[Sheet2]が交互に表示されます。 コピー元の[Sheet1]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセル、マクロにて月を指定して別シートに表示はできるのでしょうか?

    エクセル、マクロにて月を指定して別シートに表示はできるのでしょうか? 毎度毎度申し訳ありません。開始日の検索で、5月と打っただけ5月分だけ表示6月とうったら6月が出て来る方法なんてあるのでしょうか?ありましたら、下記のコードをどう直せいいか教えて頂けますでしょうか?宜しくお願い致します。 【作業内容:場所と月を検索、さらに要らない列を消し、別シートに表示】【検索月はC】  A B   C     D     E     F   G   H    I   J    K 部署 No.  開始日  終了日   担当者  設備  刃名 枚数  内容 工数 備考 茨城 1 2010/5/7  2010/5/10  B緒  L型   K  16枚  研削 6.00 東和電気 東京 2 2010/6/7  2010/6/8   B緒  L型   K  16枚  研削 6.83 東和電気 茨城 3 2010/5/18  2010/5/19  B緒  L型   K  16枚  研削 1.50 東和電気 茨城 4 2010/5/16  2010/5/19  B緒  L型   K  16枚  研削 6.83 東和電気 茨城 5 2010/6/10  2010/6/10  B緒  L型   K  16枚  研削 6.83 東和電気 ↓ A  B   C     D    E     F   部署 No.  開始日  担当者  内容   工数 茨城 1 2010/5/7  B緒   研削   6.00 茨城 3 2010/5/16  B緒  掃除   6.83 茨城 4 2010/5/18  B緒  出荷   1.50 【コード】 Sub 検索() Dim R As Long Dim Row2 As Long '●Sheet2書込み行 Sheets("集計表").Range("A5").CurrentRegion.Clear Sheets("集計表").Range("A5:F5").Value = Array("依頼部署", "依頼書No.", "研磨開始日", "担当者", "作業内容", "作業内容", "工数") Row2 = 5 For R = 2 To Sheets("日報").Cells(Rows.Count, "A").End(xlUp).Row If Sheets("日報").Cells(R, "A") = Sheets("集計表").Range("A2") And _ Sheets("日報").Cells(R, "C") >= Sheets("集計表").Range("B2") And _ Sheets("日報").Cells(R, "C") <= Sheets("集計表").Range("C2") Then Row2 = Row2 + 1 Sheets("集計表").Cells(Row2, "A").Value = Sheets("日報").Cells(R, "A").Value Sheets("集計表").Cells(Row2, "B").Value = Sheets("日報").Cells(R, "B").Value Sheets("集計表").Cells(Row2, "C").Value = Sheets("日報").Cells(R, "C").Value Sheets("集計表").Cells(Row2, "D").Value = Sheets("日報").Cells(R, "E").Value Sheets("集計表").Cells(Row2, "E").Value = Sheets("日報").Cells(R, "I").Value Sheets("集計表").Cells(Row2, "F").Value = Sheets("日報").Cells(R, "J").Value End If Next R '●結果の並べ替え If Row2 = 5 Then MsgBox "該当データなし!" Else Sheets("集計表").Range("A5:D" & Row2).Sort _ Key1:=Range("B6"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin Sheets("集計表").Select End Sub

  • リストからフォーマットをコピーしてワークシートを追加するマクロについて

    マクロを勉強し始めたばかりで、いろいろ見ながらやっていますが、つまずいてしまいました。 やりたい事、コード、エラーになっているところは以下の通りです。 解決方法をご教示下さい。 【やりたい事】 あるデータリスト(sheet1)から1行ずつ、見積書を作成する (1)見積書format(sheet2)をコピーし、表示されているsheetの後に追加 (2)シート名称を"取引先コード_部番"に変更 (3)sheet1のデータをコピーされたformatに転記 (4)作成対象列に「*」が入っているデータのみ対象とし、ループ処理  ※(4)はコードがわからず、うまく出来ていません。 【コード】 --------------------------------------------------- Sub Macro1() 作成対象 = Sheets(1).Range("A2") 取引先コード = Sheets(1).Range("B2") 部番 = Sheets(1).Range("C2")  金額 = Sheets(1).Range("C2")  no = Sheets.Count i = 0 Do Until 作成対象 = "" i = i + 1 Sheets(2).Copy after:=Sheets(no) no = no + 1 Sheets(no).Name = "見積書(" & 取引先コード & "_" & 部番 & ")" Range("B11").Value = 取引先コード Range("AF13").Value = 部番 Range("BB13").Value = 金額 媒体No. = Sheets(1).Range("M2").Offset(i, 0) Loop End Sub --------------------------------------------------- 【エラー】 1行目のデータは意図どおり処理されますが、2行目以降、以下のコードでエラーになります。 どうも、シート名が同じになってしまう為のようです。 Sheets(no).Name = "見積書(" & 取引先コード & "_" & 部番 & ")"

  • マクロの中に別なマクロを組み込むには

    よろしくお願いします。 excel2003でマクロを作っています。 Sheet2のC1、D1、E1にセルを赤く塗りつぶす、赤と入力、カラーインデックスの番号を入力するというマクロを作りボタンに割り当てたいと思います。 全部で色が17色あるので、マクロを17個作らなければならないと思うのですが、なるべく簡略化したいと思います。 そこで下記の「赤」というマクロの中に「色」というマクロを取り込みたいのですが、うまくできませんでした。 どうかマクロの中にマクロを取り込む方法を教えてください。 もし下記のマクロがもっとスマートに出来るようでしたら、それも教えていただけると嬉しいです。 VBAは初心者ですがよろしくお願いします。 Sub 赤() irobango = 3 ironamae = "赤" End Sub Sub 色() Worksheets("Sheet2").Range("C1").Select With Selection.Interior .ColorIndex = irobango .Pattern = xlSolid End With Worksheets("Sheet2").Range("D1").Value = ironamae Worksheets("Sheet2").Range("E1").Value = irobango End Sub

  • Excel VBAで…。

    データーシート(1)のデータをレイアウトシート(2)に転記するのに 例えば sheets(1).range("A1").value=sheets(2).range("C5").value sheets(1).range("B1").value=sheets(2).range("C6").value sheets(1).range("C1").value=sheets(2).range("C7").value と言うように配置しているのですが もし、シート(1)セルB1の値が空白ならば シート(1)セルC1の値はシート(2)のセルC6に配置・・・ と言うように データがない場合は、転記後の配置は詰めて配置したいのです。 どうすればよろしいでしょうか?

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

専門家に質問してみよう