封筒宛名印刷ソフトを作っています。今回は、UIとしてユーザーフォームを設置します。
基本的な操作部部分となるコントロールの配置と関連のVBAコードの作成です。
こんにちは、じゅんぱ店長(@junpa33)です。
封筒宛名印刷エクセルソフトの組み立て方を、これから何回かに分けて説明を行っていきます。
今回は、基本操作部分についての説明です。
本題に入るまでに、エクセルBOOKの準備をしておきます。
新しくエクセルを起動して、そのエクセルBOOKを「封筒宛名印字.xlsm」として一度保存をしてください。
「マクロ有効ブック」で保存は必須です。これで、下準備OKです。
その前に、前回の記事を確認してみるにはこちら↓からになります。

封筒宛名印刷の記事編成
- 封筒宛名印刷の使い方とダウンロード
コンテンツ
封筒宛名を印刷するVBAの全体計画

封筒宛名印刷について、考えられる主だった条件設定
- 封筒のサイズ
- 縦書きか横書きか
- 発送便の種別
- 宛先の印刷
- 宛先の連続印刷
- 差出人の印刷
- 書体の設定
- 宛先の入力
- 差出人の入力
- 既存住所録の利用
- プリンターとの封筒サイズセッティング
- 各封筒別の宛先項目、差出項目の印刷位置セッティング
などが考えられます。
余りにもな項目が多く変数だらけになりそうで、作る前から萎えてしまいそうになります。
そこでまず、場面分けをします。
- 封筒サイズなど、印刷にかかわる前提条件・基本操作部分
- 宛先の登録・リスト追加にかかわる条件・新規登録
- 宛先の封筒への一枚印刷を行う条件・単独印刷
- 複数の宛先を連続して封筒に印刷する条件・連続印刷
- 差出人を登録し・印刷する条件・差出人項目
インターフェイス的にはVBAのユーザーフォームで行います。
これだけの条件設定で項目指定して行くためには、一覧表的に表示するとユーザーフォームが大型で雑多になってしまいますので、使わない部分は出来るだけ折りたたんでしまう事が重要だと思います。
また、
作成する上で特に重要なことは「封筒の種類をどれだけにするか?」ということです。
2~3種類まで選べるものは他にもいろいろあるかと思います。しかしそれでは汎用的に使えるとまでは言えません。
今回、作成するエクセルソフトは、最初に封筒用紙の設定さえ行えばOKの多場面での多用途のものを考えていますので、
あえてサイズほぼ網羅の16種類のタイプでコードを組み立てたいと思います。
エクセルBOOK「封筒宛名印字.xlsm」の中のWorksheetsを「宛名リスト」、「差出名リスト」、「宛先」、「差出」という名前で作成しておきます。
このエクセルソフト完成品をフリーダウンロードするにはこちら↓の記事からです。

ユーザーフォームの設置と関連するVBA

「封筒宛名印刷コントロール」ユーザーフォーム
「封筒宛名印刷コントロール」のフォームの中でこの部分になります。

ユーザーフォームへのコントロールツールの配置
始めのユーザーフォームの挿入方法はこちら↓で確認できます。

次にツールボックスを利用してコマンドツールを設置する方法はこちら↓です。
このユーザーフォーム「封筒宛名印刷コントロール」の出現表示設定については、このエクセルソフトのどの操作場面でも必要になりますので、
すべてのシートモジュールとブックモジュールに以下のコードを記述しておきます。
Option Explicit
Private Sub Worksheet_Activate()
If 宛名印刷設定.Visible Then Exit Sub
宛名印刷設定.Show vbModeless
End Sub
Option Explicit
Private Sub Workbook_Open()
If 宛名印刷設定.Visible Then Exit Sub
宛名印刷設定.Show vbModeless
End Sub
ユーザーフォームを設置したらプロパティのオブジェクト名「宛名印刷設定」とCaption「宛名印刷設定」を変更します。
StartUpPositionは「0-手動」にしています。

矢印の部分に(ツールボックスからの)ラベルで文字を挿入します。
赤矢印についてはCaptionの文字表示を変化させます。オブジェクト名についても判別しやすい名称にします。

この矢印の部分になります。

