プロが教える店舗&オフィスのセキュリティ対策術

同ファイルのsheet1~sheet5までのマクロボタンにAマクロを登録してあります。
同じくsheet6~sheet10までBマクロを登録してあります。
sheet11にはsheet1~sheet10までマクロを実行して得られる数字をリンクしています。
sheet11にマクロボタンを作ってsheet1~sheet10までのマクロを実行させたいのですが可能でしょうか。ぜひ方法を教えてください。
※マクロは初心者です。よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    説明不足ですみません。
    基本のデータベースがあります。sheet1~sheet10にフィルタオプションで抽出されるように
    マクロボタンでマクロの記録をしました。Aマクロ・Bマクロともに標準モジュールにあります。
    抽出されたデータの合計値をsheet11に反映させているのですが、
    sheet1~sheet10のマクロボタンをいちいち押さなくてもsheet11だけですべて行えるように
    したいのです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/07/25 15:35
  • sheet11でボタンを作りマクロの記録をしてみました。
    sheet1を選択しActiveにしてマクロボタンを押す。それをsheet10まで行いましたが
    だめでした。
    マクロ初心者ですのでFor~Nextを具体的に記入いただけると助かります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/07/25 15:39
  • 補足します。
    Aマクロ・Bマクロは共通で使用しているので
    sheet1~sheet5には

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
    〔処理〕
    End Sub

    sheet6~sheet10には
    Sub Macro2()
    '
    ' Macro2 Macro
    '

    '
    〔処理〕
    End Sub

    という感じです。
    sheet1~sheet5、sheet6~sheet10 は同じフォーマットで作成しているので
    同じマクロを適用しています。

    Call を使うsheetを指定する方法などありますでしょうか。
    よろしくお願いします。

    No.4の回答に寄せられた補足コメントです。 補足日時:2016/07/26 11:34

A 回答 (6件)

こんばんは


>Aマクロ・Bマクロともに標準モジュールにあります。
ということは
Sub Macro1()
'
' Macro1 Macro
'

'
〔処理〕
End Sub

Sub Macro2()
'
' Macro2 Macro
'

'
〔処理〕
End Sub

…と10シート分、あると言うことでしょうか?

一番ベタな方法として、Sheet11のボタンから以下のように各マクロをよびだすことができます。各シートのボタンを押さなくてもマクロから他のマクロを実行することが出来ます。

Sub all()
Call Macro1
Call Macro2

End Sub

余談ですが、"Call"は省略しても構いません。サンプルなので、マクロから他のマクロを呼び出しているというのをハッキリさせるためにあえて入れました。
この回答への補足あり
    • good
    • 1

こんばんは



テストとして、以下の手順を試してみてください
・エクセルを開く(ワークシートは3つで)
・名前を付けて保存
・Sheet1のA1に「abc」を入力
・Sheet2のA1に「def」を入力
・標準マクロを作成
・以下のマクロを標準モジュールに作成して実行
を試してみてください。
同じbook内ならば、他のワークシートの値を利用するのは簡単です。


Sub サンプル()
Worksheets(3).Range("A1") = Worksheets(1).Range("A1")
Worksheets(3).Range("A2") = Worksheets(2).Range("A1")
End Sub
    • good
    • 0
この回答へのお礼

何度も回答いただいてありがとうございます。
テストやってみました。こんな方法もあるんですね。勉強になりました。
教えていただいたCall Macro や皆さんの回答からマクロ作成してみます。
ありがとうございました。

お礼日時:2016/07/27 11:34

昨日、しばらく読んで考えていましたが、あまり良い方向に行きませんね。



「Aマクロ」1-5、「Bマクロ」6-10ともに統一されたマクロとします。

これについては、キーワードがひとつ抜けているとすれば、フォーム・コントールのボタンという前提がなければ、話が頓挫してしまいます。これが、ActiveX のボタンだと変わってきます。

しかし、大変失礼ですが、統合したマクロはお書きになれないでしょうか。できていないから、ボタンを1つずつクリックして、コピーということをおっしゃっているのかもしれません。

もし、そういう要求だとしたら、後でコードはお書きしますが、マクロを専門に回答している者とっては、それは、あまりに嬉しなくないコードです。知っている人なら誰でもできるからです。

#3さんの所でもご指摘になっていますが、質問と答えが咬み合っていないのは、肝心な部分が書かれていないからです。以下のような、初級の内容ですが、この程度は質問の際に見せてほしいと思います。

実際は、データを直接、Sheet11に持っていく方法がありますが、内容としては、イレギュラーです。

