思考酒後

自分に入ってきた情報を定着、深化するために文章化

MENU

【Excelマクロ】ユーザーフォームの使い方を理解したから、分かりやすく解説するよ!


こんばんは、masa@ masa)です!

ユーザーフォームの使い方がようやく分かってきたので分かりやすく解説してみようと思います。使えるようになると繰返し入力をする機会が消滅します。やばいです。

 

f:id:masa_mn:20170317211651j:plain

そもそもユーザーフォームって何?

大きさ、位置、機能を自由自在に配置、設定できる使いこなせれば魔法のようなツールです。

▼ユーザーフォームの例

f:id:masa_mn:20170317191813j:plain

 

ユーザーフォームで何ができるの?

下にあるユーザーフォームに数字・文字を入力して「登録」ボタンを押すと、指定したすべてのセルに「日付」を一括かつ一瞬で入力することができるのです!

同じ動作が大量にあればあるほど自動化による効果も大きくなっていきます。

f:id:masa_mn:20170317192210j:plain

僕は50枚(100箇所)の請求書を作成しましたが、そのときの日付の入力をこのユーザーフォームで修正しました。

ユーザーフォームを駆使できるようになると効率の高さにめちゃめちゃ感激します!

 

ユーザーフォームの作り方

まずはAlt+F11でエディタを起動させます。

右クリックでユーザーフォームを挿入しましょう。

f:id:masa_mn:20170317193222j:plain

 

▼とりあえず「機能のない」ユーザーフォームができました。

f:id:masa_mn:20170317193339j:plain

 

ツールボックスで機能を追加

とりあえず、適当に機能を追加しましょう!

 

▼テキストボックスを追加

f:id:masa_mn:20170317193548j:plain

 

▼コマンドボタンを追加

f:id:masa_mn:20170317193700j:plain

 

▼ラベルを追加

f:id:masa_mn:20170317193905j:plain

 

 

位置・形の調整

マウスでいじってこんな感じに。

f:id:masa_mn:20170317194141j:plain

 

大きさ・色の変更

登録ボタンの色、「様」の大きさを変更してみましょう。

登録ボタンを選択して、プロパティを選択しましょう。

 

▼BackColorでクリーム色にしてみました。

f:id:masa_mn:20170317194540j:plain

 

▼Fontで「様」を12ptにしてみました。

f:id:masa_mn:20170317194711j:plain

 

名前の設定

オブジェクト名が「コードを書くときの対象」、Captionが「表示される名前」となります。オブジェクト名はきちんと覚えておきましょう。

 

▼ユーザーフォーム自体の名前をname_outputと定義しました。

f:id:masa_mn:20170317202142j:plain

 

▼テキストボックス自体の名前をtext1と定義しました。

f:id:masa_mn:20170317195325j:plain

 

▼コマンドボタンをButton1と定義しました。

f:id:masa_mn:20170317195510j:plain

 

マクロとボタンの紐付け

この辺から少しだけ複雑になりますが、焦らずに進めていきましょう!

ここで「登録」ボタンを左クリックを連打してみてください。

 

すると、こんな画面になると思います。

f:id:masa_mn:20170317195836j:plain

これは、「登録」ボタンを押すと「Button1_Click」というマクロが実行するということを意味しています。

マクロの実行の起動スイッチがこの「登録」ボタンになっているのです。

 

▼元の画面に戻るには左クリックを連打して下さい。

f:id:masa_mn:20170317200207j:plain

 

▼練習用にこんなものを用意しました。

f:id:masa_mn:20170317200428j:plain

 

▼こんなコードを書いてみましょう。

Private Sub Button1_Click()

Range("b3").Value = "佐藤"
Range("b5").Value = "佐藤"
Range("b7").Value = "佐藤"
Range("b9").Value = "佐藤"
Range("b11").Value = "佐藤"

End Sub

 

 

これでボタンを押しさえすれば、それぞれのセルに「佐藤」と入力されるように設定できました。

ボタンはどうやって画面上に表示させるのか?

エディター上ではなく、Excelの画面になければボタンの押すすべがありませんよね。方法は二つあります。

 

方法①常駐させる。

エディターで「ThisWorkbook」を選択し、以下のコードを書いてください。

f:id:masa_mn:20170317202358j:plain

 

Private Sub Workbook_Open()
 name_output.Show (vbModeless)
 End Sub

 

これは「ファイルを開いたら勝手に起動する。」というコードです。

ちなみに一度ユーザーフォームを閉じてしまうと再起動はできないのでご注意ください。

