|
▼ととりん さん:
こんにちは。
>
>前の表にさらに項目を追加し、次のように変更しました。
> A B C D
>1 東京都 渋谷区 1丁目 番地
>2 東京都 世田谷区 2丁目 マンション名
>3 東京都 新宿区 3丁目 号室
>4 東京都 4丁目
>5 東京都 5丁目
>6 東京都 6丁目
>7 茨城県 つくば市 1丁目 マンション名
>8 茨城県 水戸市 2丁目 号室
>9 茨城県 ひたちなか市
> . . .
> . . .
> . . .
>
>
>コンボボックスの下に、3つのテキストボックスを配置します。
>ラベルは、ラベル4、ラベル5、ラベル6、テキストボックスはテキストボックス4
>テキストボックス5、テキストボックス6とします。
取り合えず、以下のように変更して下さい。
set_combo_itemというプロシジャーをちょっと変更します。
後述しますが、本来なら私は、ちょっと不満・・・。
'==============================================================
Function set_combo_item(func_str, wk_col As Long, Optional cmb As MSForms.ComboBox = Nothing) As Range
'input: cmb データをセットするコンボボックス
'input: func_str データ抽出のための関数式
'input: wk_col:作業列として使用する列NO
'output:set_combo_item func_strの数式とwk_colの列NOによって得られるセル範囲
Dim rng As Range
Dim rng2 As Range
Dim rng3 As Range
Set set_combo_item = Nothing
With ThisWorkbook.Worksheets(1)
Set rng = .Range("a1", .Range("a65536").End(xlUp))
End With
rng.Offset(0, wk_col).Formula = func_str
rng.Offset(0, wk_col) = rng.Offset(0, wk_col).Value
On Error Resume Next
Set rng2 = rng.Offset(0, wk_col).SpecialCells(xlCellTypeConstants)
If Err.Number = 0 Then
Set set_combo_item = rng2
End If
If Not cmd Is Nothing Then
cmb.Clear
For Each rng3 In rng2
cmb.AddItem rng3.Value
Next
cmb.ListIndex = 0
End If
rng2.Value = ""
Set rng = Nothing
Set rng2 = Nothing
Set rng3 = Nothing
End Function
'↑インターフェースを変えたので以下に例もありますから、記述していない箇所も
'変更して下さい。
'===============================================================
Private Sub ComboBox1_Change()
Dim func_str As String
Dim StrLabel As String
Dim ansrng As Range
Dim myarray() As String
func_str = "=if(a1=""" & ComboBox1.Text & _
""",if(b1="""","" "",b1),"""")"
Call set_combo_item(func_str, 4, ComboBox2)
func_str = "=if(a1=""" & ComboBox1.Text & _
""",if(c1="""","" "",c1),"""")"
Call set_combo_item(func_str, 4, ComboBox3)
func_str = "=if(a1=""" & ComboBox1.Text & _
""",if(d1="""","" "",d1),"""")"
Set ansrng = set_combo_item(func_str, 4)
If Not ansrng Is Nothing Then
ReDim myarray(1 To ansrng.Count)
idx = 1
For Each rng In ansrng
myarray(idx) = rng.Offset(0, -1).Value
idx = idx + 1
Next
For idx = 4 To 6
Controls("label" & idx).Caption = _
myarray(idx - 3)
Next
End If
End Sub
これで、動く事は動きます・・・。
気に入らないのは、set_combo_itemの中のコード・・・・。
当初は、条件に沿ったコンボボックスのメンバ設定を行うプロシジャーでしたが、
func_str = "=if(a1=""" & ComboBox1.Text & _
""",if(d1="""","" "",d1),"""")"
Set ansrng = set_combo_item(func_str, 4)
と言うコードで条件に合ったセル範囲を取得するという目的で呼び出しています。
これでは、もはや、set_combo_itemというプロシジャー名ではおかしいですよね?
本来なら、このプロシジャーをget_rng(数式の条件に合ったセル範囲を取得する)などと言うプロシジャーとSet_Combo_Item(指定されたセル範囲を指定されたコンボボックスのメンバとして、設定する)なんていう二つのプロシジャーに分割しなければ
ならないと思いますが・・・。
これは、ととりん さん、時間が許したなら、考えてみて下さい。
|
|