#12 フォーム上の特定の種類のコントロールを選択する

"フォーム上の特定のコントロールにフォーカスを移動する"という操作は、Accessのアプリケーションではよくある操作ですが、"フォーム上の特定のコントロールを選択する"という操作は、フォームデザイン時のみ、つまり開発過程でのみ必要とされる操作です。ここでいう"選択"とは、コントロールのプロパティを変更するため、あるいはコントロールの位置やサイズをマウスを使って変更するために、そのコントロールの隅に"サイズ変更ハンドル"が付いた状態にすることです。通常のAccessの操作でも、マウスのドラッグなどによって複数のコントロールを選択状態にすることはできますが、VBAを使ってコントロールを選択状態にする方法が分かれば、より複雑な条件に合う複数のコントロールを選択することができます。例えば、T'sKitの「コントロール選択」ツールでは、"コントロールの種類"をもとにコントロールの選択を行っていますが、コントロールの名前をチェックして、名前の中に"Data"を含むコントロールだけ選択状態にするということもできます。そこでここでは一例として、T'KitのようにVBAを使って「特定の"種類"のコントロールを選択状態にする」という方法について説明したいと思います。
 
ードとしては意外と簡単です。コントロールが選択されているかいないかを取得・設定するプロパティ [InSelection] をTrueまたはFalseに設定するだけです。もちろん、Trueにすれば選択状態、Falseにすれば非選択状態になります。次の例は"フォーム1"上のラベルコントロールを選択状態にする例です。
Dim frm As Form
Dim ctl As Control
Dim intCntrlType As Integer

Set frm = Forms!フォーム1

intCntrlType = acLabel

For Each ctl In frm.Controls
  With ctl
    If .ControlType = intCntrlType Then
      .InSelection = True
    Else
      .InSelection = False
    End If
  End With
Next ctl


それではこのコードについて説明していきましょう。
ず、"Set frm = Forms!フォーム1"の部分ですが、ここでは特定のフォームを対象に処理を行いますので、そのフォームを、あらかじめ[Form]オブジェクトとして宣言されている変数"frm"にセッ トします。これはあくまでも対象フォームを指定すればよいので、変数を使わずに以降のコードすべてで "Forms!フォーム1" のように記述しても構いません。上記のコードを1つのプロシージャにする場合には、フォーム名またはFormオブジェクトを引数とすればより汎用的なプロシージャにすることができます。

続いて、変数"intCntrlType" にAccessが持っている組み込み定数 "acLabel" をセットしていますが、この定数がここでの対象コントロールである「ラベルコントロール」を表しています。コントロールは、その種類を示すプロパティとして [ControlType]プロパティを持っていますが、このプロパティ値を取得することによってそのコントロールがどの種類か調べることができます。それだけでなく、このプロパティ値をVBAを使って変更することによって、そのコントロールを別の種類のコントロールに変えることもできます。Accessのメニューの[書式]-[コントロールの種類の変更]の操作のように、ラベルコントロールをテキストボックスコントロールに変更することができるのです。

以下に一例としていくつかのコントロールの組み込み定数を示します。これ以外のコントロールについてはAccessのヘルプから「ControlType」で検索してみてください。

ラベル acLabel
四角形 acRectangle
コマンド ボタン acCommandButton
オプション ボタン acOptionButton
チェック ボックス acCheckBox
テキスト ボックス acTextBox
リスト ボックス acListBox
コンボ ボックス acComboBox
いて "For Each ctl In frm.Controls" の部分ですが、すでに変数"frm"には"フォーム1"がセットされていますので、このコードは「"フォーム1"の中にあるすべてのコントロール(frm.Controls)から1つずつ順番にコントロールを取り出す」というループ処理を表しています。そして次の With ctl〜End With で囲まれた部分が、その1つずつのコントロールに対して行う処理の部分です。ここでは、すでに説明した[ControlType]プロパティの値が変数intCntrlType(ここではラベルコントロール)と同じかどうか調べ、もし同じであれば[InSelection]プロパティを True にして選択状態にしています。 回は、コントロールの種類に応じて選択状態を切り替えるというコードだけを説明しましたが、フォーム内のすべてのコントロールを列挙する "For Each ctl In frm.Controls"の部分と、コントロールのさまざまなプロパティを組み合わせることによって、すべてのコントロールあるいはある条件にあてはまるコントロールに対して、デザイン上の一括変更などがいろいろできると思います。アドインを作る場合だけでなく、開発時だけに使うようなちょっとしたプロシージャを作る際にも応用できるのではないでしょうか?。
| Index | Prev | Next |