試しに一度ファイルを閉じて起動してみましょう!

▼おお、出てきた!

f:id:masa_mn:20170317203407j:plain

 

▼ボタンを押してみた、入力された!

f:id:masa_mn:20170317203547j:plain

とまぁこんな感じです。

続きに戻ります。

方法②マクロを使って起動する。

マクロを使って起動します。標準モジュールに以下のコードを書いて下さい。

Sub nameoutput()
name_output.Show
End Sub

 

これだけでは使い勝手が悪いので図形に埋め込みましょう。

▼図形を選択して、右クリックでマクロを登録しましょう。

f:id:masa_mn:20170317204029j:plain

f:id:masa_mn:20170317203953j:plain

f:id:masa_mn:20170317210704j:plain

 

▼できました!

f:id:masa_mn:20170317204138j:plain

図形に登録しておいた方が使い勝手がいいですね。

 

マクロとテキストボックスの紐付け

ここまでで「佐藤」と入力したい場合の方法を解説してきました。

ここからはテキストボックスを使って「任意入力」する方法を解説していきます。

「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」とは先ほど設定したテキストボックスのことです。

このコードにより「マクロとテキストボックスの紐付け」が完了です。

 

試しに閉じて機能を確認しましょう。

鈴木と入力し、ボタンを押してみると…。

 

▼おお、できた!

f:id:masa_mn:20170317204840j:plain

とまぁこんな感じです。

意外と難しくなかったんじゃないでしょうか??

これを応用していけばあなたもユーザーフォーマーになれるでしょう!

 

補足

  • ボタンを押した後に終了したいときは以下のコードを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

 

 

試しにこんなことを…

 

f:id:masa_mn:20170317210200j:plain

溢れんばかりの斉藤さんが…。

f:id:masa_mn:20170317210257j:plain

とまぁ、ここまでが導入編です。ここから自分が「こんなことできないかな?」と思った内容についてQ&A形式で 書いていきます。

 

①最初からテキストボックスを選択した状態にできないの?いちいち選択するのめんどくさいよ?

作成したユーザフォームのプロパティの優先度を変更します。

まず、 Alt + F11でエディターを起動し、作成したユーザーフォームを選択します。

次に右クリックをすると以下の画面が出てきます。

f:id:masa_mn:20170406190056p:plain

 

タブオーダー」をクリックすると以下の画面が出てきます。

f:id:masa_mn:20170406190218p:plain

 

このタブオーダーの順番がアクティブとなるプロパティ(テキストボックスとかラベルとか)の順番となります。

最初に表示させたいものを一番上にしておくとユーザーフォームを開いた直後からそれがアクティブになります。

 

上記状態ですと「text1」が最上部なのユーザーフォームを開いた直後にテキストボックスに文字入力ができるようになります。

 

②テキストボックスの鉛直方向の中央揃えできないの?

鉛直方向の中央揃え

鉛直方向の中央揃えは初期設定が与えられておらず、組み合わせる必要があります。

 

組合わせについては以下のようになります。

f:id:masa_mn:20170318113035j:plain

テキストボックス風に見せてるラベル階層がラベルよりも上にある透明のテキストボックスにより、テキストボックスの鉛直方向の中央揃えをしているように表示させることができます。

 

水平方向の中央揃え

水平方向の中央揃えは初期設定が与えられています。

プロパティの全体に「TextAlign」というコマンドがあり、そこで2を選ぶと中央揃えになります。同様に1は左揃え、3は右揃えです。

f:id:masa_mn:20170406190939p:plain

 

③テキストボックスに入力するとき、勝手に半角英数になるように設定できないの?

テキストボックスの入力方式は初期設定が与えられています。

半角英数はプロパティの「IME Mode」というコマンドがあり、そこで8を選ぶと半角英数になります。

それぞれの数字の機能は以下のようになっています。

  • 4:全角ひらがな
  • 5:全角カタカナ
  • 6:半角カタカナ
  • 7:全角英数

f:id:masa_mn:20170406191410p:plain

④未入力で登録ボタンを押したとき、警告できないの?

イメージとしては以下の図のような処理です。

f:id:masa_mn:20170318112733j:plain

 

未入力の場合は、メッセージボックスが表示され、再度テキストボックスに入力する必要があります。

入力済みの場合は、処理が進み、処理が終わると①テキストボックスの入力値が削除され、②マクロ自体も終了します。

 

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 

 

とまぁこんな感じです。おしまい|ω・`)