• ベストアンサー

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

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

  • VBAでイベント発生時に自分の呼ばれたコマンドを知る方法

    イベントが発生したときに自分がどのオブジェクトから呼ばれているイベントか知る方法ってありますか?あるいは上から何番目のコマンド(縦に同じコマンドがズラッと並んでいるイメージ)から呼ばれているかをイベント内部から知る方法ってありますか? 今コーディングで新規フォームを作ってそこにレコード数だけコントロールを配置するというコーディングを考えております。 そのコマンドにクリックイベントも発生させたいので、コントロールを作成してイベントを埋め込むという作業まではできたのですが、不特定多数のコマンドボタンの作成設置方法に悩んでおります。 VBAではコントロールの配列はできないので、コントロールの名前などを全て変えて作らなければなりません。そこをどうするかで頭を悩ませています。 しかも後でどのコントロールがクリックされて呼ばれたのかも知りたいので、コントロール配列のindex番号みたいなものを取得しておく必要もありますが、何か良い方法はないでしょうか? いっそのことコマンドの名前を数字にして、後でそのコントロール名とかオブジェクトのメソッドを参照してインデックス番号を取得・・・みたいなことを考えてたのですが、たしか既存の(目に見えて形となっている)(オブジェクト名自体を持っている)コントロールのメソッドを使用するのはかなり不可能だったような気がするので、タグやオブジェクト名も拾えない気がします。 VBなら同じイベント内容のコマンドを全て配列にしてまとめてクリックイベントにしてそのIndexを見ればプロシージャ1つで済みますが、VBAで似たような方法をする方法を教えてください。 ループで回しながらオブジェクト名の違うコントロールを配置する方法は自分でなんとかやってみますのでindex番号の取得の方法だけお願いします。

  • ExcelVBA UserFormに沢山のボタンを貼り付けたい

    Excel2003のVBAを使っています。 コマンドボタンが沢山付いたユーザーフォームを起動したいのですが、 フォームに貼り付けるコマンドボタンの個数は、マクロを実行した時に決めたいです。 (例えば任意のセルの値を読み込むなどして) 要するにコードの中で、コマンドボタンの生成をしたいのですが、 可能でしょうか。 VBでプログラム組んでる知人に聞いたところ、「コントロール配列」なるものを利用すれば可能だそうですけど、 VBAにはそれが無いと聞きました。

  • なぜエラーになるのでしょう?アクティブコントロール

    ちょっと変なやり方かもしれないのですが、都合上こうやりたいので教えてください。 フォーム1の中にフォーム2を入れてサブフォームとして フォーム2の中にコマンドボタンを一つ置きました。 そのコマンドボタンを押した時に、そのコマンドボタン名を取得したいのですがうまくできません。 フォームは20個ぐらいあってこれと同じ動きをしたいので、 フォームモジュールには Private Sub コマンド0_Click() Call アクティブコントロール名を取得する End Sub として、 標準モジュールにコードは書いています。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name MsgBox "アクティブコントロール名" & Forms(フォーム).ActiveControl.Caption End Sub にすると、オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)になります。 そもそも、フォーム = Screen.ActiveForm.Nameの時点で、フォーム1になっています。 実際のコマンドボタンはフォーム2にあるのに。 なので、無理矢理 MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption にしたら、 実行時エラー2450 マクロの式またはVisualBasicコードで参照されている'フォーム2'が見つかりません。 という違うエラーになりました。 Sub アクティブコントロール名を取得する() Dim フォーム As String フォーム = Screen.ActiveForm.Name Forms("フォーム2").SetFocus MsgBox "アクティブコントロール名" & Forms("フォーム2").ActiveControl.Caption End Sub にすればいいのかな?と思ったら Forms("フォーム2").SetFocusでアウトでした。 もともとはサブフォームのコントロールから発信したイベントなのに、 サブフォームのコントロールの値が取れないのでしょうか? 実際のmdbファイルではコマンドボタンではなくテキストです。 ご回答よろしくお願いします。

  • アクティブエックスコントロールが挿入できない

    アクティブエックスコントロールが挿入できない シートにコマンドボタンを設置しようと思ったら 「オブジェクトを挿入できません」という、画像のようなエラーになります。 既存のコマンドボタンをクリックしても、へこまないし、リンクしているVBAコードも実行されません。 デザインモードにして既存のコマンドボタンをクリックしても、VBEコードに移動しません。 ファイルが壊れているのでしょうか?

  • ラベルに「コントロールソース」を設定することは不可能でしょうか?

    単票形式のフォームのレコードソースに紐付くコントロールソースを ラベルに設定したいのですができません。 ハイパーリンクをテキストボックスではなく ラベル上に表示したいです。 テキストボックスのプロパティには「コントロールソース」があるのですが ラベルに「コントロールソース」はありません。 設定することは不可能でしょうか? VBAでも可能なら教えてください。 よろしくお願いします。

  • エクセルVBA コントロールのプロパティの変更

    エクセル2003でシート上に割り付けたラベルコントロールをVBAでCaptionプロパティで 変更するプログラムを作ってみました。(同じ様にボタンコントロールのCaptionプロパティに ついても作りました。) ステップ実行(F8)では、思ったとおり変更されますが、普通の実行(F5)では思ったとおり 変更されず、遅れて最後のコマンド分しか変更されませんでした。 *条件ループでセルのテキストを順番に読みコントロールのCaptionとして変更するプログラム  です。  なぜ出来ないのか分かりません。  原因又は、方法を教えていただけないでしょうか?    VBAでは、オブジェクト名に配列を使えないらしかったのでOLEObjects(コントロール?、  コレクション?)でオブジェクト名の配列のように使っています。  あまり、詳しくないので用語が間違っていたらすいません。  後、途中にインターバルタイマー入れたりして、動作確認しましたがやはりダメでした。

  • VB6からの移行したいけど、VB.NETのコントロール配列は?

    VB6ではフォーム上にボタンコントロールとかを配列で作成できクリックされた時にはボタンイベントのインデックス値によってどのボタンを押されたが判断できて各処理を記述できていましたが、VB.NETでは同じようにはできないようです。オブジェクト指向的?にはこちらがいいのでしょうが、どうも面倒くさくなったなぁというイメージしかわかず、なぜこの方がいいのかという納得いく書籍とかも見つけることができていません。 どなたか、ご教授頂きたいのですがよろしくお願いします。参考になる書籍やWEBとかもありましたらお教えいただければ幸いです。

  • フォームとコントロールツールボックスの違い

    コマンドボタンでVBAのプログラムを実行させたいんですがフォームとコントロールツールボックスにあるコマンドボタンの違いがよくわかりません???? どうやって使い分ければいいんでしょーか???

  • Access2007 コントロールの削除

    イベント内プログラムで以下のようにフォームのコントロールの削除を行っていますが、 コントロール名が条件に合っていても削除されません。 DeleteControlが失敗しているのではなく、 If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。 しかも、同じように 頭に"lblBox"とつくラベルコントロールでも、ひっかかるものとそうでないものがあります。 以下のコーディングでは不十分でしょうか? Dim ctlSche As Control DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden Set ctlSche = CreateControl(FName, acLabel) For Each ctlSche In Forms!TestForm.Controls If Left(ctlSche.Name, 6) = "lblBox" Then 'コントロールの削除 DeleteControl FName, ctlSche.Name End If Next DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden

  • vbaで、フォームコントロールを挿入する方法

    vbaで、フォームコントロールを挿入する方法 エクセル2007を使っています。 最近、vbaを始めたのですがわからない事があります。 開発→挿入→挿入→フォームコントロールで、 オプションボタンやチェックボックスを、 vbaで挿入したいのですが可能でしょうか? 例えば、フォームコントロールのボタンを押しただけで オプションボタンを6つ挿入するなどです。 ActiveXコントロールでは、可能とどこかのサイトで見たのですが、 どうしてもフォームコントロールの方を使いたいの…。 よろしくお願いします。

専門家に質問してみよう