緑矢印の部分です。先にツールボックスで「フレーム」を選択し「封筒宛名印刷コントロール」ユーザーフォームに設置します
先に配置したフレーム内(緑部分)にオプションボタンを配置します。
フレーム内にあるオプションボタンは同じグループ扱いになります。
封筒名の上からの並び順にボタン番号が並ぶのがきれいですが、このソフトの作成計画中の途中変更などで実際にはうまく順番には並んでいません。ここでは、3つの例示をします。すべて同様でOKです。
赤矢印の部分です。
コマンドボタンは青矢印、テキストボックスは赤矢印、コンボボックスは緑矢印です。

フォームモジュールへの各コントロールのコード記述
①TP_no 、②サイズ表示A 、③用紙注意書き のCaption(ラベルの表示)については、オプションボタンの操作に連動して表示するようにします。
- 「ラベル①TP_no」の値はこのソフトのすべてのモジュールに適用される重要なデータになります。
- Module1に記述された「オプションボタン設定」プロシージャーを呼び出します。
オプションボタン1の動作コードはこのようになります。
Private Sub OptionButton1_Click()
'洋形2号
OPB = ""
OPB = 宛名印刷設定.OptionButton1.Caption
宛名印刷設定.TP_no.Caption = "TP1"
Call Module1.オプションボタン設定
End Sub

「便名を印刷に反映」のコードは、モジュール1のプロシージャー「発送便記入」を呼び出します。
Private Sub 便名反映_Click()
Call Module1.発送便記入
End Sub
「発送便名クリア」のコードは、テキストボックスの値を空白にして、モジュール1のプロシージャー「発送便CL」を呼び出します。
Private Sub 発送便クリア_Click()
宛名印刷設定.発送便.Value = ""
Call Module1.発送便CL
End Sub
「宛先シート全クリアー」のコードは、モジュール1のプロシージャー「シートクリア宛先」を呼び出します。
Private Sub 宛先CL_Click()
Call Module1.シートクリア宛先
End Sub
「差出シート全クリアー」のコードは、モジュール1のプロシージャー「シートクリア差出」を呼び出します。
Private Sub 差出CL_Click()
Call Module1.シートクリア差出
End Sub
「封筒登録OFF」のコードは、
- ボタンを押すと表示が「ON」に変わり「プリンター登録封筒」ユーザーフォームが表示されます。
- ボタンを戻すと表示が「OFF」に変わり「プリンター登録封筒」ユーザーフォームが消えます。
Private Sub 封筒登録_Click()
If 宛名印刷設定.封筒登録 = True Then
プリンター登録封筒.Show vbModeless
宛名印刷設定.封筒登録.Caption = "封筒登録ON"
宛名印刷設定.封筒登録.BackColor = &H808080
ElseIf 宛名印刷設定.封筒登録 = False Then
Unload プリンター登録封筒
宛名印刷設定.封筒登録.Caption = "封筒登録OFF"
宛名印刷設定.封筒登録.BackColor = &HE0E0E0
End If
End Sub
Module1に記述のプロシージャーでデータを拾います。
このモジュールシートから記入することはありません。
プルダウンリストで表示されるデータ項目(アイテム)を指定するコードを作成します。
ここで文字フォントを設定していますが、無用なエラーを避けるため、カスタマイズする時(新たなフォントを設定する時)は
こちらで「.AddItem」を増やしてください。(Module1の関連のコードも変更することを忘れずに。)
Private Sub UserForm_Initialize()
OptionButton1.Value = True
With ComboBox1
.AddItem "MS Pゴシック"
.AddItem "MS P明朝"
.AddItem "AR P隷書体M"
.AddItem "メイリオ"
.AddItem "游ゴシック"
.AddItem ""
End With
End Sub
入れ子ユーザーフォームの作成

トグルボタン「封筒登録OFF」を「ON」にしたときに「プリンター登録封筒」ユーザーフォームが表示されるようにします。

「プリンター登録封筒」ユーザーフォーム
このようになります。

オブジェクト名 プリンター登録封筒
Caption プリンター登録封筒
コントロールツールの配置
ラベルは青矢印、テキストボックスは赤矢印になります。

