
Excel2003を使用しています。
ある1つのBookにマクロが25個あります。
マクロを実行する際、目的のマクロが見つけやすいよう、マクロ名にある程度の規則性を持たせているものの、もう少し使い勝手がよくならないかと考え中です。
マクロ名は、下記のようになっています。
(1).あ01_○×、あ02_×○、あ03_○○…
(2).い01_●●、い02_●×…
(3).う01_××、う02_×□、う03_□×、う04_□□…
(4).え01_●□、え02_□●、…
例えば、こんなことが可能かどうかもわからないのですが…。
この25個のマクロは、マクロの内容から大きく分けて、上記(1)~(4)の4種類で、シート上にボタンを4つ配置(仮に、ボタン1、ボタン2、ボタン3、ボタン4)して、ボタン1をクリックしたら、ボタン1に割り振られているマクロ名(例えば、(1)のマクロ名)のみ表示して、その中から目的のマクロを選択すると、そのマクロが実行されるようにすることは、可能でしょうか?
イメージとしては、ボタンを配置するということに限らず、入力規則のリストから選択するような感じで、どうにかできないかなと思っていますが、何か良い方法はないでしょうか?
わかりづらい文章で申し訳ありませんが、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
こんにちは、#1です。
> Bookの中にユーザーフォームも数個あり、そのコードも表示されています
> コンボボックスを4つ作成して、モジュール毎にリスト化
手直ししてみましたので、前回の回答は破棄してください。
1.新しいツールバーを作成して、名前を「MyMacro」にします。
2.Sheet1のモジュールに、以下を記述します。
Sub CrtMacroBox() 'コンボボックスを作成・更新。
Dim C, myCtl, i, POL, j
C = 0
For Each myCtl In CommandBars("MyMacro").Controls
If myCtl.Caption <> "更新" Then myCtl.Delete
Next
For i = 1 To Application.VBE.ActiveVBProject.VBComponents.Count
If Application.VBE.ActiveVBProject.VBComponents(i).Type = 1 Then
C = C + 1
With CommandBars("MyMacro").Controls.Add(Type:=msoControlComboBox)
.Caption = "MacroBox" & C
.DropDownLines = 10
.OnAction = "Sheet1.MacroExec"
.AddItem "Select Macro"
End With
With Application.VBE.ActiveVBProject.VBComponents(i)
POL = ""
For j = 1 To .CodeModule.CountOfLines
If .CodeModule.ProcOfLine(j, 0) <> POL Then
CommandBars("MyMacro").Controls("MacroBox" & C).AddItem .CodeModule.ProcOfLine(j, 0)
POL = .CodeModule.ProcOfLine(j, 0)
End If
Next
End With
CommandBars("MyMacro").Controls("MacroBox" & C).ListIndex = 1
End If
Next
End Sub
Sub MacroExec() 'コンボボックスから選択したマクロを実行。
Dim CName
CName = CommandBars("MyMacro").Controls.Item(Application.Caller(1)).Caption
Select Case CommandBars("MyMacro").Controls(CName).Text
Case Is = "Select Macro"
Case Else
Run CommandBars("MyMacro").Controls(CName).Text
End Select
CommandBars("MyMacro").Controls(CName).ListIndex = 1
End Sub
3.ツールバー(MyMacro)に、ユーザー設定"コマンド"タブの「分類」から
"ユーザー設定ボタン"を登録し、次のとおり設定します。
・名前を「更新」にしてテキストのみ表示にします。
・マクロの登録で "AddMacroBox" を指定します。
[更新]アイコンをクリックすると、コンボボックスを作成・更新します。
misatoanna さん、こんにちは。
再度の回答ありがとうございます。
教えていただいた方法で試してみたところ、希望通りのことができました。
[更新]アイコンで、コンボボックスを作成・更新できるところなどは、当初、考えにはなかったことで、嬉しい限りです!
ツールバーにコンボボックスを作成したことで、見た目にもスッキリしていて、とても満足しています。
ありがとうございました。
No.5
- 回答日時:
各モジュールの先頭に、次のような空白のみのダミーマクロを記述しておきます。
モジュール1
Sub ★GroupA()
End Sub
モジュール2
Sub ★GroupB()
End Sub
以下モジュール3、4も同様に
Sub CrtMacroBox() の中央程の次の1行を削除します。
.AddItem "Select Macro"
Sub MacroExec() の中味を次の5行だけにします。
Dim CName
CName = CommandBars("MyMacro").Controls _
.Item(Application.Caller(1)).Caption
Run CommandBars("MyMacro").Controls(CName).Text
CommandBars("MyMacro").Controls(CName).ListIndex = 1
前回は、すべてのコンボボックスに同じ文字列("Select")が表示されましたが、
上のように変更すると、"★GroupA"、"★GroupB"、のように表示されますので、
識別しやすいかと思います。
またまた、回答をいただき、ありがとうございます。
実は、今回アドバイスいただいたように、識別しやすいよう
>Sub CrtMacroBox() の中央程の
> .AddItem "Select Macro"
を削除して、それぞれのモジュールの先頭のマクロ名が表示されるようにしていました。
幸いマクロ名にグループを識別できるような文字も含んでいましたので…。
>各モジュールの先頭に、次のような空白のみのダミーマクロを記述しておきます。
各モジュールの先頭にダミーのマクロを記述することで、そのマクロ名が表示されれば、さらに識別しやすくなるので、早速、手を加えたいと思います。
おかげさまで、当初考えていたものより、ずっと良いものが完成しました。
何度もご丁寧にありがとうございました♪
No.4
- 回答日時:
#3の最後のほうに書き間違いがありました。
マクロの登録で "AddMacroBox" を指定します。
は、
マクロの登録で "CrtMacroBox" を指定します。
でした。
No.2
- 回答日時:
Application.Runで、セルデータ(マクロ名)を拾って実行できます。
例えば
Application.Run "'D:\ExcelBook\教えてgoo.xls'!" & ActiveCell.Value
といった感じです。
フルパス名前後の記号を忘れると実行できません。
同一ブックの場合はフルパス名を省略できます。
回答ありがとうございます。
今回、Applivation.Run を初めて知りましたので、練習がてら、例に挙げていただいた方法で試してみたところ、うまくいきました。
おかげさまで、またひとつ勉強になりました。
ありがとうございました!
No.1
- 回答日時:
ユーザーフォームの設計が面倒に思えまして、
ツールバーに、アクティブブックの「標準モジュール」内のマクロをリスト化した
コンボボックスを作成するマクロと、コンボボックスで選択したマクロを実行する
マクロの試作です。
ヒントになるでしょうか。
リストにこのマクロ自体が取り込まれないように、Sheet1のシートモジュールに
コピペして、AddMacroBox、ReNewData の順に1度ずつ実行します。
※Sheet1という名前のシートが無い場合は作成し、マクロ実行後に非表示にして
ください。
Sub AddMacroBox() 'ツールバーにコンボボックスを作成します。
With CommandBars("Standard").Controls.Add(Type:=msoControlComboBox)
.Caption = "MacroBox"
.DropDownLines = 30
.OnAction = "Sheet1.MacroExec"
End With
End Sub
'
Sub ReNewData() 'コンボボックスのリストのデータを更新します。
Dim i, j, POL, C
On Error GoTo pfm
For i = 1 To 100
CommandBars("Standard").Controls("MacroBox").RemoveItem 1
Next
pfm: On Error GoTo 0
With CommandBars("Standard").Controls("MacroBox")
.AddItem "Select Macro"
.AddItem "ReNew"
For i = 3 To Application.VBE.ActiveVBProject.VBComponents.Count
With Application.VBE.ActiveVBProject.VBComponents(i)
POL = ""
For j = 1 To .CodeModule.CountOfLines
If .CodeModule.ProcOfLine(j, 0) <> POL Then
C = C + 1
CommandBars("Standard").Controls("MacroBox") _
.AddItem .CodeModule.ProcOfLine(j, 0)
POL = .CodeModule.ProcOfLine(j, 0)
End If
Next
End With
Next
End With
CommandBars("Standard").Controls("MacroBox").ListIndex = 1
End Sub
'
Sub MacroExec() 'コンボボックスのリストから選択したマクロ実行します。
Select Case CommandBars("Standard").Controls("MacroBox").Text
Case Is = "Select Macro"
Case Is = "ReNew"
Application.Run "Sheet1.ReNewData"
Case Else
Application.Run CommandBars("Standard").Controls("MacroBox").Text
End Select
CommandBars("Standard").Controls("MacroBox").ListIndex = 1
End Sub
リスト内の並び順は考慮していません。
順番を指定したい場合は、いったんマクロ名をセルに書き出して並べ替えたものを
コンボボックスに取り入れる方法もありますね。
回答ありがとうございます。
ツールバー上にコンボボックスを作成するなんて、思いもつきませんでしたが、この方法にすれば、随分使い勝手がよくなりそうです♪
それで、いくつか教えていただきたいことがあるのですが、よろしいでしょうか?
>リストにこのマクロ自体が取り込まれないように、Sheet1のシートモジュールにコピペして
回答いただいたように、マクロ実行後、シートを非表示にしましたが、リストにこのマクロが取り込まれているようです。
>アクティブブックの「標準モジュール」内のマクロをリスト化
とありますが、このBookの中には、ユーザーフォームも数個ありまして、そのコードもリストの中に表示されていますが、このコードも「標準モジュール」の中のひとつということになるのでしょうか?
質問文にも書いておりますが、マクロの内容から大きく分けて4種類あり、標準モジュールも4つに分けているのですが、コンボボックスを4つ作成して、モジュール毎にリスト化できれば、さらに見やすくなると思うのですが、可能でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- Visual Basic(VBA) Powerpointでランダムな数字の結果を表示するマクロ 2 2023/08/04 10:04
- Visual Basic(VBA) エクセルVBA 4 2022/05/14 00:51
- Excel(エクセル) マクロを教えてください 3 2023/07/31 21:57
- Excel(エクセル) マクロを教えてください 2 2023/07/30 23:05
- Excel(エクセル) エクセルのマクロ設定 1 2023/04/05 19:37
- Visual Basic(VBA) 【ExcelVBA】動的にボタン、ボタン名を生成できますか? 7 2022/04/08 12:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ローマ字→カタカナへ変換(エク...
-
エクセル グラフの軸の最小値最...
-
マクロ 実行ボタンを押さずに...
-
ワードマクロで画像を選択する方法
-
エクセルのマクロ機能で前のシ...
-
エラーになってないのにVBA...
-
Excel VBA のdebug(F8キー) が...
-
複数ファイルにある特定のシー...
-
EXCEL2000 VBA マクロ実行中に...
-
マクロボタンをある条件の時に...
-
EXCELのセルへ、デジタル時計を...
-
【Excel VBA】エラー番号400
-
エクセルの関数に詳しい方、教...
-
Excelマクロでオプションボタン...
-
Wordの画面を左右にスクロール...
-
マクロ実行後元に戻すことは
-
エクセルでマクロ実行中に任意...
-
モジュール内のマクロを全て実...
-
Excelマクロからのデータアクセ...
-
エクセルVBA テキスト読み込み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローマ字→カタカナへ変換(エク...
-
マクロ 実行ボタンを押さずに...
-
Excelを開いた時に表示さ...
-
Excel VBA のdebug(F8キー) が...
-
エラーになってないのにVBA...
-
EXCELのセルへ、デジタル時計を...
-
複数ファイルにある特定のシー...
-
エクセル グラフの軸の最小値最...
-
モジュール内のマクロを全て実...
-
Wordの画面を左右にスクロール...
-
ワードからエクセルへ貼り付け...
-
エクセルのマクロ機能で前のシ...
-
EXCEL 複数のシートの同一の位...
-
Excelマクロでオプションボタン...
-
エクセルで複数のシートをまと...
-
VBAでEXCELに埋め込んだPDFを開...
-
【Excel VBA】エラー番号400
-
EXCEL2000 VBA マクロ実行中に...
-
エクセルでマクロ実行中に任意...
-
Wordで「原稿用紙○枚」を換算す...
おすすめ情報