ユーザーフォームの使い方がようやく分かってきたので分かりやすく解説してみようと思います。使えるようになると繰返し入力をする機会が消滅します。やばいです。
- そもそもユーザーフォームって何?
- ユーザーフォームで何ができるの?
- ユーザーフォームの作り方
- ①最初からテキストボックスを選択した状態にできないの?いちいち選択するのめんどくさいよ?
- ②テキストボックスの鉛直方向の中央揃えできないの?
- ③テキストボックスに入力するとき、勝手に半角英数になるように設定できないの?
- ④未入力で登録ボタンを押したとき、警告できないの?
そもそもユーザーフォームって何?
大きさ、位置、機能を自由自在に配置、設定できる使いこなせれば魔法のようなツールです。
▼ユーザーフォームの例
ユーザーフォームで何ができるの?
下にあるユーザーフォームに数字・文字を入力して「登録」ボタンを押すと、指定したすべてのセルに「日付」を一括かつ一瞬で入力することができるのです!
同じ動作が大量にあればあるほど自動化による効果も大きくなっていきます。
僕は50枚(100箇所)の請求書を作成しましたが、そのときの日付の入力をこのユーザーフォームで修正しました。
ユーザーフォームを駆使できるようになると効率の高さにめちゃめちゃ感激します!
ユーザーフォームの作り方
まずはAlt+F11でエディタを起動させます。
右クリックでユーザーフォームを挿入しましょう。
▼とりあえず「機能のない」ユーザーフォームができました。
ツールボックスで機能を追加
とりあえず、適当に機能を追加しましょう!
▼テキストボックスを追加
▼コマンドボタンを追加
▼ラベルを追加
位置・形の調整
マウスでいじってこんな感じに。
大きさ・色の変更
登録ボタンの色、「様」の大きさを変更してみましょう。
登録ボタンを選択して、プロパティを選択しましょう。
▼BackColorでクリーム色にしてみました。
▼Fontで「様」を12ptにしてみました。
名前の設定
オブジェクト名が「コードを書くときの対象」、Captionが「表示される名前」となります。オブジェクト名はきちんと覚えておきましょう。
▼ユーザーフォーム自体の名前をname_outputと定義しました。
▼テキストボックス自体の名前をtext1と定義しました。
▼コマンドボタンをButton1と定義しました。
マクロとボタンの紐付け
この辺から少しだけ複雑になりますが、焦らずに進めていきましょう!
ここで「登録」ボタンを左クリックを連打してみてください。
すると、こんな画面になると思います。
これは、「登録」ボタンを押すと「Button1_Click」というマクロが実行するということを意味しています。
マクロの実行の起動スイッチがこの「登録」ボタンになっているのです。
▼元の画面に戻るには左クリックを連打して下さい。
▼練習用にこんなものを用意しました。
▼こんなコードを書いてみましょう。
Private Sub Button1_Click()
Range("b3").Value = "佐藤"
Range("b5").Value = "佐藤"
Range("b7").Value = "佐藤"
Range("b9").Value = "佐藤"
Range("b11").Value = "佐藤"
End Sub
これでボタンを押しさえすれば、それぞれのセルに「佐藤」と入力されるように設定できました。
ボタンはどうやって画面上に表示させるのか?
エディター上ではなく、Excelの画面になければボタンの押すすべがありませんよね。方法は二つあります。
方法①常駐させる。
エディターで「ThisWorkbook」を選択し、以下のコードを書いてください。
Private Sub Workbook_Open()
name_output.Show (vbModeless)
End Sub
これは「ファイルを開いたら勝手に起動する。」というコードです。
ちなみに一度ユーザーフォームを閉じてしまうと再起動はできないのでご注意ください。
試しに一度ファイルを閉じて起動してみましょう!
▼おお、出てきた!
▼ボタンを押してみた、入力された!
とまぁこんな感じです。
続きに戻ります。
方法②マクロを使って起動する。
マクロを使って起動します。標準モジュールに以下のコードを書いて下さい。
Sub nameoutput()
name_output.Show
End Sub
これだけでは使い勝手が悪いので図形に埋め込みましょう。
▼図形を選択して、右クリックでマクロを登録しましょう。
▼できました!
図形に登録しておいた方が使い勝手がいいですね。
マクロとテキストボックスの紐付け
ここまでで「佐藤」と入力したい場合の方法を解説してきました。
ここからはテキストボックスを使って「任意入力」する方法を解説していきます。
「Button1」クリック時のマクロを以下に変更してください。
Private Sub Button1_Click()
Range("b3").Value = text1.Value
Range("b5").Value = text1.Value
Range("b7").Value = text1.Value
Range("b9").Value = text1.Value
Range("b11").Value = text1.Value
End Sub
「text1」とは先ほど設定したテキストボックスのことです。
このコードにより「マクロとテキストボックスの紐付け」が完了です。
試しに閉じて機能を確認しましょう。
鈴木と入力し、ボタンを押してみると…。
▼おお、できた!
とまぁこんな感じです。
意外と難しくなかったんじゃないでしょうか??
これを応用していけばあなたもユーザーフォーマーになれるでしょう!
補足
- ボタンを押した後に終了したいときは以下のコードをEnd subの前に追加してください。
Unload name_output
- テキストボックスの文字を入力後に消したい場合は以下のコードをUnload name_outputの前に追加してください。
text1.Value=""
- もう少しスマートなコードはこちらから
Private Sub Button1_Click()
Dim i As Variant
For i = 1 To 5
Cells(2 * i + 1, 2).Value = text1.Value
'(Cells(縦,横)という座標を与えることができます。)
Next i
text1.Value = ""
Unload name_output
End Sub
- もっとスマートなコードはこちらから
Private Sub Button1_Click()
x = InputBox("入力個数の決定")
Dim i As Variant
For i = 1 To x
Cells(2 * i + 1, 2).Value = text1.Value
Next i
text1.Value = ""
Unload name_output
End Sub
試しにこんなことを…
↓
溢れんばかりの斉藤さんが…。
とまぁ、ここまでが導入編です。ここから自分が「こんなことできないかな?」と思った内容についてQ&A形式で 書いていきます。
①最初からテキストボックスを選択した状態にできないの?いちいち選択するのめんどくさいよ?
作成したユーザフォームのプロパティの優先度を変更します。
まず、 Alt + F11でエディターを起動し、作成したユーザーフォームを選択します。
次に右クリックをすると以下の画面が出てきます。
「タブオーダー」をクリックすると以下の画面が出てきます。
このタブオーダーの順番がアクティブとなるプロパティ(テキストボックスとかラベルとか)の順番となります。
最初に表示させたいものを一番上にしておくとユーザーフォームを開いた直後からそれがアクティブになります。
上記状態ですと「text1」が最上部なのユーザーフォームを開いた直後にテキストボックスに文字入力ができるようになります。
②テキストボックスの鉛直方向の中央揃えできないの?
鉛直方向の中央揃え
鉛直方向の中央揃えは初期設定が与えられておらず、組み合わせる必要があります。
組合わせについては以下のようになります。
テキストボックス風に見せてるラベルと階層がラベルよりも上にある透明のテキストボックスにより、テキストボックスの鉛直方向の中央揃えをしているように表示させることができます。
水平方向の中央揃え
水平方向の中央揃えは初期設定が与えられています。
プロパティの全体に「TextAlign」というコマンドがあり、そこで2を選ぶと中央揃えになります。同様に1は左揃え、3は右揃えです。
③テキストボックスに入力するとき、勝手に半角英数になるように設定できないの?
テキストボックスの入力方式は初期設定が与えられています。
半角英数はプロパティの「IME Mode」というコマンドがあり、そこで8を選ぶと半角英数になります。
それぞれの数字の機能は以下のようになっています。
- 4:全角ひらがな
- 5:全角カタカナ
- 6:半角カタカナ
- 7:全角英数
④未入力で登録ボタンを押したとき、警告できないの?
イメージとしては以下の図のような処理です。
未入力の場合は、メッセージボックスが表示され、再度テキストボックスに入力する必要があります。
入力済みの場合は、処理が進み、処理が終わると①テキストボックスの入力値が削除され、②マクロ自体も終了します。
Private Sub Button1_Click()
'未入力のときの処理
If text1.Value = "" then
MsgBox "入力されていません"
'入力済みのときの処理
Else
Private Sub Button1_Click()
Dim i As Variant
For i = 1 To 5
Cells(2 * i + 1, 2).Value = text1.Value
Next i
text1.Value = ""
Unload name_output
End Sub
とまぁこんな感じです。おしまい|ω・`)