執筆:EugeneAmnis
ユーザーフォームでデータ入力(続き)
前回はユーザーフォームのデザインを説明しました。今回はvbaで機能を実装していきましょう。 念のために作成するユーザーフォームの機能について明示します。
ユーザーフォームの機能
テキスト(B3) | 数字(C3) | カラー(D3) |
---|---|---|
テキスト入力 | 数値のみ入力 | リスト入力 |
上記の表に入力するフォームを作成します。入力すると自動的に表の一番下にレコード(データ)が挿入されるようにします。ユーザーフォームの 基礎を示すだけなので、最小の機能にします。
コーディングを行う。
1.” UserForm1 “を左クリックし、”コードの表示” を選択。
2.ファイル名 UserForm1(コード)ウィンドウ内で” UserForm “をを選択。
3.ファイル名 UserForm1(コード)ウィンドウ内で” Initialize “をを選択。(ユーザーフォームの初期化)
3.作成された Sub ~ End Sub 内に以下を記入する。ラベル Q1〜Q3 に行のヘッダー項目を表記させる。 テキストボックス A2 は数値入力実装の為の準備。リストボックス A3 にリストの選択肢を設定する。グローバル関数 Clears の初期化。
Private Sub UserForm_Initialize()
Q1.Caption = Range("B3").Value
Q2.Caption = Range("C3").Value
Q3.Caption = Range("D3").Value
A2.IMEMode = fmIMEModeDisable
A3.AddItem "RED"
A3.AddItem "BLUE"
A3.AddItem "GREEN"
A3.AddItem "YELLOW"
A3.AddItem "BLACK"
A3.AddItem "WHITE"
clears = True
End Sub
4.ファイル名 UserForm1(コード)ウィンドウ内で” A2 “をを選択。
5.ファイル名 UserForm1(コード)ウィンドウ内で” KeyPress “をを選択。
6.作成された Sub ~ End Sub 内に以下を記入する。数値入力を実装する。 A2 内でキー入力イベントが発生する度に数字かを判断し、数字でなければ入力を無効にする。
Private Sub A2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
KeyAscii = 0
End If
End Sub
7.ファイル名 UserForm1(コード)ウィンドウ内で” entity “をを選択。
8.ファイル名 UserForm1(コード)ウィンドウ内で” Click “をを選択。
9.作成された Sub ~ End Sub 内に以下を記入する。表へ書き込む機能の実装。まず、B列に何個レコードが入力されているかを調べる。 入力内容をセルに転記する。グローバル関数 Clears が true であれば、入力内容をクリアする。(10.~12.で実装)
Private Sub entity_Click()
Dim rows As Integer
rows = Application.WorksheetFunction.CountA(Range("B4:B500"))
rows = rows + 4
Cells(rows, 2).Value = A1.Value
Cells(rows, 3).Value = A2.Value
Cells(rows, 4).Value = A3.Value
If clears Then
A1.Value = ""
A2.Value = ""
A3.Value = ""
End If
A1.SetFocus
End Sub
10.ファイル名 UserForm1(コード)ウィンドウ内で” setup “,” Click “をを選択。
11.” VBAProject (ファイルの名前)“を左クリックし、”標準モジュール” > “挿入” を選択。
12.作成された標準モジュール内に以下を記入する。グローバル関数 Clears を宣言する。(グローバル関数は標準モジュール内でしか宣言できない)
Option Explicit
Public clears As Boolean
12.10.で作成された Sub ~ End Sub 内に以下を記入する。選択肢付きメッセージダイアログが表示され、入力内容のクリアを設定する。
Private Sub setup_Click()
Dim msgBtn As Long
msgBtn = MsgBox(Prompt:="入力内容をクリアしない。", Buttons:=3, Title:="設定")
If msgBtn = 6 Then
clears = False
ElseIf msgBtn = 7 Then
clears = True
End If
End Sub
13.標準モジュール内に以下を記入する。
Sub formCall()
UserForm1.Show
End Sub
完成
保存後に”エディター”を閉じて、”マクロ”を選択し、” formeCall “を起動。ユーザーフォームが表示されます。
各プロパティを調整すると上記のようになります。 Mac版では日本語入力は直接入力は出来ないようです。また、表示も少しおかしい場合があります。入力内容に間違いはありませんが・・・。
簡単なユーザーフォームでしたが、このくらいの手間が掛かります。しかし、操作パネルなどの使い方ができるなど自由度は大変高いです。 ただ、Mac版では作成するものを選ぶ感じはします。
執筆者も結果的にMacにWindowsを入れ、その上でエクセルを走らせています。(vbaを使う際は)
そっちの方が動作が早いです。また、ユーザーフォームはMacで作成したものでマージンを大きく取っていないものは 必ず、Windowsで表示が変になります。イメージコントロールも対応していません。
しかし、作業の自動化をする上では十分です。Mac版のvbaは作り込みが難しい分、シンプルで保守性の高いプログラムを考える癖が付くかも しれません。