ユーザーフォームはUIです。
VBAコードのバグ修正の様に何度も仕様変更はできません。
この問題解決の最速は、実例を教科書にすることです。
利用者側からの使いやすさやデザインや仕様は必須です。
今回は第5回目の「販売帳票(見積書、納品書、請求書)を作成するエクセルソフト」についての記事です。
ユーザーフォームつまりUIを使って、エクセルソフトをコントロール出来るようにする方法についてです。
こんにちは、じゅんぱ店長(@junpa33)です。
ユーザーフォームと一言で言っても、安直にボタンや入力ボックスを配置するだけではいけません。
何かの練習のために作るのではなく、「とりあえず試しに作ります。」と言っても、
実際にそれを仕事で使っていこうとするなら、
その利便性、使いやすさ、実用に耐えるものにしなければ意味がありません。
その前に前回の記事を読み直すにはこちら↓になります。
Excel帳票のデータ保存はVBA誤動作の対策を必ずしよう。
見積書・納品書・請求書作成に関する記事はこちらです。
コンテンツ
実用的なVBAユーザーフォームを作成したい
「ユーザーフォーム」はエクセルVBAを触りだすと、誰しも使い手になりたい(?)と思うVBAの機能ではないでしょうか。
「やった!できた!」と言っても、利用する側から見れば、単に
「ボタンを押せば答えが出る」とか「記入欄に項目内容を入れれば住所録ができる」とか
「何か楽になった」というほどの印象かもしれません。
それでいいでしょうか?
ホントはもっと、実用的に上手く使える「うん これはいい!」と言われるようなTechを持ちたいなぁと思っているのではないですか。
ユーザーフォームに配置したボタンがイマイチ動かない
また、こういうこともよく起こります。
ユーザーフォームを作ろうと、コントロールのボタンを配置しました。でも全く無反応、イマイチ動かない。
動いたと思ったらなぜかエラーストップ。これの繰り返し、ストップが連発。
どうして?を調べるのに、まず最初にエクセルVBAの解説書、参考書のユーザーフォームの章を読むでしょう。
さらに「ユーザーフォーム・・・」でググって、Webで色々当たってみたりはするものの、
「うーん!」イマイチ分からないなぁ。
ユーザーフォームの仕上がりも見栄えがイマイチだし、思うように動かないし、どうすればいい?
どこを見ても、ピタッとした解決案が見つからないし。
ユーザーフォームの(ツールボックスの)各パーツの機能説明とか、プロパティ項目の説明とかはもういいし、
それより解決策を教えてほしいと思いますよね。
悩める君
これを、今その場で出来る解決策は2つ。
- Q&Aサイトに嵐のような質問
- 使用実例を載せているサイトをひたすら探し知識を頂く
何れかです。
そういったことに対して、この記事は
実際の使用例から、何かのインスピレーションで、解決の糸口を掴んでしてもらえるかもしれない人のための記事でもあります。
実際、自分もこのような方法である程度理解できて、使えるようにもなりましたし。
使えるユーザーフォーム作成のコツは、実例を教科書に
繰り返しますが、お悩み解決の方法として、お勧めできるのは実例を教科書にするということです。
何がいいのかと言えば、
VBAコードの実行で、どのように動作が進んでいくかを知ることが出来るというところです。(デバッグが大変参考になります。)
今回のテーマ「販売帳票(見積書、納品書、請求書)を作成するエクセルソフト」についてもユーザーフォームを使っていますので、
実例としてあなたの問題の参考にしていただけると幸いです。
このブログで、この記事以外にも、実際に幾つかユーザーフォームを使ったエクセルVBAを紹介しています。こちらも参考にしてください。
バックナンバーの検索ツール。VBAユーザーフォームの使い方を解説
エクセルで領収書、ユーザーフォームのVBAで印刷をコントロール
ExcelVBAをユーザーフォームからコントロール!「雑誌と書籍の在庫表」編
ゆうちょ振替決済。振込用紙の印字用に口座入力シートを作成します。
エクセルだけで16種類の封筒に宛名印刷ができる。住所録転用可能!
マルチページを使ったエクセル封筒印字ソフトの作成!宛名リスト編
エクセルVBAアクティブセルの利用。印刷の範囲を指定!封筒宛名印刷
1クリック!エクセルVBAで同一データを複数セルに簡単入力する
複数セルに簡単に入力できる「データスタンプVBAソフト」の作り方
エクセルVBA Gotoで移動!シート非表示ソフトのコード解説
実例 このテーマの実際のユーザーフォーム
「操作パネル(ユーザーフォーム)」のビジュアル
ビジュアル上でまず一番に重要なもの
実際に使うユーザーフォームのサイズは、まず
基本的に、背後に表示される(データの表示された)シートの邪魔にならないような大きさに設定しましょう。
VBA解説書にあるような ”バカデカいボタンや、フォームサイズ” では、全く実用には使えないです。背後にあるシートのデータの修正が必要な時に、前面にあるフォームが邪魔になります。そこの説明にある大きさは全て解説のための大きさです。
写真画像を参考にいただいて、セルのサイズから大きさを判断してください。出来るだけコンパクトにすることです。
表示文字は視認性のいいサイズと色でカラフルにせずシンプルにデザインしましょう。
色替えは同系濃淡色、フォントサイズは12~14 が見易いです。
次に重要なのは操作順にコントロールを配列
ユーザーが設定する必要がある項目は、実操作の流れ順に上下左右・右往左往しないように配置しましょう。
あと、よく忘れがちなセットアップで、「タブ順」設定を忘れないようにしましょう。
ユーザーフォームのベース部分でマウスを右クリック→メニューから「タブオーダー」を選択します。
タブオーダーのリストの項目を上下させて順番を整頓します。
コントロールの配置とプロパティ
ラベル
「見積書納品書請求書3点伝票作成コントロール」・「*********************************************」・「電子印鑑」・「顧客番号」・「発行年月日」・「フォントの選択」・「フォントサイズ変更」・「品名欄」・「顧客名」
オブジェクト名は変更しません。
Captionをそれぞれの名前に変更します。
チェックボックス、コマンドボタン、テキストボックス、コンボボックス
オブジェクト名とCaption を確認します。
フォントカラーなどは適宜です。
チェックボックス | コマンドボタン | テキストボックス |
CheckBox2 | テンプレ作成する | 顧客番号 |
押印をする | テンプレ作成 | |
![]() |
![]() |
![]() |
テキストボックス | コマンドボタン | チェックボックス |
発行年月日 | データ連携する | CheckBox1 |
データ連携 | ソリマチ販売王連携 | |
![]() |
![]() |
![]() |
コンボボックス | テキストボックス | テキストボックス |
ComboBox1 | 品名F | 顧客F |
![]() |
![]() |
![]() |
コマンドボタン | コマンドボタン | コマンドボタン |
伝票作成する | 帳票印刷する | 帳票保存する |
帳票作成 | 帳票印刷 | 帳票保存 |
![]() |
![]() |
![]() |
コマンドボタン | チェックボックス |
シートクリアする | CheckBox3 |
シートクリア(初期化) | 印刷時自動保存 |
![]() |
![]() |
ユーザーフォームモジュールへのコード記述
Private Sub テンプレ作成する_Click()
Module1.テンプレ作成2
End Sub
Private Sub データ連携する_Click()
End Sub
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem “MS Pゴシック”
.AddItem “MS P明朝”
.AddItem “游ゴシック”
.AddItem “”
End With
End Sub
Private Sub 伝票作成する_Click()
Dim Res As Variant
If 操作パネル.顧客番号.Value = “” Then
MsgBox “顧客番号が入力されていません。”
Exit Sub
End If
Module5.テンプレ作成1
End Sub
Private Sub 帳票印刷する_Click()
Module3.印刷設定
End Sub
Private Sub 伝票保存する_Click()
Module4.伝票保存
End Sub
Private Sub シートクリアする_Click()
Module5.Clearする
End Sub

