Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


61954 / 76738 ←次へ | 前へ→

【19395】Re:2577がらみの追加質問 その3
発言  ichinose  - 04/10/30(土) 16:11 -

引用なし
パスワード
   ▼ととりん さん:
こんにちは。
>
>前の表にさらに項目を追加し、次のように変更しました。
>  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(指定されたセル範囲を指定されたコンボボックスのメンバとして、設定する)なんていう二つのプロシジャーに分割しなければ
ならないと思いますが・・・。
これは、ととりん さん、時間が許したなら、考えてみて下さい。

0 hits

【19312】2577がらみの追加質問 ととりん 04/10/28(木) 4:58 質問
【19314】Re:2577がらみの追加質問 ichinose 04/10/28(木) 8:12 発言
【19336】Re:2577がらみの追加質問 ととりん 04/10/28(木) 15:24 お礼
【19346】Re:2577がらみの追加質問 その2 ととりん 04/10/28(木) 18:36 質問
【19353】Re:2577がらみの追加質問 その2 ichinose 04/10/28(木) 22:24 発言
【19354】Re:2577がらみの追加質問 その2 追伸 ichinose 04/10/28(木) 22:31 発言
【19357】Re:2577がらみの追加質問 その2 追伸 ととりん 04/10/28(木) 23:26 お礼
【19387】Re:2577がらみの追加質問 その3 ととりん 04/10/29(金) 23:52 質問
【19395】Re:2577がらみの追加質問 その3 ichinose 04/10/30(土) 16:11 発言
【19401】Re:2577がらみの追加質問 その3 ととりん 04/10/31(日) 11:12 お礼

61954 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free