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 ExplicitPrivate 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 SubPrivate 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 ExplicitPrivate outCtrl1 As Control
Private outCtrl2 As Control
Private outCtrl3 As Control
Private outCtrl4 As ControlPrivate Sub btnExit_Click()
Unload Me
End SubPrivate 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 SubPrivate 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