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

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

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

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

1290閲覧

Access VBA 複数ボタンの押下イベント処理、コード簡素化

mnbwqz

総合スコア74

VBA

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2022/01/22 10:12

編集2022/01/24 04:50

下記のようなフォームがあり、各ボタンを押すと、該当する地域のボタンも押せなくなります。
<例>
全国ボタン押→解除以外が押せなくなり、解除は押せるようになる
関西ボタン押→関西・大阪が押せなくなり、それ以外は押せるようになる

フォーム

最初は以下のように書いていたのですが、繰り返しになるので、

AccessVBA

1Private Sub 全国ボタン_Click() 2 If 全国ボタン.Enabled Then 全国ボタン.Enabled = False 3 If 関東ボタン.Enabled Then 関東ボタン.Enabled = False 4 If 東京ボタン.Enabled Then 東京ボタン.Enabled = False 5 If 神奈川ボタン.Enabled Then 神奈川ボタン.Enabled = False 6 If 関西ボタン.Enabled Then 関西ボタン.Enabled = False 7 If 大阪ボタン.Enabled Then 大阪ボタン.Enabled = False 8 9 If Not 解除ボタン.Enabled Then 解除ボタン.Enabled = True 10End Sub

以下のように変更しました。
押下可・不可のリスト(HenkoBottons)と、可・不可への変更情報(onoff)を、関数BottonONOFFで受け取り、処理

AccessVBA

1Private Sub 関西ボタン_Click() 2 Call BottonONOFF("全国,関東,東京,神奈川,解除", True) 3 Call BottonONOFF("関西,大阪", False) 4End Sub 5 6Function BottonONOFF(HenkoBottons As Variant, onoff As Boolean) 7 Dim EachControl As Control 8 Dim HenkoBotton As Variant 9 HenkoBottons = Split(HenkoBottons, ",") 10 For Each EachControl In Me.Controls 11 If TypeName(EachControl) <> "CommandButton" Then GoTo Continue 12 For Each HenkoBotton In HenkoBottons 13 If InStr(EachControl.Name, HenkoBotton) Then If Not EachControl.Enabled = onoff Then EachControl.Enabled = onoff 14 Next 15Continue: 16 Next 17End Function

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

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

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

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

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

guest

回答1

0

ベストアンサー

いろいろ方法はあると思います。
多数のボタンが似たような動作の場合、エクセルだとクラスを使ってイベントを共有するということをしますが、Accessの場合は、イベントプロパティにFunctionを直接設定できますので、ほとんどの場合、クラスを使う必要はないです。

例えば、私なら下記のような設計にします。

各ボタン名は、btn全国, btn関東, btn東京, btn神奈川, ・・・というように共通の接頭語を付けます。
各ボタンのTagプロパティに、OFF(使用不可)にする項目名をカンマ区切りで設定しておきます。
例えば、下記のようになります。
btn全国のTag: 全国,関東,東京,神奈川,関西,大阪
btn関西のTag: 関西,大阪
btn解除のTag: 解除

フォームのモジュールに下記のFunctionを作成します。

VBA

1Function BottonOnOff() 2 Dim ctl As Control 3 Dim OffBtns As String 4 OffBtns = Me.ActiveControl.Tag 5 For Each ctl In Me.Controls 6 If ctl.Name Like "btn*" Then 7 ctl.Enabled = (InStr(OffBtns, ctl.Caption) = 0) 8 End If 9 Next 10End Function

全てのボタンを選択します。(Shiftキーを押しながら選択するか、マウスドラッグで囲めば複数選択できます。)
その状態で、「クリック時」に=BottonOnOff()と設定します。

以上です。
もし、ボタンが追加されたり、項目名に変更があっても、Tagプロパティを設定・編集するだけですみ、コードに手を付ける必要はありません。

投稿2022/01/22 20:29

編集2022/01/23 02:08
hatena19

総合スコア33715

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

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

mnbwqz

2022/01/23 07:45

ありがとうございます。 コード量が減りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問