Windows 10 Pro x64 + Excel2016 x86 VBA で 2個のForm間で連携する(ComboBox -> ListBox)

#目的
メインフォールのコンボで選択した値を元にサブフォームのリストに対応する
データを表示する
普段はデータベースからひらってきたデータを表示することが多いんだけど
最小限必要なコードを張りつけてみる
##作成手順
・UserFormを2個追加する(UserForm6：メイン、UserForm7：サブ)
・UserForm6の上にComboBoxとCommandButtonを1個、TextBoxを4個追加する
・UserForm7の上にListBox、Labelを1個追加する
・UserForm_Initialize で ComboBox1 に初期データを追加する
・ComboBox1でデータを選択する
・CommandButton1をクリックする
・UserForm7.ListBox1に対応するデータが表示される
・UserForm7.ListBox1をダブルクリックすると、選択したデータを
　setCallBackControlで渡された コントロールにセットする
・UserForm6の対応するTextBoxに選択したデータが表示される
・setCallBackControl でI/F を統一する
※UserForm6、UserForm7になるのはワークブックの都合で特に意味はないです
対象データは[郵便番号データダウンロード](http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html)の全国一括(KEN_ALL.CSV)より一部抜粋
##メインフォーム側のコード
```vb
Option Explicit

Private Sub UserForm_Initialize()
'
    Dim varArry()   As Variant
    
    ReDim varArry(3, 2)

    varArry(0, 0) = "01"
    varArry(0, 1) = "北海道"
    varArry(1, 0) = "02"
    varArry(1, 1) = "青森"
    varArry(2, 0) = "03"
    varArry(2, 1) = "岩手"
'
    ComboBox1.Clear
'
    With ComboBox1
        .ColumnCount = 2            '1行に2個表示
        .TextColumn = 2             '2個目のデータを表示
        .BoundColumn = 0            '値として取得する列の設定
        .ColumnWidths = "30, 50"    'カラムの幅
        .List() = varArry()         'リスト項目の設定
    End With
End Sub

Private Sub CommandButton1_Click()
'
    Dim strCode     As String
    Dim strName     As String
'
    strCode = Trim(ComboBox1.Column(0, Me.ComboBox1.ListIndex))
    strName = Trim(ComboBox1.Column(1, Me.ComboBox1.ListIndex))
    '
    '  setCallBackControl(
    '      UserForm7.listboxに表示するデータのキー
    '    , UserForm7.Label1に表示する名前(県名)
    '    , UserForm6.TextBox1
    '    , UserForm6.TextBox2
    '    , UserForm6.TextBox3
    '    , UserForm6.TextBox4
    '  )
    '
    Call UserForm7.setCallBackControl(strCode, strName, TextBox1, TextBox2, TextBox3, TextBox4)
    Call UserForm7.Show
End Sub
```
##サブフォーム側のコード
```vb
Option Explicit

Private outCtrl1 As Control
Private outCtrl2 As Control
Private outCtrl3 As Control
Private outCtrl4 As Control

Private Sub btnExit_Click()
    Unload Me
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'
    If ListBox1.ListIndex > 0 Then
        outCtrl1.Text = NZStr(ListBox1.List(ListBox1.ListIndex, 0))
        outCtrl2.Text = NZStr(ListBox1.List(ListBox1.ListIndex, 1))
        outCtrl3.Text = NZStr(ListBox1.List(ListBox1.ListIndex, 2))
        outCtrl4.Text = NZStr(ListBox1.List(ListBox1.ListIndex, 3))
    Else
        outCtrl1.Text = Space(0)
        outCtrl2.Text = Space(0)
        outCtrl3.Text = Space(0)
        outCtrl4.Text = Space(0)
    End If
'
    Call btnExit_Click
'
End Sub

'=================================================================
' 機 能 : Null, Nothing, Empty は文字列長ゼロに変換する。
'=================================================================
Public Function NZStr(ByVal VarArg As Variant) As String
'
    If VarType(VarArg) = vbObject Then
        NZStr = Space(0)
    ElseIf IsNull(VarArg) Or IsEmpty(VarArg) Then
        NZStr = Space(0)
    Else
        NZStr = Trim(CStr(VarArg))
    End If
'
End Function

'=================================================================
' 機 能 : メインフォームからのパラメータと出力用のTextBox1-4
'=================================================================
Public Sub setCallBackControl(aPrefCode As String, aPrefName As String, _
                                                    ByVal inRetCtrl1 As Control, _
                                                    ByVal inRetCtrl2 As Control, _
                                                    ByVal inRetCtrl3 As Control, _
                                                    ByVal inRetCtrl4 As Control)
    '
    '   引数は Control で宣言する
    '
    Set outCtrl1 = inRetCtrl1
    Set outCtrl2 = inRetCtrl2
    Set outCtrl3 = inRetCtrl3
    Set outCtrl4 = inRetCtrl4
'
    Me.Label1.Caption = aPrefName
'
    Call SetPostal(aPrefCode)
'
End Sub

Private Sub SetPostal(ByRef aPrefCode As String)
'
    ListBox1.Clear
    ListBox1.ColumnWidths = "30 pt;40 pt;70 pt;100 pt"
    ListBox1.ColumnCount = 4
'
    Select Case aPrefCode
    Case "01"
            ListBox1.AddItem ""
            ListBox1.List(0, 0) = "01101"
            ListBox1.List(0, 1) = "0640954"
            ListBox1.List(0, 2) = "札幌市中央区"
            ListBox1.List(0, 3) = "宮の森四条"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "01102"
            ListBox1.List(1, 1) = "0028071"
            ListBox1.List(1, 2) = "札幌市北区"
            ListBox1.List(1, 3) = "あいの里一条"
    Case "02"
            ListBox1.AddItem ""
            ListBox1.List(0, 0) = "02201"
            ListBox1.List(0, 1) = "0301271"
            ListBox1.List(0, 2) = "青森市"
            ListBox1.List(0, 3) = "六枚橋"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "02202"
            ListBox1.List(1, 1) = "0361516"
            ListBox1.List(1, 2) = "弘前市"
            ListBox1.List(1, 3) = "藍内"
     Case "03"
            ListBox1.AddItem ""
            ListBox1.List(0, 0) = "03201"
            ListBox1.List(0, 1) = "0200886"
            ListBox1.List(0, 2) = "盛岡市"
            ListBox1.List(0, 3) = "若園町"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "03202"
            ListBox1.List(1, 1) = "0270202"
            ListBox1.List(1, 2) = "宮古市"
            ListBox1.List(1, 3) = "赤前"
    End Select
End Sub
```
##参考にしたのは以下のサイト
[VarType の定数](https://msdn.microsoft.com/ja-jp/VBA/language-reference-vba/articles/vartype-constants)