VBA第6章:UserFormの操作【マクロのみ】

1.UserFormを表示する

object.Show

UserFormは、ユーザーが独自にデザインしてマクロから利用できるダイアログボックスです。VBEでデザインしたUserFormを画面に表示するには、Showメソッドを実行します。

 

2.UserFormをモードレスで表示する

ShowメソッドでUserFormを表示すると、そのUserFormを閉じるまで、Excelを操作することはできません。そうした状態をモーダルと呼びます。そうではなく、UserFormを表示したままでExcelを操作できるようするには、Showメソッドに定数vbModelessを指定します。UserFormを表示したままでExcelを操作できる状態をモードレスを呼びます。

 

3.コマンドボタンにマクロを登録する

UserFormに配置したコマンドボタンにマクロを登録するには、VBEのデザイン画面で、配置したコマンドボタンをダブルクリックします。実行すると自動的にPrivate Sub CommandButton1_Click()というプロシージャが作成されます。コマンドボタンをクリックすると、このPrivate Sub CommandButton1_Click()が実行されるので、ここに必要なマクロを記述します。

 

4.UserFormを閉じる

表示しているUserFormを閉じるには、Unloadステートメントを実行します。Unloadステートメントには、閉じるUserFormを引数にしていますが、一般的には表示しているUserFormから自分自身を閉じるケースが多くなります。そんなときはUnload UserForm1のように名前を指定してもいいのですが、UserFormモジュールの中でMeというキーワードは自分自身を表します。したがって、一般的にはUnload Meと記述する場合が多くなります。

 

5.UserFormを隠す

UserFormのShowメソッドは、デザインしたUserFormを画面に表示します。またUnloadステートメントは、引数で指定したUserFormをメモリ内から除去し、当然ながら画面からも消し去ります。そうではなく、一時的にUserFormを画面から見えなくするときは、Hideメソッドを使います。

 

6.UserFormのタイトルバーを設定する

UserFormのタイトルバー(上部)には、標準ではUserForm1等の名前が表示されています。このタイトルバーに表示する文字列は、プロパティウィンドウで指定することもできますが、コードで動的に設定することも可能です。タイトルバーの文字列は、UserFormのCaptionプロパティで操作できます。

 

7.ラベルに文字列を表示する1

ラベルに表示する文字列は、Captionプロパティで操作できます。プロパティウィンドウで設定することもできますが、マクロのコードで動的に設定することも可能です。

 

8.ラベル に文字列を表示する2

ラベルは名前:やファイル名:のように、近くに配置したコントロールの意味を表すために使うだけではなく、現在の状況をユーザーに知らせるときに便利です。例えば、サンプルは1000回の処理を実行するたび、ラベルに●回目と表示しています。しかし、このような処理では、For Nextステートメントの処理が終わるまで画面の更新がされず、いきなり1000回目と表示されてしまうことがあります。そんな時は、DoEvents関数を実行して、CPUの制御を戻します。

 

9.テキストボックスに文字列を代入する

テキストボックスに表示される文字列は、Textプロパティで操作します。任意の文字列を代入したり、代入されている文字列を取得することができます。

 

10.テキストボックスが変更されたら処理する

テキストボックス内の文字列が変更されると、Changeイベントが発生します。この時に実行されるプロシージャがPrivate Sub TextBox1_chage()です。TextBox1部分は、配置しているテキストボックスの名前です。このプロシージャは、テキストボックスをダブルクリックすると自動的に表示されます。

 

11.テキストボックスに大文字しか入力させない

テキストボックス内の文字列が変更されると、Chageイベントが発生します。これを利用すると、例えば、大文字しか入力できないテキストボックスを作ることができます。サンプルは、テキストボックスが変更されるたびに、テキストボックス内の文字列を大文字に変換して、代入しなおしています。結果的に、テキストボックスに入力したアルファベットは、全て大文字になります。

 

 

12.テキストボックスに入力できる文字数を制限する

テキストボックスに入力できる文字数を制限するには、2つの方法があります。1つは、テキストボックスのChangeイベントを使って、文字数を超えた文字列が入力された時は、左側から抜き出した文字列を代入し直す方法です。

 

 

13.テキストボックスに入力できる文字数を制限する2

