Excel VBA質問箱 IV

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

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


10885 / 13646 ツリー ←次へ | 前へ→

【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 お礼[未読]

【19312】2577がらみの追加質問
質問  ととりん  - 04/10/28(木) 4:58 -

引用なし
パスワード
   はじめまして、ExcelのVBA初心者です。
質問2577「コンボボックスで選択、そしてまた次のコンボボックスで選択」で私がしたいことの半分はできたのですが、残りができないので教えてください。

まず、2577の内容から...
   A       B
1  東京都  渋谷区
2  東京都  新宿区
3  東京都  港区
4  茨城県  水戸市 
5  茨城県  つくば市
6  茨城県  ひたちなか市      
.   .    .
.   .    .
.   .    .

ユーザーフォームを作り、そこにコンボボックス1、
コンボボックス2を作ります。
コンボボックス1で都道府県名を選択し、
コンボボックス2で、1で選択した都道府県の「区市郡」
を選択できるようにするにはどうしたらよいのでしょう。

というのが質問内容でした。
そして、ichinoseさんの返信で

A列が全て空白だった場合のエラー処理をしていませんが、
A列の重複なしのデータを取り出すのにC列をワークで使いました。
他の列が都合がよければ変更してください。
当該フォームモジュールに・・・
'===============================================================
Sub set_combo_item(cmb As MSForms.ComboBox, func_str As String)
'input: cmb データをセットするコンボボックス
'input: func_str データ抽出のための関数式
  Dim rng As Range
  Dim rng2 As Range
  Dim rng3 As Range
  With ThisWorkbook.Worksheets(1)
   Set rng = .Range("a1", .Range("a65536").End(xlUp))
   End With
  rng.Offset(0, 2).Formula = func_str
  rng.Offset(0, 2) = rng.Offset(0, 2).Value
  Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)
  cmb.Clear
  For Each rng3 In rng2
   cmb.AddItem rng3.Value
   Next
  cmb.ListIndex = 0
  rng2.Value = ""
  Set rng = Nothing
  Set rng2 = Nothing
  Set rng3 = Nothing
End Sub
'==============================
Private Sub ComboBox1_Change()
  Dim func_str As String
  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
  Call set_combo_item(ComboBox2, func_str)
End Sub
'==========================================================
Private Sub UserForm_Initialize()
  Dim func_str As String
  func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
  Call set_combo_item(ComboBox1, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
  Call set_combo_item(ComboBox2, func_str)
End Sub

上記で2577の内容はできました。

私が、この続きでしたいことは、
フォームにコマンドボタンを配置し、クリックをするとコンボボックス1と2に表示された内容を、シート2のA列とB列の上から入力をしていきたいのです。
(上からというのは、1行目からデータが入力されているかどうかを検索し、
空白行が見つかったら、その行から入力したいという意味です。)

それを私なりに考え、下記のコードを入力しました。

Private Sub InputBtn_Click()
  '変数の宣言
  Dim CelPos As Integer
  Dim CelNo As String
  
  Set WS = Worksheets(2)

  Do
    CelPos = CelPos + 1
    CelNo = "A" & CelPos
    Rtn = WS.Range(CelNo).Value
  Loop While Rtn <> ""
  
  '空白のセルが見つかったら、テキストボックスのデータを書き込む
  CelNo = "A" & CelPos
  WS.Range(CelNo) = UserForm1.ComboBox1.Text
  UserForm1.ComboBox1.Text = ""
  CelNo = "B" & CelPos
  WS.Range(CelNo) = UserForm1.ComboBox2.Text
  UserForm1.ComboBox2.Text = ""
End Sub

これで実行すると、
ichinoseさんの返信の

  Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)

で引っかかってしまいます。

解決方法がわからずに悩んでいます。
上記内容の補足、修正、または別の解決方法を教えてください。
よろしくお願いいたします。

文章が長くなってしまい申し訳ありません。

【19314】Re:2577がらみの追加質問
発言  ichinose  - 04/10/28(木) 8:12 -

引用なし
パスワード
   ▼ととりん さん:
おはようございます。
出かけなければいけないので、ざっと見た限りですが・・・。

