質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3083閲覧

ExcelVBAで似たようなプログラムをひとつにまとめたい(クラスモジュールにて?)

morutemu

総合スコア45

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/06/04 04:45

3枚のワークシートがあり、それぞれのシートの2行目に検索(絞り込みたい)したい文字を入力、
フィルターオプションで絞り込み・それをリセットするようなプログラムをセルに直接
フォームボタンで作成したのですが、作成したプログラムを見ると同じような処理をボタンごとに
作っています。
無駄に見えるので、これらを効率よく1つのプログラムに収めたいのですが、
どのようにしたらよいかさっぱりで、どうか教えてください。

ABCDE
検索文字入力検索文字入力検索文字入力検索文字入力検索文字入力

検索ボタン
リセットボタン

VBA

1Sub reset() 2 If ActiveSheet.FilterMode = True Then 3 ActiveSheet.ShowAllData 4 End If 5End Sub 6 7Sub search(searchRange, searchSource) 8 reset 9 ActiveSheet.range(range(searchRange), Cells(Rows.Count, 1).End(xlUp)).AdvancedFilter _ 10 Action:=xlFilterInPlace, _ 11 CriteriaRange:=ActiveSheet.range(searchSource), _ 12 Unique:=False 13End Sub 14 15Sub resetAfter_Click() 16 reset 17End Sub 18 19Sub resetDevice_Click() 20 reset 21End Sub 22 23Sub resetParts_Click() 24 reset 25End Sub 26 27Sub searchParts_Click() 28 Call search("A1:I1", "A1:I2") 29End Sub 30 31Sub searchDevice_Click() 32 Call search("A1:I1", "A1:I2") 33End Sub 34 35Sub searchAfter_Click() 36 Call search("A1:E1", "A1:E2")

たとえば以下を一つにしたいです。

VBA

1Sub resetAfter_Click() 2 reset 3End Sub 4 5Sub resetDevice_Click() 6 reset 7End Sub 8 9Sub resetParts_Click() 10 reset 11End Sub

VBA

1Sub searchParts_Click() 2 Call search("A1:I1", "A1:I2") 3End Sub 4 5Sub searchDevice_Click() 6 Call search("A1:I1", "A1:I2") 7End Sub 8 9Sub searchAfter_Click() 10 Call search("A1:E1", "A1:E2")

若干調べてみたところ、クラスモジュールを作成すれば、まとめられると伺ったのですが、
調べてもよくわかりませんでした。

勉強のため、ひとつご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

それぞれのシート上にフォームコントロールのボタンを配置したということですね。

なら、リセットボタンに関しては、ボタンを右クリックしてマクロの登録で、reset を選択すればいいだけです。

検索ボタンはシートによって対象範囲が異なるので、Select Caseなどで場合分けする必要がありますので、下記のようなマクロを作成して、マクロの登録でsearch_Clickを選択してください。

vba

1Sub search_Click() 2 Select Case ActiveSheet.Name 3 Case "Parts", "Device" 4 Call search("A1:I1", "A1:I2") 5 Case "After" 6 Call search("A1:E1", "A1:E2") 7 End Select 8End Sub

シート名は、"Parts", "Device", "After" と推定しています。

ちなみに、クラスモジュールを使えるのは、ActiveXコントロールのボタンになります。
フォームコントロールのボタンの場合は、簡単に一つのマクロを複数のボタンに登録できます。

おまけ

シートが多いので Select Case が長くなる、シートの追加、削除が発生する、というようなときは、
Application.Caller と AlternativeText を使って下記のようにするととメンテナンスが楽になります。

vba

1Sub search_Click() 2 Dim rngs 3 rngs = Split(ActiveSheet.Shapes(Application.Caller).AlternativeText, ",") 4 5 Call search(rangs(0), rangs(1)) 6End Sub

ボタンの書式設定の「代替テキスト」に
A1:I1, A1:I2
と対象のセル範囲を設定しておきます。
シートを追加したり、シート名を変更してもコードの修正は不要になります。

投稿2018/06/04 05:53

編集2018/06/04 06:36
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morutemu

2018/06/05 06:27

複数指定できるのですね! さすがです! ありがとうございました。 参考になりました。
guest

0

たとえば以下を一つにしたいです。

ボタンクリックで呼び出すマクロ関数を選択できるので、どのボタンも同じ関数を呼ぶように設定しておけばいいんじゃないでしょうか。
クラスを使うまでもない。
resetもserchもActiveSheetを対象に処理しているので、上記の変更だけでいいと思います。

投稿2018/06/04 06:00

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問