テキストボックスに入力できる文字数を制限するには、テキストボックスのMaxLengthプロパティに文字数を設定する方法もあります。MaxLengthプロパティはその名の通り、入力できる最大文字数を表します。サンプルのようにマクロで動的に設定してもいいですし、プロパティウィンドウで設定することもできます。

 

 

14.テキストボックス内の文字列を選択状態にする

例えば、テキストボックスにパスワードを入力するとします。ユーザーが入力したパスワードが間違っていた場合、再度入力をしやすくするために、テキストボックス内の文字列が選択状態になると便利です。そうした処理を行うには、テキストボックスのSelStartプロパティとSelLengthプロパティを使います。SelStartプロパティは、選択する文字列の先頭位置を決め、SelLengthプロパティは何文字選択するかを決めます。ただし、この2つのプロパティは、テキストボックスにフォーカスがないと効果がありません。そこで、SelForcusメソッドを使ってテキストボックスにフォーカスを移動しておきます。

 

15.テキストボックス内を検索する

VBAには、テキストボックス内を検索する命令がありません。そこで、テキストボックス内の文字列を検索するには、InStr関数などを使って、自分で探すしかありません。サンプルはテキストボックス内で、「tanaka」という文字列を探し、もし見つかった場合は、その文字列を選択状態にします。

 

16.リストボックスにデータを登録する1

リストボックスにデータを登録するには、いくつかの方法があります

1つはリストボックスのRowSourceプロパティを使ってリストボックスとワークシートのセルを連動させる方法です。RowSourceプロパティには、Sheet1!A1:A5のようにアドレスを文字列で指定します。Sheets(“Sheet1”).Range(“A1:A5”)ではないので注意してください。RowSourceプロパティでデータと登録したりリストボックスではAddItemメソッドで新しいデータを追加したり、リストボックスからデータを削除することはできません。

 

 

17.リストボックスにデータを登録する2

リストボックスにデータを登録する一般的な方法は、リストボックスのAddItemメソッドを使うことです。AddItemメソッドはAddItem データ, 位置」のように登録する位置を指定することも可能です。For Nextステートメントで繰り返しAddItemメソッドを実行すると、さぞかし時間がかかると誤解しているユーザーもいますが、現在のPCはかなり高速です。For Nextステートメントでセルの値を登録する場合、少なくとも数百~数千件程度なら一瞬でおわります。AddItemメソッドでデータを個別に登録したリストボックスはあとからデータを追加したり削除することもできます。

 

18.リストボックスにデータを登録する3

最も高速にデータを登録するには、リストボックスのListプロパティにセルデータの配列を直接代入します。リストボックスに登録されているデータはListプロパティに配列形式で格納されているので、ここに任意の配列を代入すればリストボックスに反映されます。サンプルでは5つのセルデータしか代入していませんが、数万件や、数十万件のデータも一瞬で格納されます。セルデータを配列として代入するには、Rangeオブジェクトの後ろにValueプロパティを付けるのを忘れないでください。

 

19.リストボックスのデータを削除する

リストボックスのデータを削除するには、RemoveItemメソッドを使います。RemoeItemメソッドは、引数に削除したい位置を指定しますが、このとき、先頭(一番上)が0であることに留意してください。

 

20.リストボックスの選択位置を指定する

リストボックスで何番目のデータが選択されているかは、ListIndexプロパティで操作できます。ListIndexプロパティに任意の数値を指定すれば、リストボックスで選択されているデータの位置も変化します。このとき、先頭(一番上)が0になる点に留意してください。

 

 

21.リストボックスで選択されているデータを取得する1

リストボックスで選択されているデータは、Textプロパティで取得できます。Textプロパティは読み取り専用です。リストボックスでは、もう1つValueプロパティでも選択されているデータを取得できますが、両者は何も選択されていない時に違いがあります。リストボックスで何もデータが選択されていないとき、Textプロパティは空欄””を返しますが、何もデータが選択されていない状態でValueプロパティを操作(取得)するとエラーになります。

 

22.リストボックスで選択されているデータを取得する2

