VBA講座4

ユーザーフォームの作成
この、講座では、ユーザーフォームの作り方を説明します。
講座3で、私の顔の出たユーザーフォームがあったと思います。
エクセルの標準である、メッセージボックスでも、同じことが出来るのですが、
やっぱり、自分独自のユーザーフォームを使った方が、カッコいいですよね。

いつものようにVBEを開いて、プロジェクトエクスプローラ上で右クリック、挿入から、
今度は、ユーザーフォームを選びます。するとUserForm1が追加されます。、
当然いくつでも作ることが出来ます。上の図では、UserForm1からUserForm5までの五つ、
のユーザーフォームがありますね。
そして、UserForm1をクリックすると、ユーザーフォームの雛形とツールボックスが、
表示されます。もしツールボックスが表示されない場合は、上の表示でツールボックス
にチェックを入れてください。

ツールボックスには、各種のコントロールがあります。
たくさんありますが、コマンドボタンとラベルとイメージ(画像)について説明します。
コマンドボタンは、四角い出っ張ったアイコンです。
このボタンには、各種の動作の命令を与えます。
ラベルは”A”の文字が書いてあるアイコンです。
ここには、説明などを書き込みます。
イメージ(画像)は”山”みたいな絵の描いてあるアイコンです。
プロパティウィンドウのPictureをクリックして、画像を選び貼り付けます。
ツールボックスの各種コントロールの配置は、パソコンによって違いますが、
カーソルを当てればアイコン名が表示されますから、分かると思います。

まず、UserForm1の表示を変えます。あくまでもUserForm1はUserForm1ですので、
表示だけを変えるという意味です。
左下のプロパティウィンドウのCaptionをクリック、その右に名前を入力します。
次に、UserForm1の色を決定します。UserForm1の中で右クリック、
プロパティウィンドウのBackcolorで背景色を決定します。
ここらで、エクセルファイルからこのユーザーフォームを呼び出すテストをします。
VBEを一度閉じて、エクセルのシートに戻ります。そしてシートにコマンドボタンを
貼り付けます。
デザインモードであることを確認して、シート上のコマンドボタンを右クリック
コードの表示を選択します。そして、以下のコードを入力します。

Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

コードの入力が済んだら、デザインモードを解除します。
これで、シート上のコマンドボタンをクリックするとユーザーフォームが呼び出せます。
テストに成功したら、もう一度VBEに戻ります。
UserForm1に、各種のアイコンを貼り付けていきます。
まずは、コマンドボタンを貼り付け、プロパティウィンドで設定を変更します。
このコマンドボタンをクリックすると、コードウィンドウが開きますので、
そこに、以下のコードを入力します。

Private Sub CommandButton1_Click()
Unload Me
End Sub


先ほどの二つのコマンドボタンのコードはPrivate Subから始まりましたよね。
このように、シートからの命令や、ユーザーフォームからの命令は、
Subからではなく、Private Sub から始まります。これ重要です。
さらに、同じCommandButton1でも、前者の場合はシート上のもので、
後者はユーザーフォーム上のものです。
前者のコードは、プロジェクトエクスプローラのシートのところに記録され、
後者のコードは標準モジュールの中のどこかに記録されています。
つまり、Private Sub CommandButton1_Click()という同じ動作でも、記録されている
場所で区別しているわけです。これも重要です。
UserForm1.Showは、ユーザーフォームを呼び出す命令、Unload Meは消す命令です。
もう一度シートに戻り、上書き保存します。
シートのコマンドボタンをクリックすれば、ユーザーフォームを呼び出せ、
呼び出したユーザーフォームのコマンドボタンをクリックすれば、消せるはずです。

これで、ユーザーフォームを使うことが出来ると思います。
では、このユーザーフォームを何に使うかですが、外道院先生に伺ってみましょう
先生、ユーザーフォームはどんなことに使うのですか?

そうだな、成績順に並べ替えるとか、名簿順に戻すとかなら、
シートにコマンドボタンを貼り付けるだけでよいのだが・・・
わしが使ったのは、文科省の新体力テストの処理プログラムかな・・・


上の図の各種競技得点順のボタンを押すと、ユーザーフォームが開くわけだ。
このように、たくさんのコマンドボタンを配置する場合に使うべきかな。
シート上にやたらとボタンがあると鬱陶しいから、必要なときだけ呼び出すわけだ。

なるほど、ふだんは消えているわけですね。

そうなんだ。あとコマンドボタンの中身だが、ただのマクロ名だ。

それはどうするんですか?

なあに、簡単なことじゃよ。シート上でマクロ記録を選びソートするだけだ。
競技の数だけマクロを作り、それぞれのマクロ名をフォームのコマンドボタン
のコードに書くだけだ。マクロ名は競技の名前にしておいた。

そんなに簡単なんですか?

ああ、簡単じゃ。速さを競う競技は昇順で、他の競技は降順にするだけだ。

Private Sub CommandButton1_Click()
握力順
Unload Me
End Sub

Private Sub CommandButton2_Click()
上体起こし順
Unload Me
End Sub

Private Sub CommandButton3_Click()
長座体前屈順
Unload Me
End Sub

Private Sub CommandButton4_Click()
反復横とび順
Unload Me
End Sub

Private Sub CommandButton5_Click()
シャトルラン順
Unload Me
End Sub

Private Sub CommandButton6_Click()
M50m走順
Unload Me
End Sub

Private Sub CommandButton7_Click()
立ち幅とび順
Unload Me
End Sub

Private Sub CommandButton8_Click()
ハンドボール順
Unload Me
End Sub

