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

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

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

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

Access

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

Q&A

解決済

2回答

30911閲覧

Access VBA クリックイベントをまとめたい

urakawa

総合スコア12

VBA

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

Access

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

0グッド

0クリップ

投稿2016/02/02 12:16

お世話になります。

以下のサイトを参照して
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays05.htm

フォームのボタンのクリックイベントをまとめるプログラムを作ったのですが、クリックしても何も起こりません。
何が悪いのか見当がつかず、悩んでいます。

(状態)

form1に
ボタン名「b0~b9」を配置
(イベントプロシージャは空白)


<Class1>

Option Compare Database
Option Explicit

'イベントを持つコマンドボタン型の変数を宣言
Private WithEvents btn As MSForms.CommandButton
'ボタンの数字を格納する変数を宣言
Private Index As Integer

Public Property Let MyItem(ByVal c As MSForms.CommandButton)
'引数のコマンドボタンを変数に格納
Set btn = c
End Property

Public Property Let MyIndex(ByVal i As Integer)
'コマンドボタンの数字を変数に格納
Index = i
End Property

Private Sub Btn_Click()
MsgBox Index
End Sub


<Form1>

Option Compare Database
Option Explicit

Private NumBtn(0 To 9) As Class1

Private Sub Form_inisialyze()
Dim i As Integer

For i = 0 To 9 Set NumBtn(i) = New Class1 NumBtn(i).MyItem Controls("b" & i) NumBtn(i).MyIndex i Next i

End Sub

Private Sub UserFom_Terminate()
Set NumBtn = Nothing
End Sub


求める結果
ボタン「b0」クリック → メッセージボックス「0」を表示
ボタン「b1」クリック → メッセージボックス「1」を表示
(以下略)

現状
何もおこりません。(エラー表示もなし)

心優しい方がいらっしゃいましたら教えて下さい。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

参考にされているサイトはVB6についての記述のようですね。
AccessのフォームはMSForms.Formではなく、Access.Formとなり、VB6やExcelのフォームとは別物です。
そして、色々と試してみましたが、イベントをフックすることはできませんでした。

さて、私の結論は「できない」なのですが、一応、色々と間違ってそうなところをお伝えします。

まず、AccessのコマンドボタンはMSForms.CommandButtonとは別なので、Access.CommandButtonと書く必要があります。

次に、Form_inisialyzはスペルミスかと思いますが、もともとアクセスフォームにInitializeイベントやTerminateイベントはありません。書くならLoadイベント、Unloadイベントです。

次に、Terminateイベントに書いているSet NumBtn = Nothingですが、NumBtnは配列かと思いますので、個別にNothingするか「Erase NumBtn」とする必要があります。

最後に、NumBtn(i).MyItem Controls("b" & i) はプロパティへの値セットなので、イコールで代入する必要があります。さらにオブジェクト型プロパティなので、Setが必要です。

Set NumBtn(i).MyItem = Controls("b" & i)

しかし、全部直しても、やはり動作しませんでした。

【代替案】
次のマクロを用意して、

VBA

1Private Sub ButtonClick(ByRef Num As Integer) 2 MsgBox "ボタン" & Num & "が押されました。" 3End Sub

個別のボタンクリックマクロから呼び出します。

VBA

1Private Sub b0_Click() 2 Call ButtonClick(0) 3End Sub

個別のマクロをいちいち手で書くのが面倒なら、標準モジュールに次のコードを用意し、マクロにコードを書かせます。

VBA

1Sub PrintButtonEvents() 2 For i = 0 To 9 3 Debug.Print "Private Sub b" & i & "_Click()" 4 Debug.Print Space(4) & "Call ButtonClick(" & i & ")" 5 Debug.Print "End Sub" 6 Next 7End Sub

実行するとイミディエイトウインドウにマクロが出力されるので、それを張り付けてください。

投稿2016/02/02 15:59

編集2016/02/02 16:04
thom.jp

総合スコア686

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

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

urakawa

2016/02/03 01:45

ご回答いただきましてありがとうございました。 AccessVBAでは、クリックイベントを1つずつ書いていくしかないのですね。 1週間くらい悩んでいたので、残念ですが、 できないということが分かってよかったです。 とても助かりました。ありがとうございました!
guest

0

解決済みですが、通りかかったので。

参照先のコードはVBAですが、Excel用のものですね。
Accessでも実現可能ですが、Excelとは少し異なります。。

クラスモジュール
<Class1>

vb

1Option Compare Database 2Option Explicit 3 4'イベントを持つコマンドボタン型の変数を宣言 5Private WithEvents btn As Access.CommandButton 6'ボタンの数字を格納する変数を宣言 7Private Index As Integer 8 9Public Property Let MyItem(ByVal c As Access.CommandButton) 10 '引数のコマンドボタンを変数に格納 11 Set btn = c 12 'クリックイベントにイベントプロシージャを関連付け 13 c.OnClick = "[EVENT PROCEDURE]" 14End Property 15 16Public Property Let MyIndex(ByVal i As Integer) 17 'コマンドボタンの数字を変数に格納 18 Index = i 19End Property 20 21Private Sub Btn_Click() 22 MsgBox Index 23End Sub

Excelと違って、クリックイベントにイベントプロシージャを関連付けするコードが必用になります。

フォームモジュール
<Form1>

vb

1Option Compare Database 2Option Explicit 3 4Private NumBtn(0 To 9) As Class1 5 6Private Sub Form_Load() 7 Dim i As Integer 8 9 For i = 0 To 9 10 Set NumBtn(i) = New Class1 11 NumBtn(i).MyItem = Me("b" & i) 12 NumBtn(i).MyIndex = i 13 Next i 14End Sub 15 16Private Sub Form_Close() 17 Erase NumBtn 18End Sub

フォームの読み込み時(Load)イベントと閉じる時(Close)イベントを使います。

【別案】

今回の要件ならクラスモジュールを使わなくても、フォームモジュールのみで実現できます。

Accessでは、関数(Function)を下記のようにイベントプロパティに設定できます。

クリック時 =関数名()

これを利用します。

フォームモジュール
<Form1>

vb

1Option Compare Database 2Option Explicit 3 4Private Function Btn_Click(i As Integer) 5 MsgBox i 6End Function 7 8Private Sub Form_Load() 9 Dim i As Integer 10 11 For i = 0 To 9 12 Me("b" & i).OnClick = "=Btn_Click(" & i & ")" 13 Next i 14End Sub

Accessでのクラスモジュールの利用例は下記で紹介していますのでご参考に。

ClassModule - hatena chips

また、後者のイベントプロパティに関数を設定する方法の利用例が下記にありますのでそれもご参考に。

ボタンクリックでテキストボックスに文字入力 その1 - hatena chips

投稿2017/02/15 19:46

編集2017/02/15 19:49
hatena19

総合スコア33620

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

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

urakawa

2017/02/17 06:14

ご回答ありがとうございます! 今までは諦めて すべてのコマンドボタンのクリックイベント→Functionに飛ばして処理 していましたが、別案を試してみたら、理想通りの動きになりました。 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問