リストボックスに登録されているデータは、Listプロパティに配列形式で格納されています。また、リストボックス上で選択されているデータの位置は、ListIndexプロパティで分かります。という事は、Listプロパティの配列内で、ListIndexプロパティの位置が選択されているデータだという事です。リストボックスで選択されている位置が必要になるケースは意外と多くなります。是非、ListIndexプロパティを覚えてください。

 

23.複数選択可能なリストボックスで選択されているデータを取得する

通常のリストボックスは1つのデータしか選択できない単一形式です。複数のデータを選択できるようにするには、リストボックスのMultiSelectプロパティに定数fmMultiSelectMultiか、定数fmMultiSelectExtendedを指定します。選択されているデータはSelectedプロパティを調べます。

 

24.リストボックス内のデータを移動する

リストボックス内でデータを移動するための命令はありません。データを移動する場合は、移動するデータを変数に格納してから削除し、移動したい位置にAddItemメソッドで追加します。

 

25.リストボックスに登録されているデータの個数を取得する

リストボックスに登録されているデータの件数は、ListCountプロパティで分かります。リストボックス内のデータはListプロパティに配列形式で格納されていますが、先頭が0である点に留意してください。最終データを取得するには、ListCount – 1を調べます。

 

 

26.複数列のリストボックスを設定する

複数列を表示できるリストボックスは、まずColumnCountプロパティで列数を指定します。表示する列の幅は、ColumnWidthsプロパティで指定できます。複数列のデータを取得する時は、Listプロパティを二次元配列として操作します。

 

 

27.リストボックスが選択されたとき処理を行う

リストボックスが選択されたとき何らかの処理を行うには、リストボックスのClickイベントにマクロを記述します。リストボックスのClickイベントは、リストボックスの標準イベントなので、デザインしているリストボックスをダブルクリックすると、プロシージャが自動的に作成されます。

 

28.2つのリストボックスを連動させる

VBAには異なるリストボックス同士を連動させるような便利な自動機能はありません。しかし、難しく考えることはありません。左のリストボックスで選択されていたデータに応じて、右のリストボックスに表示するデータを毎回書き替えればいいのです。リストボックスのデータを全て消すにはClearメソッドを使います。

 

29.リストボックスで常に最下行を表示する

リストボックスにデータを追加すると、通常はリストボックスの上部が表示されています。リストボックスの幅を超えるデータ数を登録した場合、最下行を表示するにはスクロールバーを移動させなければなりません。そうではなく、新しいデータを最下行に追加したとき、常に最下行を表示させるには、ListIndexプロパティを操作します。サンプルのDoEvventsは画面の更新を行う命令です。

 

30.リストボックスに重複データを登録しない

リストボックスにデータを登録するとき、すでに登録済みのデータは登録せず、新しいデータだけを登録したいときがあります。これもまた、VBAにそんな便利な自動機能やプロパティはないので、そのようなプログラミングをします。サンプルでは、登録しようとしているデータが、すでに登録済みかどうかを毎回判定し、もし初登場だったら登録しています。

 

 

31.コンボボックスにデータを登録する

コンボボックスは、リストボックスとテキストボックスが合体したようなControlです。コンボボックスのリスト部分にデータを登録するときは、リストボックスと同じようにAddImtemメソッドで登録します。

 

32.コンボボックスにテキストを代入する

コンボボックスでは、ユーザーがリスト部分で選択したデータが、上部のテキスト部分に表示されます。標準的なコンボボックスでは、リストから選択するだけでなく、テキスト部分に直接文字列を代入することも可能です。テキスト部分の文字列は、Textプロパティで操作します。

 

33.コンボボックスで入力された文字列をリストに登録する

コンボボックスのテキスト部分はTextプロパティで取得できます。リスト部分はリストボックスと同じように操作できるので、テキスト部分に入力された文字列をリスト部分に登録するには、ComboBox1.AddItem ComboBox1.Textというコードで実現できます。サンプルは、同じ文字列は登録しないように判定しています。

 

34.チェックボックスの状態を判定する

チェックボックスはユーザーがオンとオフを切り替えられるコントロールです。UserForm上に複数配置でき、それぞれ独立して、オンとオフを切り替えられます。チェックボックスの状態は、Valueプロパティで取得できます。チェックボックスがオンになっていると、ValueプロパティがTrueになります。

 