ご質問者さんは、初心者といっても、一応まともな目的を持ったコードなら、分かる人はその内容を直そうとしてくれます。その内容を評価だけしたり、バカにしたりする人間は、本当は、マクロなど出来ない人だと思います。小出しに情報を出して、それを受けて答えるという方式では、一向に先に進みません。全部、さらけ出してしまいましょう。(^^;このレベルに仕事での守秘義務などはないでしょうから。

VBAの範疇では、私もみなさんも、ほとんど、みんな初心者と変わりません。10年やっていても、アルゴリズムのトレーニングもしていないし、ポインターがどうとか知っているわけではなく、単に、経験値の違いだけです。だた、回答者の中には、その経験値自体を否定するという輩もいますが、それでは破綻が見えてしまいます。

そういう中で、私が哀しいのは、基礎的な回答をしたのにも関わらず、全然、間違った回答が選ばれることですね。

'//
Sub TestMacro()
 Dim i As Long
 For i = 1 To 10
  With Worksheets("Sheet" & i)
   .Range("AA1").CurrentRegion.ClearContents
   .Range("A1").CurrentRegion.AdvancedFilter _
   Action:=xlFilterCopy, _
   CriteriaRange:=.Range("H1:H2"), _
   CopyToRange:=.Range("AA1"), _
   Unique:=False
   Application.ScreenUpdating = False
   With .Range("AA1").CurrentRegion
    .Offset(1).Copy
    Worksheets("Sheet11").Cells(Rows.Count, 1).End(xlUp).PasteSpecial
    .ClearContents
   End With
   .Select
   .Range("A1").Select
   Application.ScreenUpdating = True
  End With
 Next i
 Application.Goto Worksheets("Sheet11").Range("A1")
End Sub
'//

'*-----

Sub ButtonsExecute()
Dim i As Long
Dim myMacro
'フォームコントロール・ボタンが、シートに一個の場合
ThisWorkbook.Activate
For i = 1 To 5
 Application.Run Worksheets("Sheet" & i).Buttons(1).OnAction '**
Next i
End Sub

'** ActiveX コントロールのボタンの場合は、Application.Runは不要です。
Worksheets("Sheet" & i).OLEObjects(1).Object.Value = True

解説:
Application.Run Worksheets("Sheet" & i).Buttons(1).OnAction '

これは、ボタンの呼び出しに登録しているマクロを呼び出すことで、もちろん、標準モジュールのマクロを、Call で直接呼び出して間違いなけば、それでも問題はありません。でも、ボタンに登録したマクロと標準モジュールにあるそのマクロとの整合性はありません。それは、限りなく間違いはないでしょうけれども、それなら、シートごとのボタンを実行するのではなく、最初からマクロの一本化を考えたほうがよいと思います。

余計なことを書いて、不愉快になりましたら、申し訳ありません。
    • good
    • 3
この回答へのお礼

いただいた回答を見て気づきましたが、初心者でなく超初心者でした。
作成していただいたマクロをゆっくりと理解していきたいと思います。
ありがとうございました。

お礼日時:2016/07/27 11:25

前出のrukukuです。


最後の、「Sheet2」は誤記です。

本題です。
「Aマクロ」「Bマクロ」の置き場所はどこでしょうか?
各シートに置いてあると、先ほどの回答のようなことになります。

「標準モジュールに」に置いてあるのならば、どのシートのボタンからでも簡単に呼び出すことができます。

また、補足要求です。
ご質問の状況があいまい過ぎて、回答の方も一般論になってしまいます。
固有名詞や数値などは適当なダミーに置き換えても構いませんので、実際の使用方法をもう少し詳しく教えてください。
この回答への補足あり
    • good
    • 0

こんばんは


Application.Run
という命令を使えば可能です。


例えば、
Sheet1に
Sub Test()
MsgBox "test"
End Sub

Sheet2に
Sub RunTest()
Application.Run "Sheet1.Test"
End Sub

というマクロをつくった場合、Sheet2のRunTestを実行すれば、Sheet1のTestが実行されます。
Sheet2
    • good
    • 1

sheet1をActiveにしてAマクロを作動→sheet2をActiveにしてAマクロを作動…sheet6をActiveにしてBマクロを作動→sheet7をActiveにしてBマクロを作動


をFor~Next文を使っておこなえばよろしいかと。
この回答への補足あり
    • good
    • 1
この回答へのお礼

For~Next文を勉強します。
ありがとうございました。

お礼日時:2016/07/27 11:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A