「A6用紙」まで18セット順番に、同様に設定配置していきます。
その他の文字・文章はラベルを使って配置してください。
コマンドボタンは青矢印、チェックボックスは緑矢印となります。

入れ子フォームモジュールへの各コントロールのコード記述
プリンター登録封筒ユーザーフォームモジュールへのVBA記述を行います。
こちらのフォームモジュールからのコントロールではなく、モジュール3のプロシージャーからの操作になります。
「封筒サイズ更新」のコードは、モジュール3のプロシージャ「封筒コード登録」を呼び出します。
Option Explicit
Private Sub 封筒サイズ更新_Click()
Call Module3.封筒コード登録
End Sub
- 「プリンター登録封筒」フォームを消します。
- 「封筒宛名印刷コントロール」の「封筒登録」トグルボタンを「OFF」に戻します。
- 「データ」シートをアンビジブルにします。
Private Sub フォーム終了_Click()
Unload プリンター登録封筒
宛名印刷設定.封筒登録 = False
宛名印刷設定.封筒登録.Caption = "封筒登録OFF"
宛名印刷設定.封筒登録.BackColor = &HE0E0E0
Worksheets("データ").Visible = False
End Sub
「定数値確認」のコードは、モジュール1のプロシージャ「設定用定数値」を呼び出します。
Private Sub 定数値確認_Click()
Call Module3.設定用定数値
End Sub
- ボタンを押したときに、表示を「ON」に変更します。
- 「データ」シートを表示し、登録状況を確認できるようにします。
- ボタンを戻したときはその逆になるようにします。
Private Sub データシート表示_Click()
If プリンター登録封筒.データシート表示 = True Then
プリンター登録封筒.データシート表示.Caption = _
"データシート表示ON"
プリンター登録封筒.データシート表示.BackColor = &H808080
With Worksheets("データ")
.Visible = True
.Select
End With
ElseIf プリンター登録封筒.データシート表示 = False Then
プリンター登録封筒.データシート表示.Caption = _
"データシート表示OFF"
プリンター登録封筒.データシート表示.BackColor = &HE0E0E0
Worksheets("データ").Visible = False
Worksheets("宛名リスト").Select
End If
End Sub
関連するVBAをModule1に記述

「封筒宛名印刷コントロール」フォーム中のコントロールから
最初に、モジュールを通して共通の変数の宣言として、先頭に以下のコードを記述します。

Option Explicit
Public STY As Variant
Public TPnU, TPnL, TPnM, TPnRo As Double
Public aR As Long, J As Long
Public aN, aKei, aSho, aYB, aK, aSK, aB, aBM, aRe As Variant
Public OPB As String
モジュール1「発送便記入」を呼び出します。
ラベル「TP_no」のCaptionの値に対して条件分岐をさせています。
封筒のタイプによって、「宛先」シートのレイアウトが変化しますので、発送便名表示位置が変化するからです。


Sub 発送便記入()
STY = 宛名印刷設定.TP_no.Caption
If STY = "TP3" And 宛名印刷設定.横書き1.Value = False Then
Call Module1.サブ項目1発送便記入
ElseIf STY = "TP1" And 宛名印刷設定.横書き2.Value = False Then
Call Module1.サブ項目1発送便記入
ElseIf STY = "TP1" And 宛名印刷設定.横書き3.Value = False Then
Call Module1.サブ項目1発送便記入
ElseIf STY = "TP2" Or STY = "TP6" Then
Call Module1.サブ項目1発送便記入
Else
Call Module1.サブ項目2発送便記入
End If
End Sub
このプロシージャーのサブとなるプロシージャが2つあります。


Sub サブ項目1発送便記入()
Worksheets("宛先").Range("E1:H1").MergeCells = True
With Worksheets("宛先").Range("E1")
.Value = 宛名印刷設定.発送便.Value
.Font.Bold = True
.Font.Color = RGB(255, 0, 0)
.Orientation = xlHorizontal
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlTop
End With
End Sub
Sub サブ項目2発送便記入()
With Worksheets("宛先")
.Range("C1:D1").MergeCells = True
.Range("C1").Value = 宛名印刷設定.発送便.Value
.Range("C1").Font.Color = RGB(255, 0, 0)
End With
End Sub