テンプレ作成する_Click()
モジュール1の「テンプレ作成2」プロシージャーを起動する。
データ連携する_Click()
日々の売り上げ管理ソフトの販売王の利用者用の機能です。(利用者のみ)
販売王から出力された日々の販売データを読み込み、帳票作成のデータとします。
UserForm_Initialize()
ユーザーフォームのコンボボックスの表示項目を設定します。
コンボボックスは後で項目をその都度追加できるようにも出来ます。が、
無規則で追加されると思わぬトラブルもあるかもしれませんので、ここは、初期設定で固定しています。
フォント種を増やしたいときは、「.AddItem “〇〇〇”」としてコードを付け加えてください。
伝票作成する_Click()
モジュール5の「テンプレ作成1」プロシージャーを起動しますが、その前にユーザーフォームモジュールで
ユーザーフォームの顧客番号が入力されていないときは、プロシージャーを起動しないように条件分岐しています。
帳票印刷する_Click()
モジュール3の「印刷設定」プロシージャーを起動する。
伝票保存する_Click()
モジュール4の「伝票保存」プロシージャーを起動する。
シートクリアする_Click()
モジュール5の「clearする」プロシージャーを起動する。
ユーザーフォーム連携で標準モジュールのコードを一部修正
Module1.テンプレ作成2
ユーザーフォームのコントロール「テンプレ作成ボタン」との連携で、Sub テンプレ作成2()のコードを少々加筆します。
1.コード全体をFor~Nextで囲み、各シート毎の処理を一度に行います。
Sub テンプレ作成2()
For a = 2 To 4 ‘操作パネルデータを使用で変更
Worksheets(a).Select
With ActiveSheet
’一旦初期化
.Cells.ClearFormats
・・・・・(途中省略)
Worksheets(“見積書”).Range(“F5”).ClearFormats
End If
End If
End With
Next a
End Sub
2.電子印鑑の押印を選択できるようにする
ユーザーフォームで電子印鑑のチェックが入った場合に押印を行う設定
「チェックボックスがチェックされた」の判定は「= True」で判断します。
‘帳票別設定
If ActiveSheet.Name = “請求書” Then
.Range(“D1”) = “請 求 書”
・・・・・(途中省略)
.Range(“B9”).VerticalAlignment = xlBottom
If 操作パネル.CheckBox2 = True Then ‘操作パネルデータを使用で変更
Worksheets(“電子印鑑の登録”).Range(“B13”).Copy Worksheets(“請求書”).Range(“F5”)
Worksheets(“請求書”).Range(“F5”).ClearFormats
End If
End If
If ActiveSheet.Name = “納品書” Then
.Range(“D1”) = “納 品 書”
・・・・・(途中省略)
.Range(“B9”).VerticalAlignment = xlBottom
If 操作パネル.CheckBox2 = True Then ‘操作パネルデータを使用で変更
Worksheets(“電子印鑑の登録”).Range(“B13”).Copy Worksheets(“納品書”).Range(“F5”)
Worksheets(“納品書”).Range(“F5”).ClearFormats
End If
End If
If ActiveSheet.Name = “見積書” Then
.Range(“D1”) = “見 積 書”
・・・・・(途中省略)
.Range(“B9”).VerticalAlignment = xlBottom
If 操作パネル.CheckBox2 = True Then ‘操作パネルデータを使用で変更
Worksheets(“電子印鑑の登録”).Range(“B13”).Copy Worksheets(“見積書”).Range(“F5”)
Worksheets(“見積書”).Range(“F5”).ClearFormats
End If
End If
End With
Next a
End Sub
Module2.帳票作成()
ユーザーフォームのコントロール「帳票作成ボタン」、「発行年月日」、「フォントサイズ変更」との連携で、Sub テンプレ作成2()のコードを少々削除と加筆します。
1.「Module1.テンプレ作成2」 →→→→→ 削除
2.「.Range(“F3”).Font.Size = 10」 →→→→→ Module1.テンプレ作成2に移動
「 .Range(“F3”) = “令和 年 月 日”」→→→ Module1.テンプレ作成2に移動
3.ユーザーフォームのフォントサイズ変更で「’品名のフォント」と「’顧客名のフォント」のコードを設置します。
4.ユーザーフォームの発行年月日をデータ挿入
1.「Module1.テンプレ作成2」「.Range(“F3”).Font.Size = 10」「 .Range(“F3”) = “令和 年 月 日”」を削除する
‘請求納品見積へテンプレート再構築
For a = 2 To 4
Worksheets(a).Select
‘Module1.テンプレ作成2 ‘削除
With Worksheets(a)
.Range(“A13:G” & KeRow).Borders.LineStyle = xlContinuous
.Range(“B14:B” & KeRow).Font.Size = 10 ‘品名のフォントサイズ
.Range(“B13:B” & KeRow).WrapText = True
.Range(“C13:D” & KeRow).HorizontalAlignment = xlCenter
.Range(“E13:F” & KeRow).NumberFormatLocal = “\ #,##0”
‘.Range(“F3”).Font.Size = 10 ‘削除
‘.Range(“F3”) = “令和 年 月 日” ‘削除
2.Module1.テンプレ作成2に移動
‘罫線の設定 と ’項目の入力 の間に ’日付の表記 を差し込みます。
‘日付の表記
.Range(“F3”).Font.Size = 10
.Range(“F3”).Value = “令和 年 月 日”
3.「’品名のフォント」と「’顧客名のフォント」のコードを設置
4.ユーザーフォームの発行年月日をデータ挿入
3.と4.を一度に説明します。
3.について、それぞれのフォントの数値は変数としてプロシージャーの最初に宣言をします。
Dim a As Long, m As Long, N As Long
Dim SaRow As Long, KeRow As Long
Dim Fsa As Variant, Fsb As Variant
‘請求納品見積へテンプレート再構築 と ’請求納品見積シートへデータ転記 の間にコードを差し込みます。
ユーザーフォームのフォント入力欄が空白の場合は、
- 品名のフォントは10
- 顧客名のフォントは13
に、デフォルト設定しています。
発行年月日の方はユーザーフォームに入力された値を変数化せず直接セルに代入しています。
値の取り方は、= 操作パネル.発行年月日.Valueとして入手することが出来ます。無記入の場合は空白になります。
・・・・・(途中省略)
‘請求納品見積へテンプレート再構築
For a = 2 To 4
Worksheets(a).Select
With Worksheets(a)
.Range(“A13:G” & KeRow).Borders.LineStyle = xlContinuous
.Range(“B14:B” & KeRow).Font.Size = 10 ‘品名のフォントサイズ
.Range(“B13:B” & KeRow).WrapText = True
.Range(“C13:D” & KeRow).HorizontalAlignment = xlCenter
.Range(“E13:F” & KeRow).NumberFormatLocal = “\ #,##0”
‘品名のフォント
Fsa = 操作パネル.品名F.Value ‘操作パネルデータを使用
If Fsa = Null Or Fsa = “” Then
Fsa = 10
Else
.Range(Cells(14, 2), Cells(KeRow, 2)).Font.Size = Fsa
End If
‘顧客名のフォント
Fsb = 操作パネル.顧客F.Value ‘操作パネルデータを使用
If Fsb = Null Or Fsb = “” Then
Fsb = 13
Else
.Range(“B6”).Font.Size = Fsb
End If
End With
Range(“F3”) = 操作パネル.発行年月日.Value ‘操作パネルデータを使用
Range(“F3”).Font.Size = 10
Next a
‘請求納品見積シートへデータ転記
For N = 2 To SaRow
・・・・・(途中省略)
Module2.宛名設定()
ユーザーフォームの顧客番号のVBAコード反映の部分になります。この番号で、宛先(発行先)の自動入力を行いますので、このソフトの重要部分でもあります。
‘仮のコードです のところのVBAコードはほぼ全て再編成していきます。
顧客番号の変数CosNoは「仮のコード」ではインプットボックスからとっていましたが、今回はユーザーフォームからになります。
入力された顧客番号を「宛名の登録」シートのデータとマッチングして、宛先を帳票に表示します。
もし見当たらない場合は、訂正入力するか。空欄で終了するかを選択します。
「宛名設定」改定の全コードです。
Sub 宛名設定()
Dim Res As Variant, CosNo As Long
Dim Ybn, Jus, Ate
Res = 0
Workbooks(“見納請3点伝票作成.xlsm”).Activate
Worksheets(“宛名の登録”).Select
‘操作パネルのデータより
CosNo = 操作パネル.顧客番号.Value
stepB:
If CosNo = Null Then
MsgBox “顧客番号が入力されていません。”
Exit Sub
Else
On Error GoTo 0
On Error Resume Next
Res = WorksheetFunction.Match(CosNo, Range(“B:B”), 0)
If Res = 0 Then GoTo stepA
End If
Ybn = Range(“D” & Res).Value ‘郵便番号
Jus = Range(“E” & Res).Value ‘住所
Ate = Range(“C” & Res).Value ‘宛名
For a = 2 To 4
With Worksheets(a)
.Range(“B3”) = Ybn
.Range(“B4”) = Jus
.Range(“B6”) = Ate & “ 様”
End With
Next a
stepA:
If Res = 0 Then
Ans = MsgBox(“一致する顧客番号はありません。” & vbCrLf & “正しい番号を入力しますか?” _
, vbYesNo + vbQuestion, “チェック”)
If Ans = vbYes Then
CosNo = InputBox(Prompt:=”半角数字で顧客番号を” & vbCrLf & “入力してください。”)
操作パネル.顧客番号.Value = CosNo
GoTo stepB
Else
MsgBox “宛名空欄で終了します”
Exit Sub
End If
End If
End Sub
Match関数についてはこちらを参考にしてください。
エクセルVBAで使うMatch関数 活用度アップでテッパン関数に!
メッセージボックスについてはこちらを参考にしてください。
Gotoステートメントについてはこちらを参考にしてください。
Module3.印刷設定()
印刷設定プロシージャーでもユーザーフォームで入力したフォントサイズが利用できるようにします。
フォントの数値を変数としてプロシージャーの最初に宣言をします。
Sub 印刷設定()
Dim SaRow As Long, KeRow As Long, NRow As Long
Dim a As Long, s As Long, b As Long
Dim Fsa As Variant, Fsb As Variant
「Module2.宛名設定」の時と同じように ’品名のフォント と ’顧客名のフォント のコードを設置します。
‘固定のフォントサイズ(品名以外)
.Range(Cells(14, 3), Cells(KeRow, 7)).Font.Size = 11
.Range(Cells(14, 1), Cells(KeRow, 1)).Font.Size = 10
‘品名のフォント
Fsa = 操作パネル.品名F.Value ‘操作パネルデータを使用
If Fsa = Null Or Fsa = “” Then
Fsa = 10
Else
.Range(Cells(14, 2), Cells(KeRow, 2)).Font.Size = Fsa
End If
‘顧客名のフォント
Fsb = 操作パネル.顧客F.Value ‘操作パネルデータを使用
If Fsb = Null Or Fsb = “” Then
Fsb = 13
Else
.Range(“B6”).Font.Size = Fsb
End If
End With
‘注記・項目のフォントサイズ
・・・・・(途中省略)
印刷時にユーザーフォームで選択したフォント種を設定します。
・・・・・(途中省略)
‘注記・項目のフォントサイズ
For s = 14 To KeRow
If Cells(s, 2) = “税込合計” Or Cells(s, 2) = “以下余白” Then
Cells(s, 2).Font.Size = 11
End If
Next s
‘フォント種選択(ユーザーフォームから選択)
If 操作パネル.ComboBox1.ListIndex = 0 Then
Cells.Font.Name = “MS Pゴシック”
ElseIf 操作パネル.ComboBox1.ListIndex = 1 Then
Cells.Font.Name = “MS P明朝”
ElseIf 操作パネル.ComboBox1.ListIndex = 2 Then
Cells.Font.Name = “游ゴシック”
Else
Cells.Font.Name = “MS Pゴシック”
End If
Next a
・・・・・(途中省略)
印刷時自動保存のチェックボックスがチェックされた時の設定を行います。
印刷設定プロシージャーの最後に ’自動保存設定 のコードを設置します。
・・・・・(途中省略)
‘自動保存設定
If 操作パネル.CheckBox3 = True Then ‘操作パネルデータを使用
Module4.伝票保存
End If
End Sub
Module4.伝票保存()
印刷時自動保存のチェックボックスがチェックされていた時は、
ユーザーフォームのこの「帳票保存ボタン」が無効になるように設定します。(重複保存を避けるため)
伝票保存プロシージャーの変数の宣言の次に「このチェックのコード」を設置します。
‘自動保存チェック
If 操作パネル.CheckBox3 = True Then ‘操作パネルデータを使用
Exit Sub
End If
Module5.テンプレ作成1()
モジュール5を挿入して記述します。
ユーザーフォームの「帳票作成ボタン」とリンクしています。
全体のコードはこのようになっています。
顧客番号を「宛名の登録」シートのデータとマッチさせるために、ここでA・B列のセルの表示設定を「数値」にセットしています。
Sub テンプレ作成1()
Worksheets(“宛名の登録”).Select
Range(“A:B”).NumberFormatLocal = “0_ “
Module1.テンプレ作成2
Module2.帳票作成
Worksheets(“請求書”).Select
Range(“A1”).Select
End Sub
Module5.Clearする()
ユーザーフォームの「シートクリアボタン」とリンクしているコードです。
今開いているシートを初期表示状態にクリアします。
本当に初期状態に戻すかを確認するメッセージが表示されるようにしています。
Sub Clearする()
Answ = MsgBox(“実行するとシートが初期化されます。” & vbCrLf & “実行しますか?” _
, vbYesNo + vbQuestion, “チェック”)
If Answ = vbYes Then
With ActiveSheet
.Cells.ClearFormats
.Cells.ClearContents
.Cells.UseStandardHeight = True
.Cells.UseStandardWidth = True
.DrawingObjects.Delete
End With
Else
Exit Sub
End If
End Sub
ユーザーフォームの表示スイッチ ブックとシートモジュール
ブックモジュール
このブックモジュールにユーザーフォームの表示スイッチコードを記述します。
Private Sub Workbook_Open()
操作パネル.Show vbModeless
End Sub
シートモジュール
作業シートのシートモジュールにユーザーフォームの表示スイッチコードを記述します。
Private Sub Worksheet_Activate()
操作パネル.Show vbModeless
End Sub
ユーザーフォーム作成習得のまとめ
ユーザーフォームは、基本的にデータ入力装置であってプログラム起動装置です。
ですので、各モジュールのVBAコードとの連携無くしては、全く機能することはありません。
ユーザーモジュールを幾ら時間をかけて研究しても、それのみで動くことはないのです。
一方、モジュールのVBAコードも、ユーザーフォームから呼び出される仕組みのコードや
入力データに応答するコードを仕込まないと反応することもありません。
この記事でご覧いただけましたように、
ベースとなるモジュールのVBAコードがあって(まず組み立てて)、
その後、コントロールを設置したユーザーフォームを作成して、
そして、そのコントロールとモジュールのVBAをつなぐVBAコードを組み立てて接続する。
その時に大変参考になるのが、教科書的な解説書よりは ”実際に使っているVBAコードを持った具体的事例”になるわけです。
これからは、事例を参考にしながら発展してオリジナルな個性的なコードを作れるようにしていきましょう。
このブログでも、いくつかの参考事例(全て実際に使っているものばかり)がありますので、是非、回遊してみてください。
「販売帳票(見積書、納品書、請求書)を作成するエクセルソフト」はここまでで一応完了になります。 が、
更に利便性を高めるために、自店で使っている日々の販売売上管理ソフト「販売王」と、データ連携を図れるように付加機能を付けることが出来ます。
「販売王」を利用していない会社やお店は直接的には使えませんが、
次回はそのオプション機能の解説記事を紹介します。
販売管理ソフトを探している会社やお店は、この記事を是非参考にしてみてください。
次の記事に進むにはこちら↓から


電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)
学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。
最後までお読みいただき有難うございました。
エクセルVBAを使って業務効率を上げて行くのに、始めのうちに知っておくといい内容を纏めてみました。