MacroCat@Siro - ExcelVBA・PHP・フリーランス

ExcelVBA、WEBスクレイピング、その他技術に関して書いていきます。

ExcelVBAで【ユーザフォーム】を利用したデータ登録サンプルを作ってみた

読者になる/フォローする

ExcelVBAで【ユーザフォーム】を利用したデータ登録サンプルを作ってみた

f:id:sirosiro346:20170923203013j:plain

おはようございます。siroです。
ランサーズにてExcelの画面(ユーザフォーム)を利用したツール開発の案件が出ていたので、
サンプルを一旦作ってみました。

出来上がりイメージ

まずは、作ったツールを動画でご紹介します。
youtu.be

・画面で入力されていない項目があった場合は、エラーメッセージ表示
・画面で入力したデータが、新規登録ボタンでExcelに書き込まれる
・既にデータが登録されていた場合は、その一つ下の行にデータ登録する

上記3点を実現しています。

どうやって作る?

以下のような流れで作りました。

① ユーザフォームを新規作成し、部品 (ラベル、テキストボックス、ボタン etc...) を配置
② 新規登録ボタン、閉じるボタン押下時の処理をプログラミング
③ 簡単な動作テスト

ユーザフォーム新規登録方法

① VBEを 「Alt + F11」で開く
② プロジェクトエクスプローラーで右クリックし、挿入から「ユーザフォーム」を選択
f:id:sirosiro346:20171007002559p:plain

ユーザフォームへの部品配置方法

表示タブのツールボックスを表示
f:id:sirosiro346:20171007002547p:plain
② 配置したい部品 (ラベル、テキストボックス、ボタン etc...)を選択し、配置したい場所を選んで配置
f:id:sirosiro346:20171007002733p:plain

部品のプロパティ設定

配置した部品は、デフォルトだと部品の名前が識別しにくいものになっているため、
最低限部品名をプロパティ値を変更して設定
※プロパティではほかにも文字サイズや、色、その他さまざまな設定変更が可能です

① 設定したい部品を選択する (ここではNoのラベルを選択しています)
f:id:sirosiro346:20171007003006p:plain

オブジェクト名を識別可能な値に変更 (ここではNoのラベルなので、「No_ + Lbl」としています。※末尾でラベルであることがわかるようにしています
※個人的には以下のようなコーディングルールを決めておくとよいと思います。
 ・ラベル      :任意の値 + 「 _ 」 + Lbl
 ・テキストボックス :任意の値 + 「 _ 」 + Txt
 ・コンボボックス  :任意の値 + 「 _ 」 + Cmb
 ※任意の値には、内容がわかるものを入れます
 
f:id:sirosiro346:20171007003133p:plain

こうすることで、

   Range("B6").value = No_Lbl.Value

のように、値を取得して利用することができます。
上記を利用し、テキストボックス、ラベル、ボタンを準備します。

ボタンのクリックイベントを書く

ボタンのクリックイベントを書く場合は、VBEにてユーザフォームを開き、
クリックイベントを書きたいボタンをダブルクリックします。
※ダブルクリックすることで、クリック用のメソッドが自動的に作られます。

クリック前
f:id:sirosiro346:20171007003514p:plain

クリック後
f:id:sirosiro346:20171007003539p:plain


この中でクリック時の具体的な処理を書いていきます。
※画像は既にソースが書いてありますが、クリック処理を新規に作る場合は、
 内容が書いていない状態でクリック用のイベント処理だけできます。

実際のソースコード一覧

ソースコード一覧は下記となります。

'閉じるボタンクリック時の処理
Private Sub Close_Btn_Click()
    
    'フォームを閉じる
    Unload NewRegist_Frm

End Sub

'新規登録ボタン押下時の処理
Private Sub regist_Btn_Click()
    Debug.Print "エラーチェック"
    
    'エラーチェック
    If No_Txt.Value = "" Then
        MsgBox "Noを入力してください", vbExclamation
        No_Txt.SetFocus
        Exit Sub
    ElseIf Title_Txt.Value = "" Then
        MsgBox "タイトルを入力してください", vbExclamation
        Title_Txt.SetFocus
        Exit Sub
    ElseIf Address_Cmb.Value = "" Then
        MsgBox "宛先を選択してください", vbExclamation
        Address_Cmb.SetFocus
        Exit Sub
    ElseIf TextBody_Txt.Value = "" Then
        MsgBox "メール本文を入力してください", vbExclamation
        TextBody_Txt.SetFocus
        Exit Sub
    End If
    
    Call excelRegist(No_Txt.Value, Title_Txt.Value, Address_Cmb.Value, TextBody_Txt.Value)
    
    'フォームを閉じる
    Unload NewRegist_Frm

End Sub

'ユーザフォームオープン時の処理
Private Sub UserForm_Initialize()
    'ドロップダウンリストに初期地設定
    Address_Cmb.AddItem "XXXXXXXXXXXXXXX@gmail.com"
    Address_Cmb.AddItem "YYYYYYYYYYYYYYY@gmail.com"
End Sub

'Excelにデータ登録
Sub excelRegist(strNo As String, strTitle As String, strAddress As String, strTextBody As String)
    '最終行の取得
    Dim rowNo As Long
    Range("B1047586").Select '最終行を選択
    Selection.End(xlUp).Select
    rowNo = ActiveCell.Row + 1

    ActiveSheet.Range("B" & CStr(rowNo)).Value = strNo
    ActiveSheet.Range("C" & CStr(rowNo)).Value = strTitle
    ActiveSheet.Range("D" & CStr(rowNo)).Value = strAddress
    ActiveSheet.Range("E" & CStr(rowNo)).Value = strTextBody
End Sub

エラー処理も分けた方が良かった気がしますが、こんなソースで実現できます。
ユーザフォームを作って試してみたいという方、ぜひ試してみてください!!

質問についてはコメントにてご連絡ください。

上記のような画面を使ったシステム開発などを依頼されたい方は、以下ランサーズからご依頼ください。
www.lancers.jp

ではではーノシ