モジュール1「発送便CL」を呼び出します。
Sub 発送便CL()
Worksheets("宛先").Range("E1") = ""
Worksheets("宛先").Range("C1") = ""
End Sub
モジュール1「シートクリア宛先」を呼び出します。シートを全くのデフォルト状態に戻します。
Sub シートクリア宛先()
With Worksheets("宛先")
.Cells.ClearFormats
.Cells.ClearContents
.Cells.UseStandardHeight = True
.Cells.UseStandardWidth = True
End With
End Sub
モジュール1「シートクリア差出」を呼び出します。シートを全くのデフォルト状態に戻します。
Sub シートクリア差出()
With Worksheets("差出")
.Cells.ClearFormats
.Cells.ClearContents
.Cells.UseStandardHeight = True
.Cells.UseStandardWidth = True
End With
End Sub
コンボボックスで指定された文字フォントに切り替える設定のコードを記述します。
Sub フォント設定()
Worksheets("宛先").Select
Cells.Select
If 宛名印刷設定.ComboBox1.Value = "" Then
宛名印刷設定.ComboBox1.Value = "MS Pゴシック"
End If
Selection.Font.Name = 宛名印刷設定.ComboBox1.Value
End Sub
- ラベルへの表示をコントロールします。
- プリンターの用紙確認の注意喚起のラベル表示についてはWait関数でタイムラグを作って表示します。
- オプションボタンのキャプション名によってデータシート中の「用紙の定数値」を検索します。
- このボタンのスイッチングで「印刷のレイアウトシート(「宛先」と「差出」)」の用紙設定を変更・指定を行います。
Sub オプションボタン設定()
Dim MR As Long
宛名印刷設定.サイズ表示A.Caption = OPB
Worksheets("宛先").PageSetup.PaperSize = xlPaperA4
Worksheets("差出").PageSetup.PaperSize = xlPaperA4
宛名印刷設定.プリンター注意.Caption = ""
宛名印刷設定.用紙注意書き.Caption = ""
Application.Wait Now() + TimeValue("00:00:01")
宛名印刷設定.用紙注意書き.Caption = _
"先ず、プリンターの用紙設定をしてください。"
On Error Resume Next
MR = WorksheetFunction.Match(OPB, Worksheets("データ") _
.Range("A1:A21"), 0)
If Worksheets("データ").Cells(MR, 3).Value = "" Then
Worksheets("宛先").PageSetup.PaperSize = xlPaperA4
Worksheets("差出").PageSetup.PaperSize = xlPaperA4
Else
With Worksheets("データ")
Worksheets("宛先").PageSetup.PaperSize = _
.Cells(MR, 3).Value
Worksheets("差出").PageSetup.PaperSize = _
.Cells(MR, 3).Value
End With
End If
End Sub
子フォーム「プリンター登録封筒」中のコントロールから
こちらの2つのVBAコードはModule3に記述しています。
チェックボックス「空欄データも登録する」がチェックされているかどうかの条件分岐を行っています。
Gotoの使い方については、

が参考記事になります。
Sub 封筒コード登録()
Dim x As Long
Worksheets("データ").Visible = True
Worksheets("データ").Select
For x = 1 To 18
If プリンター登録封筒.CheckBox1.Value = False Then
If プリンター登録封筒.Controls("コード" & x) _
.Value = "" Then
GoTo step2
Else
Range("C" & x + 3).Value = プリンター登録封筒 _
.Controls("コード" & x).Value
End If
step2:
Else
Range("C" & x + 3).Value = プリンター登録封筒 _
.Controls("コード" & x).Value
End If
Next x
End Sub
メッセージボックスで「定数値」を表示できるようにしています。
メッセージボックスの使い方は、

をご覧ください。
Sub 設定用定数値()
Worksheets("宛先").Select
MsgBox "用紙設定 定数値は 「 " & Worksheets("宛先").PageSetup. _
PaperSize & " 」 です。", vbOKOnly, "封筒宛名印刷"
End Sub
ユーザーフォームの基本設定まとめ

