使い易いユーザーフォームとは、利用者の個人的主観です。と言っても基本的な利便性は共通して必要です。多くの実例を教科書として、使いやすさやデザインを参考にしましょう。
こんにちは、じゅんぱ店長(@junpa33)です。
現在 販売帳票(見積書、納品書、請求書)を作成するエクセルソフトを作っています。
今回は、ユーザーインターフェイスとしてユーザーフォームを使って、このエクセルソフトをコントロール出来るようにしたいと思います。
ユーザーフォームと一言で言っても、安直にボタンや入力ボックスを配置するだけではいけません。
何か練習のために作りますとか、「とりあえず試しに作りました。」であってもいけません。
実際にそれを仕事で使っていこうとするなら、その利便性、使いやすさ、実用に耐えるものにしなければ意味がありません。
その前に前回の記事を読み直すにはこちら↓になります。
作成帳票の保存は、必要個所をマクロなしエクセルブックで見積書納品書請求書作成の記事編成
- 見積書納品書請求書作成ソフトの使い方とダウンロード
- 見積書納品書請求書作成ソフトの作成概略
コンテンツ
実用的なVBAユーザーフォームを作成したい
「ユーザーフォーム」はエクセルVBAを使いだすと、誰しも使い手になりたい(?)と思う、VBAの機能ではないでしょうか。
「やった!できた!」と言っても、利用する側から見れば、単に
「ボタンを押せば答えが出る」とか「記入欄に項目内容を入れれば住所録ができる」とか
「何か楽になった」というほどの印象かもしれません。
それでいいでしょうか?
ホントはもっと、実用的に上手く使える「うん これはいい!」と言われるようなTechを持ちたいなぁと思っていませんか。
ユーザーフォームの便利度評価は利用者次第
作成したユーザーフォームが万人が使い易いということはまずありえません。
基本、エクセルの使い方が人それぞれ違います。使用用途が違います。
なので、作成しているエクセルソフトの利用者対象がどういったものかで、その仕事環境で判断しましょう。
エクセル操作初心者グループ向けに、コントロールの多いユーザーフォームを作っても、使用説明に明け暮れるだけになります。
ユーザーフォームに配置したボタンがイマイチ動かない
実際作ってみると、こういうこともよく起こります。
ユーザーフォーム上に、複数のコントロールのボタンを配置しました。でも一部のボタンが全く無反応、イマイチ動かない。
動いたと思ったらなぜかエラーストップ。これの繰り返し、ストップが連発。
エラー対策で頭がいっぱいイッパイ
どうして?を調べるのに、まず最初にエクセルVBAの解説書、参考書のユーザーフォームの章を読むでしょう。
さらに「ユーザーフォーム・・・」でググって、Webで色々当たってみたりはするものの、
「うーん!」イマイチ分からないなぁ。
ユーザーフォームの仕上がりも見栄えがイマイチだし、思うように動かないし、どうすればいい?
どこを見ても、ピタッとした解決案が見つからないし。
ユーザーフォームの(ツールボックスの)各パーツの機能説明とか、プロパティ項目の説明とかはもういいし、
それより解決策を教えてほしいと思いますよね。
あぁ~こうしている間に時間だけが過ぎて行く・・・
これを、今その場で出来る解決策は2つ。
- Q&Aサイトに嵐のような質問
- 使用実例を載せているサイトをひたすら探し知識を頂く
何れかです。
実際、自分もこのような方法である程度理解できて、使えるようにもなりました。
使えるユーザーフォーム作成のコツは、実例を教科書に
繰り返しになりますが、お悩み解決の方法として、お勧めできるのは実例を教科書にするということです。
実際の使用例を見て行くことで、何かインスピレーションが働き、解決の糸口を掴めるかもしれません。
プログラムの進行で言えば、VBAコードがどのような処理をしながら進んでいくのか、を知ることが出来ます。(標準モジュールではデバッグが大変参考になります。)
以下は、このサイトでの一部のユーザーフォーム関連記事になります。
今回のテーマ「販売帳票(見積書、納品書、請求書)を作成するエクセルソフト」についてもユーザーフォームを使っています。
このあと、作成しているエクセルソフトでユーザーフォームの作成手順を説明して行きます。
このサイトで、この記事以外にも、実際に幾つかユーザーフォームを使ったエクセルVBAを紹介しています。こちらも参考にしてください。
バックナンバー検索ツールのユーザーフォームをデザイン
ユーザーフォームのVBAで領収書の印刷をコントロールする方法
ユーザーフォームを作成。操作性を考えた個性的デザイン
請求金額などを用紙印字する仕組みづくり。払込取扱票印字
エクセルだけで16種類の封筒に宛名印刷ができる。住所録転用可能!
封筒宛名印刷のVBA作成。基本部のユーザーフォーム
マルチページ内に入力フォームを設置して宛名リストを作る
単独印刷のマルチページ。16種類に対応したテンプレ作成
連続印刷機能のコード設計。印刷範囲設定や途中終了と停止
16種類の封筒に差出人を印刷する。タテ・ヨコ印刷に対応
1クリック!エクセルVBAで同一データを複数セルに簡単入力
「データスタンプVBAソフト」をエクセルVBAで作る
エクセルVBAマルチページ作成。秘密鍵コードで非表示化!
シート非表示ソフトのVBAコード Gotoでジャンプ移動
見納請3点伝票作成ソフトにユーザーフォームを設置する
実例の一つとして、見納請3点伝票作成エクセルソフトにユーザーフォームを設置していきます。
作成手順など参考にしてみてください。
使い易さを考慮してデザインしていますが、本当に使い易いかどうかは、使用者の個人的主観次第ということにしておきます。
実例のユーザーフォーム外観
実際に使うユーザーフォームのサイズは、まず
基本的に、背後に表示される(データの表示された)シートの邪魔にならないような大きさに設定しましょう。
VBA解説書にあるような ”バカデカいボタンや、フォームサイズ” では、全く実用には使えないです。(説明用です)背後にあるシートのデータの修正が必要な時に、前面にあるフォームが邪魔になります。
写真画像を参考にいただいて、セルのサイズから大きさを判断してください。出来るだけコンパクトにすることです。
表示文字は視認性のいいサイズと色で、カラフル過ぎるのは返って眩しくなってしまいます。
色替えは同系濃淡色、フォントサイズは12~14 が見易いです。
ユーザーが設定する必要がある項目は、実操作の流れ順に上下左右・右往左往しないように配置しましょう。
あと、よく忘れがちなセットアップで、「タブ順」設定を忘れないようにしましょう。
ユーザーフォームのベース部分でマウスを右クリック→メニューから「タブオーダー」を選択します。
タブオーダーのリストの項目を上下させて順番を整頓します。
キーボードの「Tabボタン」で、カーソル(セル)を動かし、順に入力欄を移動していくには「タブオーダーの整頓」が必須です。
ユーザーフォームにコントロールを設置する
各コントロールの配置は「ツールボックス」を使って、それぞれに進めてください。
ユーザーフォームの挿入と表示は簡単 エクセルVBA コマンドボタンをユーザーフォームに設置する ラベルをユーザーフォームに設置する テキストボックスをユーザーフォームに設置する「見積書納品書請求書3点伝票作成コントロール」・「*********************************************」・「電子印鑑」・「顧客番号」・「発行年月日」・「フォントの選択」・「フォントサイズ変更」・「品名欄」・「顧客名」
オブジェクト名は変更しません。
Captionをそれぞれの名前に変更します。
オブジェクト名とCaption を確認します。
フォントカラーなどは適宜です。
ユーザーフォームモジュールへのコード記述
部品化プロシージャーでCallステートメントは必須Option Explicit
Private Sub テンプレ作成する_Click()
MRK = 1
Call Module1.テンプレ作成2
End Sub
Private Sub データ連携する_Click()
If CheckBox1 = False Then Exit Sub
Call Module6.データ転記
End Sub
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "MS Pゴシック"
.AddItem "MS P明朝"
.AddItem "メイリオ"
.AddItem "游ゴシック"
.AddItem ""
End With
End Sub
Private Sub 伝票作成する_Click()
Dim ms As Long
If 操作パネル.顧客番号.Value = "" Then
ms = MsgBox("顧客番号が入力されていません。" & vbCrLf & _
"このまま続けますか?", vbYesNo + vbQuestion, _
"見納請3点伝票作成")
End If
If ms = vbNo Then
Exit Sub
ElseIf ms = vbYes Then
MRK = 2
Call Module5.テンプレ作成1
Else
MRK = 3
Call Module5.テンプレ作成1
End If
End Sub
Private Sub 帳票印刷する_Click()
Call Module3.印刷設定
End Sub
Private Sub 伝票保存する_Click()
If 操作パネル.CheckBox3 = True Then
Exit Sub
End If
Call Module4.伝票保存
End Sub
Private Sub シートクリアする_Click()
MRK = 0
Call Module5.Clearする
End Sub
モジュール1の「テンプレ作成2」プロシージャーを起動する。
日々の売り上げ管理ソフトの販売王の利用者用の機能です。(利用者のみ)
販売王から出力された日々の販売データを読み込み、帳票作成のデータとします。
ユーザーフォームのコンボボックスの表示項目を設定します。ユーザーフォームを初期化して設定しています。
コンボボックスは後で項目をその都度追加できるようにも出来ます。が、
無規則で追加されると思わぬトラブルもあるかもしれませんので、ここは、初期設定で固定しています。
フォント種を増やしたいときは、「.AddItem “〇〇〇”」としてコードを付け加えてください。
モジュール5の「テンプレ作成1」プロシージャーを起動しますが、その前にユーザーフォームモジュールで
ユーザーフォームの顧客番号が入力されていないときは、相手先なしで作成を進めるかどうかを確認します。
モジュール3の「印刷設定」プロシージャーを起動する。
モジュール4の「伝票保存」プロシージャーを起動する。
「印刷時自動保存」チェックボックスがONの場合は操作無効になります。
モジュール5の「clearする」プロシージャーを起動する。
ユーザーフォームと標準モジュールのコードを紐づける
ユーザーフォームで電子印鑑のチェックボックス「押印をする」にチェックが入った場合の設定
「チェックボックスがチェックされた」の判定は「= True」で判断します。
・・・・・
If 操作パネル.CheckBox2 = True Then
Worksheets("電子印鑑の登録").Range("B13") _
.Copy Worksheets("請求書").Range("F5")
Worksheets("請求書").Range("F5").ClearFormats
End If
・・・・・
コード全体をFor~Nextで囲み、各シート毎の処理を一度に行います。
For~Nextのループと入れ子構造をVBA最速理解Option Explicit
Sub テンプレ作成2()
Dim a As Integer
Workbooks("見納請3点伝票作成.xlsm").Activate
For a = 2 To 4
Worksheets(a).Select
・・・・・
Next a
Worksheets("請求書").Select
If MRK = 1 Then
MsgBox "3点伝票テンプレートの作成が完了しました。", vbInformation, _
"見積書納品書請求書作成エクセル"
End If
End Sub
入力された顧客番号で「宛名の登録」シート中に登録された宛名や住所を抽出します。
顧客番号が入力されていない場合や間違っている場合は、メッセージを表示して利用者に継続の判断を促します。
Val関数はデータ型不一致の解決策。文字列型から数値型へ VBAで使うMatch関数 活用度アップでテッパン関数に! Gotoステートメントでコードをジャンプ!毒と薬の2面性・・・・・
CosNo = 操作パネル.顧客番号.Value
stepB:
If CosNo = "" And MRK <> 2 Then
MsgBox "顧客番号が入力されていません。", vbExclamation, _
"見納請3点伝票作成"
GoTo stepA
Else
CosNo = Val(CosNo)
On Error GoTo 0
On Error Resume Next
Res = WorksheetFunction.Match(CosNo, Range("B:B"), 0)
If Res = 0 Then GoTo stepA
End If
・・・・・
発行年月日を入力しますが、空欄にした場合は「令和 年 月 日」と帳票に表示されます。
'発行年月日のテンプレ転記
With .Range("F3")
If 操作パネル.発行年月日.Value = "" Then
.Value = "令和 年 月 日"
Else
.Value = 操作パネル.発行年月日.Value
End If
.Font.Size = 10
End With
商品販売ソフトの「ソリマチ販売王」とデータ連携するためのプロシージャーを呼び出すためのボタンです。
先に外部出力した販売王に登録した売上データを、この販売帳票(見積書、納品書、請求書)を作成するエクセルソフトに導入するためのものです。
詳細は、後の記事で紹介しています。
販売王のデータ出力を利用。見積納品請求3点帳票をVBA作成不用意に「データ連携」ボタンをクリック出来ないように、この「ソリマチ販売王連携」チェックボックスがONになっている時のみ「データ連携」ボタンが働くようになっています。
ユーザーフォームモジュールで記述したフォント種をどれか選択することが出来ます。
選択したフォント名はコンボボックスのValueとして「印刷設定」プロシージャーで使用します。
「フォント」の操作を最速理解する エクセルVBA・・・・・
'フォント種選択(ユーザーフォームから選択)
If 操作パネル.ComboBox1.Value = "" Then
.Cells.Font.Name = "MS Pゴシック"
Else
.Cells.Font.Name = 操作パネル.ComboBox1.Value
End If
End With
Next a
・・・・・
「品名欄」と「顧客名」のフォントサイズを変更できるようにします。
・・・・・
'品名のフォント
Fsa = Val(操作パネル.品名F.Value)
If Fsa = Null Or Fsa = "" Then
Fsa = 10
Else
.Range(Cells(14, 2), Cells(KeRow, 2)) _
.Font.Size = Fsa
End If
'顧客名のフォント
Fsb = Val(操作パネル.顧客F.Value)
If Fsb = Null Or Fsb = "" Then
Fsb = 13
Else
.Range("B6").Font.Size = Fsb
End If
・・・・・
ユーザーフォームのフォント入力欄が空白の場合は、
- 品名のフォントは10
- 顧客名のフォントは13
に、デフォルト設定しています。
「顧客番号」が入力されていない場合は、帳票作成を取りやめるか、相手先空欄のままで作成するかを選択します。
Option Explicit
Sub テンプレ作成1()
Worksheets("宛名の登録").Select
Range("A:B").NumberFormatLocal = "0_ "
Call Module1.テンプレ作成2
Call Module2.帳票作成
Worksheets("請求書").Select
Range("A1").Select
End Sub
「帳票印刷」ボタンをクリックすると、Module3.印刷設定 プロシージャーが呼び出されます。
作成した帳票の印刷設定はVBAで自動化できる印刷時自動保存のチェックボックスがチェックされた時の設定を行います。
チェックボックスがONの場合は、帳票印刷ボタンで、自動で保存まで行います。
逆に、チェックボックスONの時には、「帳票保存」ボタンは操作無効になります。
「印刷設定」プロシージャーの最下段に記述します。
チェックボックスがクリックされていた時には、Module4.伝票保存 プロシージャーを呼び出し実行します。
・・・・・
'自動保存設定
If 操作パネル.CheckBox3 = True Then
Call Module4.伝票保存
End If
End Sub
「帳票保存」ボタンをクリックすると、Module4.伝票保存 プロシージャーが呼び出されます。
「印刷時自動保存」チェックボックスがONの場合は操作無効になります。
作成帳票の保存は、必要個所をマクロなしエクセルブックで今開いているシートを初期表示状態にクリアします。
本当に初期状態に戻すかを確認するメッセージが表示されるようにしています。
「作業シート」「宛名の登録」「電子印鑑の登録」をクリアーするときは、タイトル行、列の再設置を行います。
Sub Clearする()
Dim Answ As Long
ThisWorkbook.Activate
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
If ActiveSheet.Name = "作業シート" Then
Call Module5.作業シート再構成
ElseIf ActiveSheet.Name = "宛名の登録" Then
Call Module5.宛名の登録再構成
ElseIf ActiveSheet.Name = "電子印鑑の登録" Then
Call Module5.電子印鑑の登録再構成
End If
Else
Exit Sub
End If
ActiveSheet.Range("A1").Select
End Sub
Sub 作業シート再構成()
With ThisWorkbook.Worksheets("作業シート")
With .Range("A1")
.Value = "通番"
.ColumnWidth = 4.75
.RowHeight = 24
End With
With .Range("B1")
.Value = "品名"
.ColumnWidth = 69.13
End With
With .Range("C1")
.Value = "数量"
.ColumnWidth = 8.38
End With
With .Range("D1")
.Value = "単位"
.ColumnWidth = 8.38
End With
With .Range("E1")
.Value = "単価"
.ColumnWidth = 8.38
End With
With .Range("F1")
.Value = "金額"
.ColumnWidth = 8.38
End With
With .Range("G1")
.Value = "備考"
.ColumnWidth = 8.38
End With
End With
End Sub
Sub 宛名の登録再構成()
With ThisWorkbook.Worksheets("宛名の登録")
With .Range("A1")
.Value = "NO"
.ColumnWidth = 8.38
.RowHeight = 24
End With
With .Range("B1")
.Value = "顧客番号"
.ColumnWidth = 8.38
End With
With .Range("C1")
.Value = "宛名"
.ColumnWidth = 73.13
End With
With .Range("D1")
.Value = "郵便番号"
.ColumnWidth = 8.38
End With
With .Range("E1")
.Value = "住所"
.ColumnWidth = 30.63
End With
End With
End Sub
Sub 電子印鑑の登録再構成()
With ThisWorkbook.Worksheets("電子印鑑の登録")
.Rows("1:12").RowHeight = 24
.Columns(1).ColumnWidth = 8.38
.Columns(2).ColumnWidth = 44.38
.Range("A1:A13, B1").Interior.ColorIndex = 15
With Range("A1:B13")
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlHairline
.BorderAround LineStyle:=xlContinuous, _
Weight:=xlThin
End With
With .Range("A1")
.Value = "項目"
End With
With .Range("B1")
.Value = "内容"
End With
With .Range("A2")
.Value = "自社名"
End With
With .Range("A3")
.Value = "代表者名"
End With
With .Range("A5")
.Value = "郵便番号"
End With
With .Range("A6")
.Value = "住所"
End With
With .Range("A7")
.Value = "電話番号"
End With
With .Range("A8")
.Value = "FAX番号"
End With
With .Range("A9")
.Value = "メール"
End With
With .Range("A11")
.Value = "振込銀行"
End With
With .Range("A13")
.Value = "社印"
.RowHeight = 70.54
End With
End With
End Sub
ユーザーフォームを表示するスイッチ
ユーザーフォームを表示するためにイベントコードを使ってスイッチとします。
この「見納請3点伝票作成.xlsm」が開かれた時と、「作業シート」がアクティブになった時に、ユーザーフォームが表示されるようにしています。
このブックモジュールにユーザーフォームの表示スイッチコードを記述します。
Option Explicit
Private Sub Workbook_Open()
操作パネル.Show vbModeless
End Sub
作業シートのシートモジュールにユーザーフォームの表示スイッチコードを記述します。
作業シートがアクティブになった時にユーザーフォームが表示されていない場合に表示処理をするというコードになります。
Option Explicit
Private Sub Worksheet_Activate()
If 操作パネル.Visible = False Then
操作パネル.Show vbModeless
End If
End Sub
実用的なユーザーフォーム作成のまとめ
ユーザーフォームは、基本的にデータ入力装置であってプログラム起動装置です。
ですので、各モジュールのVBAコードとの連携無くしては、全く機能することはありません。
ユーザーモジュールを幾ら時間をかけて研究しても、それのみで動くことはないのです。
一方、モジュールのVBAコードも、ユーザーフォームから呼び出される仕組みのコードや
入力データに応答するコードを仕込まないと反応することもありません。
この記事でご覧いただけましたように、
- ベースとなる各モジュールにVBAコードをまず組み立てて、
- その後、コントロールを設置したユーザーフォームを作成して、
- そして、そのコントロールとモジュールのVBAをつなぐVBAコードを組み立てて接続する。
のが分かりやすいと思います。
その時に参考になるのが
教科書的な解説書よりは ”実際に使っているVBAコードを持った具体的事例”になるわけです。
「販売帳票(見積書、納品書、請求書)を作成するエクセルソフト」はここまでで一応完了になります。 が、
更に利便性を高めるために、自店で使っている日々の販売売上管理ソフト「販売王」と、データ連携を図れるように付加機能を付けることが出来ます。
「販売王」を利用していない会社やお店は直接的には使えませんが、次回はそのオプション機能の解説記事を紹介します。
販売管理ソフトを探している会社やお店は、この記事を是非参考にしてみてください。
次の記事に進むにはこちら↓から
販売王のデータ出力を利用。見積納品請求3点帳票をVBA作成電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)
学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。