Private Sub CommandButton9_Click()
Unload Me
ActiveSheet.Protect "gedouin"
End Sub


最後のコマンドボタン9は、”中止”のボタンなんだ。
ActiveSheet.Protectは、シートの保護を有効にする命令なんだぞ。

ただ、シートに保護をかけていると並べ替え(ソート)が出来ないから、
UserForm1を呼び出す命令のときに、シートの保護を解除しておくわけだ。
パスワードを設定している時はActiveSheet.Unprotectの後に半角スペースを空けて
"gedouin"というように設定したパスワードを書いておけばよい。
以下がUserForm1を呼び出す命令文だ。

Private Sub CommandButton1_Click()
ActiveSheet.Unprotect "gedouin"
UserForm1.Show
End Sub


次に、M50m走順とハンドボール順の並べ替え(マクロ)の中身を書いておく。
上が昇順のソートのマクロ、下が降順のソートのマクロなんだ。
違いがわかるかな?
文中の _ (アンダーバー)は、文章を繋げるためのものだから気にしなくてよいぞ。
VBAでの命令文は一行で書く決まりだからな、長くなるとアンダーバーで繋ぐんだ。

Sub M50m走順()
Range("A4:U104").Select
Selection.Sort Key1:=Range("N5"), Order1:=xlDescending, Key2:=Range("M5") _
, Order2:=xlAscending, Key3:=Range("A5"), Order3:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
, SortMethod:=xlPinYin
Range("A1").Select
ActiveSheet.Protect "gedouin"
End Sub

Sub ハンドボール順()
Range("A4:U104").Select Selection.Sort Key1:=Range("R5"), Order1:=xlDescending, Key2:=Range("Q5") _
, Order2:=xlDescending, Key3:=Range("A5"), Order3:=xlAscending, Header _
:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
, SortMethod:=xlPinYin
Range("A1").Select
ActiveSheet.Protect"gedouin"
End Sub


正解は、それぞれの4行目のOrder2:=xlAscendingとOrder2:=xlDescendingなんだ。
前者のxlAscendingが昇順、後者のxlDescendingが降順というわけなんだ。
M50m走順のマクロの説明をすると、最初の行がマクロ名だな。
次のRange("A4:U104").Selectがソートする範囲を示している。
次のSelection.Sort Key1:=Range("N5"), Order1:=xlDescendingが一番目のキーで、
この場合のN列は得点なので、降順に設定してるんだ。
Key2:=Range("M5"), Order2:=xlAscendingが二番目のキーで、
M列は50m走のタイムだから昇順で、三番目のキーも出席番号なので昇順に設定だ。

だから、このマクロを動かすと、まずN列の得点の多い順に並べる。しかしこれの
最高得点は10だから、同じ得点の者がたくさんいる。だから、その中で
タイムの短い順に並べ、さらのその中で出席番号の若い順に並べるわけだ。
次のHeader:=xlYesは、最初の行をヘッダーにする命令で、いやならNOだぞ。
OrderCustom:=1は省略可能で、省略すると、通常の並べ替え順になるな。
ユーザー設定の並べ替え順のリスト内の番号を示し、1から始まる整数を指定する。
MatchCase も省略可能でTrueで、大文字と小文字を区別して並べ替えを行う。
Falseで、大文字と小文字を区別しないで並べ替えをする。普通はFalseだな。
Orientation:=xlTopToBottomも省略可能で、並べ替えの方向を指定する。
xlTopToBottom が既定値で、行方向の並べ替えとなる。普通はこれだな。
xlLeftToRightだと、列方向の並べ替えになる。特別な場合に使うかな。
SortMethodも省略可能で、これは並べ替えの種類を指定するんだ。
xlPinYinが既定値で、漢字の名前などの場合、入力時のふりがなを使う。
xlStrokeふりがなを使わない設定で、文字コード順なんだ。まず使わん。

後、ここにはないが、DataOptionは、Excelの2002で追加されたパラメーターで、
以前のバージョンでは使えないんだな〜困ったことに。
何番目のソートキーのテキストを並べ替える方法を指定する命令で、
xlSortNormalが既定値で、数値データとテキストデータを別々に並べ替えるんだ。
xlSortTextAsNumbersは、テキストを数値データとして並べ替える。
まず、使うことは無いと思うな。だから当然省略可能なんだ。
というか省略しないと古いエクセルだとエラーになるぞ!!
Range("A1").Selectは、カーソルの位置を左上端に戻す命令で、当然省略可能。
ActiveSheet.Protect"gedouin"は、最後にシートを保護する命令で、これは
マクロでは、作れないから、後で自分で入力する必要があるんだな。
"gedouin"は、このシートのパスワードだから、人の作ったエクセルのシステムでも
VBEを開けて、ここを見ればパスワードが解読出来るんだ。
分かったと思うが、特に新しいエクセルほど、マクロに不必要な命令が多く含まれて
いるな。
特にDataOptionなどが含まれている場合は、削除しないと誰でも使えるシステムに
ならないから、大変なんだぞ。

このマクロは、以下のように省略しても動作すると思うぞ。
ソートで、これ以外のよく分からない文章があれば削除するほうがよいと思うがな。

Sub M50m走順()
Range("A4:U104").Select
Selection.Sort Key1:=Range("N5"), Order1:=xlDescending, Key2:=Range("M5") _
, Order2:=xlAscending, Key3:=Range("A5"), Order3:=xlAscending, Header:= _
xlYes
ActiveSheet.Protect "gedouin"
End Sub


先生、ありがとうございました。
また、よろしくお願いします。

前に戻る
最初に戻る