>はじめまして、ExcelのVBA初心者です。
>質問2577「コンボボックスで選択、そしてまた次のコンボボックスで選択」で私がしたいことの半分はできたのですが、残りができないので教えてください。
>
>まず、2577の内容から...
>   A       B
>1  東京都  渋谷区
>2  東京都  新宿区
>3  東京都  港区
>4  茨城県  水戸市 
>5  茨城県  つくば市
>6  茨城県  ひたちなか市      
>.   .    .
>.   .    .
>.   .    .
>
>ユーザーフォームを作り、そこにコンボボックス1、
>コンボボックス2を作ります。
>コンボボックス1で都道府県名を選択し、
>コンボボックス2で、1で選択した都道府県の「区市郡」
>を選択できるようにするにはどうしたらよいのでしょう。
>
>というのが質問内容でした。
>そして、ichinoseさんの返信で
>
>A列が全て空白だった場合のエラー処理をしていませんが、
>A列の重複なしのデータを取り出すのにC列をワークで使いました。
>他の列が都合がよければ変更してください。
>当該フォームモジュールに・・・
>'===============================================================
>Sub set_combo_item(cmb As MSForms.ComboBox, func_str As String)
>'input: cmb データをセットするコンボボックス
>'input: func_str データ抽出のための関数式
>  Dim rng As Range
>  Dim rng2 As Range
>  Dim rng3 As Range
>  With ThisWorkbook.Worksheets(1)
>   Set rng = .Range("a1", .Range("a65536").End(xlUp))
>   End With
>  rng.Offset(0, 2).Formula = func_str
>  rng.Offset(0, 2) = rng.Offset(0, 2).Value
>  Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)
>  cmb.Clear
>  For Each rng3 In rng2
>   cmb.AddItem rng3.Value
>   Next
>  cmb.ListIndex = 0
>  rng2.Value = ""
>  Set rng = Nothing
>  Set rng2 = Nothing
>  Set rng3 = Nothing
>End Sub
>'==============================
>Private Sub ComboBox1_Change()
>  Dim func_str As String
>  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
>  Call set_combo_item(ComboBox2, func_str)
>End Sub
>'==========================================================
>Private Sub UserForm_Initialize()
>  Dim func_str As String
>  func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
>  Call set_combo_item(ComboBox1, func_str)
>  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
>  Call set_combo_item(ComboBox2, func_str)
>End Sub
>
>上記で2577の内容はできました。
>
>私が、この続きでしたいことは、
>フォームにコマンドボタンを配置し、クリックをするとコンボボックス1と2に表示された内容を、シート2のA列とB列の上から入力をしていきたいのです。
>(上からというのは、1行目からデータが入力されているかどうかを検索し、
>空白行が見つかったら、その行から入力したいという意味です。)
>
>それを私なりに考え、下記のコードを入力しました。
>
>Private Sub InputBtn_Click()
>  '変数の宣言
>  Dim CelPos As Integer
>  Dim CelNo As String
>  
>  Set WS = Worksheets(2)
>
>  Do
>    CelPos = CelPos + 1
>    CelNo = "A" & CelPos
>    Rtn = WS.Range(CelNo).Value
>  Loop While Rtn <> ""
>  
>  '空白のセルが見つかったら、テキストボックスのデータを書き込む
>  CelNo = "A" & CelPos
>  WS.Range(CelNo) = UserForm1.ComboBox1.Text
  'UserForm1.ComboBox1.Text = "" ←これ止めて・・・
'     原因は、↑このステートメントですね?
'     コンボックスの内容が変更した時点で
'     ComboBox1_Changeイベントが実行してしまいます。
'     最初にフォームを表示した状態に戻すなら

>  CelNo = "B" & CelPos
>  WS.Range(CelNo) = UserForm1.ComboBox2.Text
  'UserForm1.ComboBox2.Text = "" ' ←これも止めて・・
   ComboBox1.listindex=0
'   ↑このコードを入れて下さい。
'   他のコントロールでもそうですが、
'   Changeイベントを使っているときはそのコントロールをコードで
'   変更するような場合、注意が必要です。
'   場合によっては、フラグを作ってイベントコードを実行するか否かの
'   制御をしなければなりません。
 