お疲れさまでした。
ここまで、コントロールパネルとなるユーザーフォームのベースを作ってきました。
VBAコード文字数としては、ここが一番多くなっています。
結構、いろんな種類のコントロールも利用しましたが、もっと良い使い方があればそれぞれに試してみてください。
ユーザーフォームも配置や配色のデザインは自由ですので、またオリジナルもお考え下さい。



電子書籍版「改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)2,508円(本体2,280円+税)
30冊を超えるExcelのマクロやVBAの解説書を執筆してきた著者による考え抜かれた本書の内容と構成。
独創的な解説手法で必ずExcel VBAが理解できます!
初級からの参考書ですが、より実践的切り口での解説をしています。
QRコードから操作の流れを動画(無音です)で確認することもできるようになりました。
文章解説と動画との関係性は、主は文章での解説、サポートが動画になります。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
Private Sub OptionButton1_Click()
'洋形2号
OPB = ""
OPB = 宛名印刷設定.OptionButton1.Caption
宛名印刷設定.TP_no.Caption = "TP1"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton2_Click()
'洋形3号
OPB = ""
OPB = 宛名印刷設定.OptionButton2.Caption
宛名印刷設定.TP_no.Caption = "TP1"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton3_Click()
'洋形4号
OPB = ""
OPB = 宛名印刷設定.OptionButton3.Caption
宛名印刷設定.TP_no.Caption = "TP2"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton4_Click()
'洋長形3号
OPB = ""
OPB = 宛名印刷設定.OptionButton4.Caption
宛名印刷設定.TP_no.Caption = "TP3"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton13_Click()
'長形1号
OPB = ""
OPB = 宛名印刷設定.OptionButton13.Caption
宛名印刷設定.TP_no.Caption = "TP4"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton14_Click()
'長形2号
OPB = ""
OPB = 宛名印刷設定.OptionButton14.Caption
宛名印刷設定.TP_no.Caption = "TP5"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton5_Click()
'長形3号
OPB = ""
OPB = 宛名印刷設定.OptionButton5.Caption
宛名印刷設定.TP_no.Caption = "TP3"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton15_Click()
'長形4号
OPB = ""
OPB = 宛名印刷設定.OptionButton15.Caption
宛名印刷設定.TP_no.Caption = "TP6"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton6_Click()
'長形40号
OPB = ""
OPB = 宛名印刷設定.OptionButton6.Caption
宛名印刷設定.TP_no.Caption = "TP6"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton10_Click()
'角型1号
OPB = ""
OPB = 宛名印刷設定.OptionButton10.Caption
宛名印刷設定.TP_no.Caption = "TP7"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton9_Click()
'角型2号
OPB = ""
OPB = 宛名印刷設定.OptionButton9.Caption
宛名印刷設定.TP_no.Caption = "TP7"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton8_Click()
'角型3号
OPB = ""
OPB = 宛名印刷設定.OptionButton18.Caption
宛名印刷設定.TP_no.Caption = "TP8"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton16_Click()
'角型4号
OPB = ""
OPB = 宛名印刷設定.OptionButton16.Caption
宛名印刷設定.TP_no.Caption = "TP8"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton17_Click()
'角型5号
OPB = ""
OPB = 宛名印刷設定.OptionButton17.Caption
宛名印刷設定.TP_no.Caption = "TP9"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton18_Click()
'角型6号
OPB = ""
OPB = 宛名印刷設定.OptionButton18.Caption
宛名印刷設定.TP_no.Caption = "TP10"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton7_Click()
'角型8号
OPB = ""
OPB = 宛名印刷設定.OptionButton7.Caption
宛名印刷設定.TP_no.Caption = "TP5"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton11_Click()
'郵便はがき
OPB = ""
OPB = 宛名印刷設定.OptionButton11.Caption
宛名印刷設定.TP_no.Caption = "TP1"
Call Module1.オプションボタン設定
End Sub
Private Sub OptionButton12_Click()
'A6用紙
OPB = ""
OPB = 宛名印刷設定.OptionButton12.Caption
宛名印刷設定.TP_no.Caption = "TP1"
Call Module1.オプションボタン設定
End Sub