見出し画像

マクロのある暮らし(12回目) - もっとフォームであそぼう

こんにちは!なるーらぼです!
今回は前回に引き続き、ユーザーフォームであそんでみたいと思います。

前回は時計みたいなものをつくってみましたね。

今回は入力した内容を表示するフォームをつくってみたいと思います。じっくりいきますので、やってみてください。

オウム返しする

まずは入力された内容をオウム返ししてみます。用意するものは入力するためのテキストボックスが1つ、オウム返しするためのラベルが1つ、オウム返しを発動するためのボタンが1つです。

こんな感じにしてみました。テキストボックスへ入力して「送信する」と書かれたコマンドボタンをクリックするとラベルの内容が書き換わるというものです。

まずはフォームが構成されるときの処理を書いてみます。

Private Sub UserForm_Layout()
 TextBox1.Text = ""
 Label1.Caption = ""
 TextBox1.TabIndex = 0
 CommandButton1.TabIndex = 1
 TextBox1.SetFocus
End Sub

これで入力欄は空欄のままフォーカスがあたっていて、すぐに入力できます。そしてタブキーを押したときに入力欄の次がボタンになるようにしてあります。

次にボタンのクリックイベントを書きます。

Private Sub CommandButton1_Click()
 Label1.Caption = TextBox1.Text
End Sub

一番シンプルなものを書いてみました。これで動かしてみると…

予想通り、ですね。でも何も入力せずにボタンをクリックしてしまうと空欄のままになってしまいます。ということで、入力されているかどうか調べてから表示するようにしますか。

Private Sub CommandButton1_Click()
 If TextBox1.Text <> "" Then
  Label1.Caption = TextBox1.Text
 Else
  Label1.Caption = "何も書いてないですよ!"
 End If
End Sub

これで何も書いていないときは「何も書いてないですよ!」と表示されるようになりました。スペースのみ入力のときに対処するならIfの条件で比較するときに「Trim関数」を使うようにしてみてください。

応用編

オウム返しするものがとりあえずできましたね。そうしたら次は応用してみましょう。入力された内容を加工して表示するようにします。

Private Sub CommandButton1_Click()
 If TextBox1.Text <> "" Then
  Label1.Caption = "入力:" & TextBox1.Text
 Else
  Label1.Caption = "何も書いてないですよ!"
 End If
End Sub

加工といっても「入力:」というのを加えただけですが、さらに応用すれば入力した内容をひな形のテキストに埋め込むこともできるんじゃないか?とイマジネーションが膨らむでしょう!

2つの入力欄を用意すれば四則計算なんかをさせることができますし、それ以外にもいろんなことができると思います。

Excelシートへの入力フォームにしてみたり、データベースへのエントリシートにしてみたり。あるいはメールを送信する内容を用意してみたり。もちろんウェブAPIを使えばツイートしたり、投稿したり…と夢は膨らみます。

さらにやってみる

さらに「何が面白いんだ」と言われそうですが、やってみましょう。いまの状態では入力されていないときにボタンを押すと「何も書いてないですよ!」ですね。ではよくウェブで見かけるような「未入力のときにテキストを表示しておく」そして「未入力でボタンを押されたら対象の入力欄が警告表示になる」というやつをやってみましょう!

まずは未入力のときにテキストを表示しておく、をやってみます。
ここまでのちょっとした応用で、テキストボックスの上にラベルを重ねておくという方法です。でもそうすると「入力できないじゃーん」になるので、クリックされたら非表示にしてフォーカスをテキストボックスに移すようにします。さらに、テキストボックスからフォーカスがなくなったときに入力がなければ再びラベルを表示するようにしてみましょう!

デザインはこんな感じにしておきます。ラベルコントロールの位置が微妙にレイアウトしずらい場合はTopプロパティとLeftプロパティを微調整するといいですよ!

そして表示するときのコードを少し改変してボタンにフォーカスが当たるようにしておきます。

Private Sub UserForm_Layout()
 TextBox1.Text = ""
 Label1.Caption = ""
 TextBox1.TabIndex = 0
 CommandButton1.TabIndex = 1
 CommandButton1.SetFocus
End Sub

入力欄にマウスポインタを持って行ってもらうため、ですね。ではラベルをクリックしたときの処理も書いておきましょう。

Private Sub Label2_Click()
 Label2.Visible = False
 TextBox1.SetFocus
End Sub

これで入力欄にフォーカスを移しつつ、表示していたテキストを隠すことができました。次に入力欄からフォーカスが外れたときに入力がなければラベルを再度表示するようにしてみます。

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If TextBox1.Text = "" Then
  Label2.Visible = True
 End If
End Sub

さらに、タブキーの移動でフォーカスされたときにもラベルを非表示にするようにしておきましょう。ここに書いておけばLabel2のクリックイベントの非表示のコードは削除しても構いません。

Private Sub Label2_Click()
 TextBox1.SetFocus
End Sub
Private Sub TextBox1_Enter()
 Label2.Visible = False
End Sub

最後に、ボタンクリックのときに入力がされていないときに警告表示するようにします。

Private Sub CommandButton1_Click()
 If TextBox1.Text <> "" Then
  Label1.Caption = "入力:" & TextBox1.Text
 Else
  With TextBox1
   .BorderColor = &HFF
   .BorderStyle = fmBorderStyleSingle
   .SpecialEffect = fmSpecialEffectFlat
  End With
  Label1.Caption = "何も書いてないですよ!"
 End If
End Sub

このとき、テキストボックスからフォーカスが移動したときに入力済みなら警告を解除するようにもしてみましょう。

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If TextBox1.Text = "" Then
  Label2.Visible = True
 Else
  With TextBox1
   .BorderColor = &H80000006
   .BorderStyle = fmBorderStyleSingle
   .SpecialEffect = fmSpecialEffectSunken
  End With
 End If
End Sub

これでいいでしょう。最初はラベルが表示されているのですが、未入力でボタンをクリックすると赤枠になります。

この状態でフォーカスをテキストボックスへ移しても何も変化しません。

何か入力してボタンへフォーカスを移すと赤枠がもとに戻ります。

最後に

今回はフォームにコントロールを増やしていろいろやってみました。ワークシートにオートシェイプなどで図形を貼り付けて、それにマクロを登録するというのもいいと思いますが、複雑なことをやろうと思うと辛いので、そういうときはフォームを利用することも検討してみてください。

ユーザーフォームは奥が深いので、もう1回くらいやろうかと思います。
ではまた!

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