> End Sub
>
>これで実行すると、
>ichinoseさんの返信の
>
>  Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)
>
>で引っかかってしまいます。
>
>解決方法がわからずに悩んでいます。
>上記内容の補足、修正、または別の解決方法を教えてください。
>よろしくお願いいたします。
>
>文章が長くなってしまい申し訳ありません。

確認してみて下さい。

【19336】Re:2577がらみの追加質問
お礼  ととりん  - 04/10/28(木) 15:24 -

引用なし
パスワード
   ichinoseさま

早々の返信ありがとうございました。
使用可能になりました。
ありがとうございました。

【19346】Re:2577がらみの追加質問 その2
質問  ととりん  - 04/10/28(木) 18:36 -

引用なし
パスワード
   ichinoseさまに教えていただいたところまでは、理解できたので、
次に進んでいるのですが、
さらに、悩むところが出てきましたので質問させてください。

前の表に追加事項を加え、次の表に変更しました。
  A      B         C  
1 東京都    渋谷区     1丁目
2 東京都    世田谷区    2丁目
3 東京都    新宿区     3丁目
4 東京都            4丁目
5 東京都            5丁目
6 東京都            6丁目
7 茨城県    つくば市    1丁目
8 茨城県    水戸市     2丁目
9 茨城県    ひたちなか市    
  .        .       .
  .        .       .
  .        .       .

そして、フォームにコンボボックス3を配置して
C列のデータを表示させ、コマンドボタンをクリックすると
シート2にデータを書き込むみます。

そのコードは次のとおりです。

Sub set_combo_item(cmb As MSForms.ComboBox, func_str As String)
'input: cmb データをセットするコンボボックス
'input: func_str データ抽出のための関数式
  Dim rng As Range
  Dim rng2 As Range
  Dim rng3 As Range
  With ThisWorkbook.Worksheets(1)
   Set rng = .Range("a1", .Range("a65536").End(xlUp))
   End With
  rng.Offset(0, 3).Formula = func_str
  rng.Offset(0, 3) = rng.Offset(0, 3).Value
  Set rng2 = rng.Offset(0, 3).SpecialCells(xlCellTypeConstants)
  cmb.Clear
  For Each rng3 In rng2
   cmb.AddItem rng3.Value
   Next
  cmb.ListIndex = 0
  rng2.Value = ""
  Set rng = Nothing
  Set rng2 = Nothing
  Set rng3 = Nothing
End Sub

