• ベストアンサー

不特定多数のコントロールを発生させる方法

VBAなんですが、最悪VBでも構いません。 コーディングにより、Access中のレコードの数だけ、ラベルやコマンドボタンをフォーム上に作成したいのですが、どうすればいいのかわかりません。 レコードの数なので多数になる可能性が高いので、配列にしようと思っているのですが、コマンドボタンも含まれているため、そのクリックイベントも作らなければならないのです。(イベント内容は同じ。違いはインデックス番号の認識のみ) しかもVBAだとコントロールの配列が作れないので困っています。どうすればいいでしょうか? コントロールの追加にcreatecontrol関数を使うとフォーム名にcreateformを使わないといけないらしく、フォームを新しく作らないといけないみたいでイベントまでは埋め込めそうにありません(既存のフォーム名でするとデザインがどうとかこうとかでエラーが出ます)

質問者が選んだベストアンサー

  • ベストアンサー
  • Seafood
  • ベストアンサー率100% (1/1)
回答No.1

興味を持ったのでちょっとやってみました フォームはデザインモードで開いておかないと駄目でした (別の方法もあると思うんですが) レコードの数だけ とありましたので テーブルに作成するコントロールのリストが作ってあるのかな と思い テーブルの先頭から終端までループしてます。 テーブルの"コントロールタイプ"は数値型で設定しました。 acCommandButton のような定数はそのまま使えなかったです。 そのクリックイベントも ~ <イベントの作り方は どうしても分かりませんでした。 DoCmd.OpenForm "フォーム1", acDesign Dim db As database Dim rs As Recordset Dim Ctrl As Control Set db = CurrentDb Set rs = db.OpenRecordset("テーブル1", dbReadOnly) Do Until rs.EOF = True Set Ctrl = CreateControl("フォーム1", rs![コントロールタイプ]) Ctrl.Name = rs![コントロール名] Set Ctrl = Nothing rs.MoveNext Loop DoCmd.Close acForm, "フォーム1", acSaveYes 以下 参考までに acLabel ラベル 100 acRectangle 四角形コントロール 101 acLine 直線コントロール 102 acImage イメージ コントロール 103 acCommandButton コマンド ボタン 104 acOptionButton オプション ボタン 105 acCheckBox チェック ボックス 106 acOptionGroup オプション グループ 107 acBoundObjectFrame 連結オブジェクト フレーム 108 acTextBox テキスト ボックス 109 acListBox リスト ボックス 110 acComboBox コンボ ボックス 111 acSubform サブフォーム 112 acObjectFrame 非連結オブジェクト フレーム 114 acPage Pageオブジェクト 124 acPageBreak 改ページ コントロール 118 acCustomControl ActiveX コントロール 119 acToggleButton トグル ボタン 122 acTabCtl タブ コントロール 123

saimon296
質問者

お礼

>テーブルに作成するコントロールのリストが作ってあるのかなと思い そんなものはないです。コントロールタイプは全てコマンドボタンおんりー結構です。 とりあえずコーディングでフォームを作ってコントロールを配置してイベントを埋め込むところまでは成功しました。 結局set myFrm = CreateFormを使ってフォームの新規作成をしました。これを使わないとフォームのメソッドが使用できないばかりか、モジュールセットもできないのでCreateEventproc関数が使えないため、非常に不便なので、やめました。既存のフォームを使うという方法はもう忘れてください。 あとはコントロールの配列をコーディングでどうやって作るかです。VBAはコントロールの配列が作れないので、何か良い方法はないでしょうか? 例え作れたとしてもクリックイベントでそのコマンドのインデックス番号をどうやって取得するのかが大問題です。 いっそのことコマンドの名前を数字にして後でそのコントロール名とかイベント名を参照してインデックス番号を取得・・・なんてできるのでしょうか?たしか既存の(目に見えて形となっている)(オブジェクト名を持っている)コントロールのメソッドを使用するのはかなり不可能だったような気がします。なのでタグもイベント名も拾えない気がします。 イベントが発生したときに自分がどのオブジェクトから呼ばれているイベントか知る方法ってありますか?あるいは上から何番目のコマンド(縦に同じコマンドがズラッと並んでいるイメージ)から呼ばれているかをイベント内部から知る方法ってありますか? VBなら同じイベント内容のコマンドを全て配列にしてまとめてクリックイベントにしてそのIndexを見ればプロシージャ1つで済みますが、VBAで似たような方法をする方法を教えてください。

その他の回答 (2)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.3

クラスを使っては? なんか問題あるんですか?

saimon296
質問者

お礼

実はクラスを使ったことがないので使い方がよくわかりません。

saimon296
質問者

補足

よければそのクラスを使ったやり方教えてください。

  • Seafood
  • ベストアンサー率100% (1/1)
回答No.2

こんにちはー ぶっちゃけ、難しくて私の手には負えません 擬似コントロール配列という手法があるようです。 URL貼っておきますね。

参考URL:
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
saimon296
質問者

補足

ありがとうございます。少し勉強します。

関連するQ&A

専門家に質問してみよう