35.チェックボックスで淡色表示を判定する

標準のチェックボックスは、オンとオフの2種類の状態を切り替えます。チェックボックスのTripleStateプロパティをTrueに設定すると、オンとオフの他に中間の淡色表示状態にすることができます。このように3種類の状態を判定する時はサンプルのようにします。オンとオフの状態は、通常のようにValueプロパティを判定します。中間の単色表示の状態は、チェックボックスがNullになっています。これを判定するには、IsNull関数を使います。

 

36.オプションボタンの状態を判定する1

オプションボタンは、UserForm上に複数設置し、どれか1つだけをオンにすることができるコントロールです。オプションボタンがオンかどうかは、Valueプロパティで判定できます。オンのときは、ValueプロパティがTrueになります。

 

37.オプションボタンの状態を判定する2

多くのオブションボタンを配置しているとき、どのオプションボタンがオンかを調べるには、全てのオプションボタンについてValueプロパティを判定しなければなりせん。IfステートメントやSelect Caseステートメントを使った判定では、コードが冗長になる場合もあります。そんな時は、Controlsコレクションを使います。ContorolsコレクションはUserFormに配置されている全てのコントロールが属するコレクションです。例えばOptionButton1というControlは、Controlsコレクションを使って、Controls(“OptionButton1”)と表されます。オプションボタンのオブジェクト名を標準のままのOptionButton1 OptionButton2のようにしておけば、末尾の数値を変えることで、複数のオプションボタンを判定できます。

 

38.マルチページを操作する

マルチページは、複数のページを切り替えられるコントロールです。ウィザードの画面や、VBEのオプションダイアログボックスなど使われています。マルチページの外観はデザイン時に決めることが多く、マクロのコードで動的に変化させることは稀です。何ページが存在し、それぞれのページ名や、現在開いているページを判定するには、サンプルのようにします。個々のページはPagesコレクションに属しているので、ページ数はPagesコレクションのCountプロパティを調べます。ページのタイトルはCaptionプロパティです。現在開いているページは、マルチページのValueプロパティで表されます。

 

39.リストビューを使う(初期設定)

リストビューは、Windowsでおなじみのコントロールで、エクスプローラの右側に使われています。Excel2000以降でであれば、UserFormでリストビューを使うことができます。ListViewコントロールを組み込むには、UserFormの設計画面ツールボックスを右クリックしてその他のコントロールを実行しMicrosoft ListView Control6.0にチェックを入れます。なおListViewコントロールのViewプロパティに設定する定数は以下のうようになります。

 

40.リストビューを使う(データの登録)

リストビューを表形式で使うとき、リストビューのデータは左端と2列目以降に分かれて管理されています。データは1行単位で追加します。左端に表示されているデータは、1行分データListItemオブジェクトのTextプロパティで操作できます。

 

41.リストビューを使う(2列目以降のデータの登録)

リストビューの2列目以降は、SubItemsコレクションとして管理されます。インデックス値は、2列目が1、3列目が2になります。

 

42.リストビューを使う(選択された時の処理)

リストビュー内で任意のデータ選択されると、リストビューのClickイベントが発生します。クリックされたデータ(現在選択されているデータ)は、SelectedItemプロパティで取得できます。選択されているIndexプロパティです。先頭最上行が1になります。

 

43.ツリービューを使う(初期設定)

ツリービューはWindowsエクスプローラの左側にあるような、項目をツリー上に表示するコントロールです。Excel2000以降であれば、UserFormでツリービューを使うことができます。TreeViewコントロールを組み込むには、UserFormの設計画面でツールボックスを右クリックしてその他のコントロールを実行し、Microsoft TreeView Control6.0にチェックを入れます。

 

44.ツリービューを使う(親ノードの登録)

ツリービューに登録するデータをノードと呼びます。ノードは、最上位のノードとそのノードの下にツリー上で表示されるノードに分かれます。下に表示されるノードは上位のノードから見て子供に当たります。ノードを登録する時は、NodesコレクションのAddメソッドを使います。引数にはKeyとTextを指定します。Textは表示される文字列でKeyには全ノードで重複しない文字列を指定します。サンプルは、同じ名前が存在することを考慮して、keyにセルのアドレスを指定しています。

 

