Windows 10 Pro_x64 + Excel2013_x86 VBA で 2個のFrom間で連携する(ComboBox -> ListBox)

Windows 10 Pro_x64 + Excel2013_x86 VBA で 2個のFrom間で連携する(ComboBox -> ListBox)
 
メインフォールのコンボで選択した値を元にサブフォームのリストに対応する
データを表示する
普段はデータベースからひらってきたデータを表示することが多いんだけど
最小限必要なコードを張りつけてみる
 
・UserFormを2個追加する(UserForm1:メイン、UserForm2:サブ)
・UserForm1の上にComboBoxとCommandButtonを1個、TextBoxを4個追加する
・UserForm2の上にListBox、Labelを1個追加する
・UserForm_Initialize で ComboBox1 に初期データを追加する
・ComboBox1でデータを選択する
・CommandButton1をクリックする
・UserForm2.ListBox1に対応するデータが表示される
・UserForm2.ListBox1をダブルクリックすると、選択したデータを
 setCallBackControlで渡された コントロールにセットする
・UserForm1の対応するTextBoxに選択したデータが表示される
・setCallBackControl でI/F を統一する
 
対象データは以下の全国一括(KEN_ALL.CSV)より一部抜粋
郵便番号データダウンロード
参考にしたのは以下のサイト
VarType の定数
 
メインフォーム側のコード


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(
' UserForm2.listboxに表示するデータのキー
' , UserForm2.Label1に表示する名前(県名)
' , UserForm1.TextBox1
' , UserForm1.TextBox2
' , UserForm1.TextBox3
' , UserForm1.TextBox4
' )
'
Call UserForm2.setCallBackControl(strCode, strName, TextBox1, TextBox2, TextBox3, TextBox4)
Call UserForm2.Show
End Sub

サブフォーム側のコード

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