見出し画像

マクロのある暮らし(11回目) - フォームのある暮らし

こんにちは!なるーらぼです!
きょうは朝からかなり雨が降っていますね。
出かける用事が入っているので、ちょっと困りますが元気にいきたいと思います。

フォーム

さて、今回はマクロで頻繁には利用されていないかもしれないフォームについてです。フォームってご存知でしょうか?Excelなどのホストアプリケーションからさらに独自のウィンドウを作成することができるものです。

例えば、セルに値を入力してほしいけど思ったとおりにやってほしい、そしてほかのセルには触らないでほしい。とか。そういったとき、セルの入力規則を利用したりリストから選択させたりという方法がありますし、特定のセル以外を変更禁止にロックすることもできます。ですからこれと言ってわざわざつくる方は少ないかもしれません。

しかし、ユーザーフォームは便利です。何しろ、マクロをExcelなどをベースとしたデータベース、レポート機能付きのアプリケーションのように仕立てることができるからです。

「そうはいっても、小難しいんでしょう?」
はい、少し難しいです(^^)

身も蓋もありませんが、本当に少しだけ難しいです。
単にセルの内容をマクロで加工していたときとは変わってくることがあります。具体的に「どの点が」を考えるに、2つあると思います。

1つはユーザーエクスペリエンスでしょう。ボタンの配置、文字のサイズ、色、わかりやすさなどを考え始めるともはやただのExcelブックではありません!

2つ目はイベント駆動でしょう。ボタンをクリックしたのか、キーを押したのか、あるいは別の操作をしたのかによってそれぞれ動作が変わってきたりしますし、イベントにも発生する順序があります。これを誤るとおかしな動きをしてしまいます。

実際にやってみよう

いい加減「難しい」とか言っておきながらですが、やってみましょう。おもむろにVBEでプロジェクトエクスプローラ部分で右クリックして、メニューから「ユーザーフォーム」をクリックします。

すると、次のようなものが表示されますよね。

これがフォーム作成のスタート地点です。このまま三角矢印ボタンをクリックして実行すると、なにやらウィンドウが表示されます。

いわゆるダイアログという形式のウィンドウです。あとはここへボタンなどの部品を貼っていきます。そうした部品のことをコントロールと呼びます。コントロールはツールボックスに並んでいます。必要なものをクリックしたらマウスポインタが十字になるので、好きなところでドラッグ&ドロップすることで大きさを決めることもできます。

まずは「A」と表示されているもの、ラベルコントロールになりますが、これをクリックしてフォームの中央付近に「でーん」とおいてみます。

ちょっと文字が小さいし、「Label1」って…という感じですので編集していきましょう。VBEの左下に「プロパティ」ってところがありますよね。ここで変更していくことができます(もちろん、コードからも変更できますけど)。

表示されている文字の内容は「Caption」、文字の大きさは「Font」、文字の色は「ForeColor」です。この辺りを変更してみましょう。

わたしはFontをメイリオの16pt、文字色をパレットから選んで青緑にしました。こんな感じです。

あれ?テキストを中央に寄せていますか?はい、寄せています。TextAlignプロパティで「2 - fmTextAlignCenter」を指定しています。これで中央寄せになります。

ウィンドウの名称を変更したいときはForm1のほうのCaptionを変更すれば大丈夫です。ボタンなども基本的に同じ方法ですのでいろいろやって遊んでみてください!

ちょっとだけ動くものをつくろう

では最後に少しだけ動くものをつくってみたいと思います。さきほどLabel1コントロールを貼り付けましたよね。これを利用してやってみたいと思います。

フォーム部分(ラベルではないところ)を右クリックして、表示されるメニューから「コードを表示」をクリックしてみてください。

するといつものマクロを記述する表示に切り替わります。

ここで、そのウィンドウの右上にあるプルダウンから「Activate」を選択するとコードが自動生成されます。

Private Sub UserForm_Activate()

End Sub

今回はここへコードを書いてみます。デジタル時計みたいなものを書いてみましょうか。

Private Sub UserForm_Activate()
 Label1.Caption = Format(Now, "hh:mm:ss")
 DoEvents
End Sub

こんな感じにして三角矢印をクリックするとウィンドウが表示されます。しかも時計っぽくなっていますよね。

でもこれでは時計とは言えません。ですから1秒ごとに表示が変化していくようにしましょう。標準モジュールを追加して、いつものサブプロシージャを追加します。まずはいつものサブルーチンです。

Sub note_mu()
 Load UserForm1
 UserForm1.Show
 Unload UserForm1
End Sub

あまり意味はありませんが、フォームを表示して表示が終わったらメモリから削除するというだけのものです。これによって呼び出されるフォームのほうは次のようにしました。

Private flg As Boolean
Private Sub UserForm_Activate()
 Do
  With Label1
   .Caption = Format(Now, "hh:mm:ss")
  End With
  DoEvents
  Application.Wait _
   TimeSerial(Hour(Now), Minute(Now), Second(Now) + 1)
 Loop Until flg
End Sub
Private Sub UserForm_Terminate()
 flg = True
End Sub

フォームが終了するときに無限に続くループが終了するようにだけつくってあります。

アニメーションGIFで見る方はこちら

最後に

今回はフォームを少しご紹介してみました。次回からももう少しフォームであそんでみたいと思います。

この記事が気に入ったらサポートをしてみませんか?