45.ツリービューを使う(子ノードの登録)

子ノードを登録する時も、NodesコレクションのAddメソッドを使います。指定する引数のKeyとTextも同じです。ただし、子ノードは、どの親に属する子かを指定します。親ノードを示すのが引数Relativeです。ここに、親ノードのKeyを指定します。そして、自分は子供であることを示すために、引数Relationshipに定数tvwChildを指定します。

 

46.ツリービューを使う(ツリーを展開する)

ツリーを展開する(開く)には、開きたいノード(Nodeオブジェクト)のExpandedプロパティにTrueを設定します。

 

47.ツリービューを使う(選択された時の処理)

ツリービュー内のノードがクリックされると、NodeClickイベントが発生します。クリックされたノードは、引数Nodeに格納されます。サンプルは、選択されたデータの名前・住所・年齢を表示しています。まずクリックされたノードが親か子かを判定します。これには、Chikdlenプロパティを使います。Childlenプロパティは、子ノードの数を返します。もし子ノードが0だったら、クリックされたノードが子供であるという事なので、親ノードを取得します。これにはParentプロパティを使います。ノード全体は、上から順番にインデックスが振られているので、今回は親から3つ分のノードを取得して表示しています。

 

48.スクロールバーを使う(初期設定)

スクロールバーは、スクロールすることで数値を取得するコントロールです。UserForm上にデザインする時、ドラッグする方向によって縦のスクロールバーと横のスクロールバーに出来ます。スクロールバーは選択できる数値の最小値と最大値を設定できます。それぞれMinプロパティとMaxプロパティです。デザイン時にプロパティウィンドウで設定することも可能ですが、マクロの実行中に動的に変化させることもできます。またスクロールボックスの背景部分をクリックされたときに変化する分量はLargeChageプロパティに指定します。

 

49.スクロールバーを使う(変更された時の処理)

スクロールバーの数値は、Valueプロパティで取得できます。またValueプロパティに任意の数値を指定して、スクロールバーのスクロール位置を設定することも可能です。

 

50.スピンボタンを使う

スピンボタンも使い方はスクロールボタンと同じです。両者はいずれも、増減する数値は整数です。少数単位で数値を増減させたい場合は、サンプルのように、Valueプロパティを10で割ります。

 

51.右クリックメニューを作る

コントロールを右クリックしたときにメニューを表示するには、独自のメニューを作成して、コントロールの右クリックに割り当てます。メニューを作成するには、CommandBarsコレクションのAddメソッドを使います。メニューに表示するコマンド名や、クリックされたときに実行するマクロ名などを追加するのは、一般的なメニューの操作と同じです。ポイントはメニューを表示するタイミングです。サンプルでは、リストボックスを右クリックしたときに表示しています。MouseDownイベントはマウスのボタンが押し下げられた時に発生します。Shfitには押されたボタンを表す数値が格納されうので、右ボタン2だったらShowPopupメソッドを実行してメニューを表示します。

 

52.最初に表示する位置を指定する1

UserFormを表示したいとき、最初に表示する位置はStartUpPositonプロパティで指定します。StartUpPositonプロパティには次の数値を指定します。

0

1

2

3

StartUpPositonプロパティは、UserFormのデザイン時にプロパティウィンドウで設定しておくことも多くなります。

 

53.最初に表示する位置を指定する2

UserFormが表示される位置は、TopプロパティとLestプロパティで指定できます。しかし、UserFormの初期化処理(Initializeイベント)を両者を指定しても、反映されないことがあります。それはUserFormを表示する位置を決めるStartUpPositonプロパティに0手動が設定されていないからです。

 

54.前回の表示位置を再現する

ユーザーがUserFormが何かの処理をして閉じます。再びUserFormを呼び出すとき、前回表示していた位置に表示すると、ユーザーの使い勝手がよくなるでしょう。そこでUserFormを閉じるとき、その時点のTopプロパティとLeftプロパティを記録しておき、次回表示するときに反映させます。ではどこに記録しておけばいいのでしょう。一般的にこうした値はレジストリに記録することが多くなります。

 

コメントを残す

メールアドレスが公開されることはありません。