Private Sub ComboBox1_Change()
  Dim func_str As String
  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
  Call set_combo_item(ComboBox2, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & """,c1,"""")"
  Call set_combo_item(ComboBox3, func_str)
End Sub

Private Sub UserForm_Initialize()
  Dim func_str As String
  func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
  Call set_combo_item(ComboBox1, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
  Call set_combo_item(ComboBox2, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & """,c1,"""")"
  Call set_combo_item(ComboBox3, func_str)
End Sub

Private Sub InputBtn_Click()
  '変数の宣言
  Dim CelPos As Integer
  Dim CelNo As String
 
  Set WS = Worksheets(2)

  Do
    CelPos = CelPos + 1
    CelNo = "A" & CelPos
    Rtn = WS.Range(CelNo).Value
  Loop While Rtn <> ""
 
  CelNo = "A" & CelPos
  WS.Range(CelNo) = UserForm1.ComboBox1.Text
  CelNo = "B" & CelPos
  WS.Range(CelNo) = UserForm1.ComboBox2.Text
  CelNo = "C" & CelPos
  WS.Range(CelNo) = UserForm1.ComboBox3.Text
  ComboBox1.ListIndex = 0
End Sub

上記のコードで、動作は問題ないのですが....
ただ、コンボボックス1で東京都を選択すると、コンボボックス2には
新宿区の下に0が3行(空白セル分)表示されてしまいます。
また、コンボボックス1で茨城県を選択すると、コンボボックスには
2丁目の下に0が1行表示されます。
この0を削除して空白にするにはどうすればいいのでしょうか?

またまた、長い文章で申し訳ありません。
よろしくお願いします。

【19353】Re:2577がらみの追加質問 その2
発言  ichinose  - 04/10/28(木) 22:24 -

引用なし
パスワード
   ▼ととりん さん:
こんばんは。

>ichinoseさまに教えていただいたところまでは、理解できたので、
>次に進んでいるのですが、
>さらに、悩むところが出てきましたので質問させてください。
>
>前の表に追加事項を加え、次の表に変更しました。
>  A      B         C  
>1 東京都    渋谷区     1丁目
>2 東京都    世田谷区    2丁目
>3 東京都    新宿区     3丁目
>4 東京都            4丁目
>5 東京都            5丁目
>6 東京都            6丁目
>7 茨城県    つくば市    1丁目
>8 茨城県    水戸市     2丁目
>9 茨城県    ひたちなか市    
>  .        .       .
>  .        .       .
>  .        .       .
>
>そして、フォームにコンボボックス3を配置して
>C列のデータを表示させ、コマンドボタンをクリックすると
>シート2にデータを書き込むみます。
>


>上記のコードで、動作は問題ないのですが....
>ただ、コンボボックス1で東京都を選択すると、コンボボックス2には
>新宿区の下に0が3行(空白セル分)表示されてしまいます。
>また、コンボボックス1で茨城県を選択すると、コンボボックスには
>2丁目の下に0が1行表示されます。
>この0を削除して空白にするにはどうすればいいのでしょうか?

なるほど、未入力だとそうなりますよね?
例えば、セルA1が未入力のとき、セルB1に「=A1」
とすると、「0」ってなるもんね!!


>そのコードは次のとおりです。
>
>Sub set_combo_item(cmb As MSForms.ComboBox, func_str As String)
>'input: cmb データをセットするコンボボックス
>'input: func_str データ抽出のための関数式
>  Dim rng As Range
>  Dim rng2 As Range
>  Dim rng3 As Range
>  With ThisWorkbook.Worksheets(1)
>   Set rng = .Range("a1", .Range("a65536").End(xlUp))
>   End With
>  rng.Offset(0, 3).Formula = func_str
>  rng.Offset(0, 3) = rng.Offset(0, 3).Value
>  Set rng2 = rng.Offset(0, 3).SpecialCells(xlCellTypeConstants)
>  cmb.Clear
>  For Each rng3 In rng2
>   cmb.AddItem rng3.Value
>   Next
>  cmb.ListIndex = 0
>  rng2.Value = ""
>  Set rng = Nothing
>  Set rng2 = Nothing
>  Set rng3 = Nothing
>End Sub
>
>Private Sub ComboBox1_Change()
>  Dim func_str As String
  func_str = "=if(a1=""" & ComboBox1.Text & _
        """,if(b1="""","" "",b1),"""")"
>  Call set_combo_item(ComboBox2, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & _
        """,if(c1="""","" "",c1),"""")"
'  数式を上記のように変更して下さい。
'  これでいけると思いますが・・・
'  但し、拡張してCombobox2や3を数式の中に組み込むときは、
'  注意が必要ですよ!!
'  func_str = "=if(b1=""" & ComboBox2.Text & _
'        """,if(d1="""","" "",d1),"""")"
'  なんていう数式を仮に作成すると希望の処理がされない場合がでてきます
'
>  Call set_combo_item(ComboBox3, func_str)
>End Sub
>
>Private Sub UserForm_Initialize()
>  Dim func_str As String
>  func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
>  Call set_combo_item(ComboBox1, func_str)
>  func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
>  Call set_combo_item(ComboBox2, func_str)
>  func_str = "=if(a1=""" & ComboBox1.Text & """,c1,"""")"
>  Call set_combo_item(ComboBox3, func_str)
>End Sub
>
>Private Sub InputBtn_Click()
>  '変数の宣言
>  Dim CelPos As Integer
>  Dim CelNo As String
> 
>  Set WS = Worksheets(2)
>
>  Do
>    CelPos = CelPos + 1
>    CelNo = "A" & CelPos
>    Rtn = WS.Range(CelNo).Value
>  Loop While Rtn <> ""
> 
>  CelNo = "A" & CelPos
>  WS.Range(CelNo) = UserForm1.ComboBox1.Text
>  CelNo = "B" & CelPos
>  WS.Range(CelNo) = UserForm1.ComboBox2.Text
>  CelNo = "C" & CelPos
>  WS.Range(CelNo) = UserForm1.ComboBox3.Text
>  ComboBox1.ListIndex = 0
>End Sub
>
確認してみて下さい

【19354】Re:2577がらみの追加質問 その2 追伸
発言  ichinose  - 04/10/28(木) 22:31 -

引用なし
パスワード
   >>Private Sub UserForm_Initialize()
>>  Dim func_str As String
>>  func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
>>  Call set_combo_item(ComboBox1, func_str)
   'func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
   'Call set_combo_item(ComboBox2, func_str)
   'func_str = "=if(a1=""" & ComboBox1.Text & """,c1,"""")"
   'Call set_combo_item(ComboBox3, func_str)
'   ↑上4行要りませんでした。
'   付けておいても動きますが(数式は訂正して)、同じ処理を
'   changeイベント内で行ってますよね?
'   やっぱり、Changeイベントは要注意ですね!!
>>End Sub

【19357】Re:2577がらみの追加質問 その2 追伸
お礼  ととりん  - 04/10/28(木) 23:26 -

引用なし
パスワード
   ichinoseさんへ

ありがとうございました。
無事解決できました!!

>'  但し、拡張してCombobox2や3を数式の中に組み込むときは、
>'  注意が必要ですよ!!
>'  func_str = "=if(b1=""" & ComboBox2.Text & _
>'        """,if(d1="""","" "",d1),"""")"
>'  なんていう数式を仮に作成すると希望の処理がされない場合がでてきます

了解しました。
拡張のする可能性もありますので、そのときには注意して数式を組み込みたいと思います。

本当にありがとうございました!!

【19387】Re:2577がらみの追加質問 その3
質問  ととりん  - 04/10/29(金) 23:52 -

引用なし
パスワード
   また、わからないことが出てきましたので、教えてください。

前の表にさらに項目を追加し、次のように変更しました。
  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とします。

ラベルの表示が東京都と茨城県では違うので、これもコンボボックス1で
選択された内容に応じてラベルの表示を変更したいと思います。
そこで、次のコードを加えました。

Private Sub ComboBox1_Change()
  Dim func_str As String
  Dim StrLabel As String
    
  func_str = "=if(a1=""" & ComboBox1.Text & _
        """,if(b1="""","" "",b1),"""")"
  Call set_combo_item(ComboBox2, func_str)
  func_str = "=if(a1=""" & ComboBox1.Text & _
        """,if(c1="""","" "",c1),"""")"
  Call set_combo_item(ComboBox3, func_str)

  StrLabel = ComboBox1.Text
  Select Case StrLabel
    Case "東京都"
      Label4 = "番地"
    Case "茨城県"
      Label4 = "マンション名"
  End Select

  StrLabel = ComboBox1.Text
  Select Case StrLabel
    Case "東京都"
      Label5 = "マンション名"
    Case "茨城県"
      Label5 = "号室"
  End Select
  
  StrLabel = ComboBox1.Text
  Select Case StrLabel
    Case "東京都"
      Label6 = "号室"
  End Select

End Sub

上記のコードでも動作はできるのですが、実際の内容はA列の項目が2つではなく
もっと沢山あるので、コードが長くなってしまいます。
そこで、もっと簡潔にまとめる方法があれば教えてください。

また、テキストボックス6が不要の時(上記の場合はコンボボックス1が茨城県
の時は不要)は非表示にする方法がありましたら、あわせて教えてください。

よろしくお願いします。

【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(指定されたセル範囲を指定されたコンボボックスのメンバとして、設定する)なんていう二つのプロシジャーに分割しなければ
ならないと思いますが・・・。
これは、ととりん さん、時間が許したなら、考えてみて下さい。

【19401】Re:2577がらみの追加質問 その3
お礼  ととりん  - 04/10/31(日) 11:12 -

引用なし
パスワード
   ichinoseさん、ありがとうございました。
できました!

まだまだ拡張中ですので、
時間ができたときに、最後の課題(?)に挑戦したいと思います。

ありがとうございました。

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