[[20080313140949]] 『4個のリストボックス』(ひで) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『4個のリストボックス』(ひで)
ユーザーフォーム上に4つのリストボックスを配置し

それぞれ異なる項目を選択できるようにしたいと考えています。

ただ、4つのリストボックス内のデータのいずれか一つだけ

をセルに入力したいのです。

たとえばリストボックス1のあるデータをA1に反映させるとします。

その結果が間違いで実はリストボックス2のあるデータであった場合

リストボックス1で先に選択したデータは非選択(非反転)の状態にしたいのです。

現在はリストボックス1内のデータを選択した後リストボックス2のデータを

再選択してもリストボックス1内で選択したデータも反転しています。

現在のリストボックス1のコードは以下です。

Private Sub ListBox1_Click()

 With ListBox1
     If .ListIndex > -1 Then
         If Intersect(ActiveCell, Range("d12:ah53")) Is Nothing Then Exit Sub
         ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column + 44).Value = .Value
     End If
 End With
 End Sub

よろしくお願いいたします。


 Listbox1とListBox2でそのListIndexプロパティにおいてそれぞれ排他的な
処理をする、ということであれば、
 
Private Sub ListBox1_Click()
If Me.ListBox2.ListIndex > -1 Then Me.ListBox2.ListIndex = -1
'処理
End Sub
 
Private Sub ListBox2_Click()
If Me.ListBox1.ListIndex > -1 Then Me.ListBox1.ListIndex = -1
'処理
End Sub
 
のようにList選択時に他のコントロールのListIndexプロパティを制御しては
どうでしょう。ただ、4っつのコントロールがどのような関係にあるか、ご
提示のコードだけでは判りませんし、「その結果が間違いで」の場合、
ListBox1_Clickの結果(セルに値代入している)がどうなってほしいのかも
書かれていないので、その辺も補足が必要かもしれません。
(みやほりん)(-_∂)b

みやほりんさん,ありがとうございました。これについては解決しました。もう一つおねがいできますか。

 以前はリストボックスが一つだったため,そこで選択したリストがセル
(たとえばAV12)に反映されていました。そして次のようなコードを
教えていただき,ワークシ ートに貼り付けました。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 With Target
       If .Count > 1 Then Exit Sub '<- この行を追加
  If Intersect(.Cells, Range("d12:ah53")) Is Nothing Then Exit Sub
     If .Value = "" Then
         UserFormshusseki.ListBox1.ListIndex = -1
         DoEvents
         Exit Sub
     Else
         UserFormshuseki.ListBox1.Value = Cells(.Row, .Column + 44).Value
         DoEvents
     End If
 End With
 End Sub

 これにより今まではAV12をアクティブにしてリストボックスから
リストを選択すると当然リストが反転しますが,
一旦他のセルをアクティブにした後再びAV12を
 アクティブにしてもリストが反転しなかったものがセルに
入力されているデータによってリアルタイムに反転するようになりました。

 しかし今回4つにリストボックスを分けましたので
 それが働きません。

 たとえば
 リストボックス1内リスト・・・風邪,頭痛,腹痛
 リストボックス2内リスト・・・家の用事,所用
 リストボックス3内リスト・・・祖父死亡,祖母死亡
 リストボックス4内リスト・・・結核,インフルエンザ

 となっており,AV12をアクティブにし,リストボックス1から風邪を選択し反転さ せるとAV12に風邪が入力される
A V13に結核を選択し反転させる。
再びAV12をアクティブにしたとき先ほど選択したリストボックス内の風邪を反転させたい。

というものです。わかりますでしょうか。よろしくお願いいたします。


 コントロール、処理やセルの関係が不明な点が多いので、整理させて下さい。
 
(1)ListBox1〜ListBox4の選択(反転)状況は排他的
  (この場合、排他的とは一つが反転した場合、他の反転が解除されること)
 
(2)選択したセルの内容に合致するリストボックスを選択反転状態にする
  直前の投稿から推測すると、次のような動作?
  AV12選択、ListBox1で「風邪」選択し、Av12に"風邪"が入力される
  ↓
  AV13選択、ListBox4で「結核」選択し、Av13に"結核"が入力され、
  このとき、ListBox1の選択反転状態は解除されている
  ↓
  AV12選択したとき入力されている"風邪"に基づいてListBox1で「風邪」が選択
  反転される。
  このとき、ListBox4の選択反転状態は解除されている
 
 
////////////////////
(1)についてはそれぞれのリストボックスのClickイベントで他の三つの
リストボックスのListIndexに-1を代入するコードとすれば解決するでしょう。
 
(2)についてはWorksheet_SelectionChangeイベントで「セルに入力されてい
る値がどのコントロールにリストされているか」を調べなければなりません。
[[20080207102407]]
が直前の相談と推測されるので、List設定はシート入力されているデータを
Rowsourceプロパティにて設定している、と類推します。四つあるコントロール
の各リストを調べるよりも、Rowsourceの範囲をFindメソッドなどで検索した方
が簡単なコードになると推測します。
 
(2)の手順としては、次のようなコードになるでしょう。
Worksheet_SelectionChangeイベントでユーザーフォームの四つのListBoxの
ListIndexに-1を必ず代入する。
Cells(Target.Row, Target.Column + 44).Value を Rowsourceの範囲から検索
してどのListBoxに値があるかを特定し、そのコントロールのValueプロパティに
Cells(Target.Row, Target.Column + 44).Value を代入する。
 
下記はRowsourceがSheet2のA:D列に入力されており、A列がListBox1、B列がListBox2・・・
と対応していると仮定したコードです。
 
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Dim i As Long, myCol As Long, MyRng As Range
     Rem ListIndexを初期化
     For i = 1 To 4
         UserFormshusseki.Controls("ListBox" & i).ListIndex = -1
     Next i

     With Target
         If .Count > 1 Then Exit Sub
         If Intersect(.Cells, Me.Range("d12:ah53")) Is Nothing Then Exit Sub
         If .Value <> "" Then
             Set MyRng = Worksheets("Sheet2").Range("A:D").Find(Cells(.Row, .Column + 44).Value)
             myCol = MyRng.Column
             UserFormshusseki.Controls("ListBox" & myCol).Value = MyRng.Value
             DoEvents
         End If
     End With
 End Sub
 
(みやほりん)(-_∂)b


 ありがとうございます。直前の相談は察しの通りです。

 (1)に関してはその通りです。
(2)に関してちょっと説明が間違っていました。申し訳ありません。
  
   J12選択,ListBox1で「風邪」選択し、Av12に"風邪"が入力される
   ↓
   J13選択、ListBox4で「結核」選択し、Av13に"結核"が入力され、
   このとき、ListBox1の選択反転状態は解除されている
   ↓
   J12選択したとき入力されている"風邪"に基づいてListBox1で「風邪」が選択
   反転される。
   このとき、ListBox4の選択反転状態は解除されている

 となります。J列をアクティブにしておき,リストを選択することでAV列に入力されます。
 そのため(.Column + 44)が必要になってきます。
 また,リスト1のRowsourceはopen!D15:D29で
 以下リスト4まではそれぞれopen!E15:E29,open!F15:F29,open!G15:G29
です。
 今現在,みやほりんさんご提供のコードを試してみたら

 myCol = MyRng.Column
 で「オブジェクト変数またはwithブロック変数が設定されていません」と表示され止まります。
 以上よろしくお願いいたします。(ひで)


 「オブジェクト変数またはwithブロック変数が設定されていません」は検索の結果、
MyRngにセル参照が格納されていないため発生しております。
 
「RowsourceがSheet2のA:D列に入力されており、A列がListBox1、B列がListBox2・・・
と対応していると仮定」して作成したコードなので、そのまま実行しても動きません。
             Set MyRng = Worksheets("Sheet2").Range("A:D").Find(Cells(.Row, .Column + 44).Value)
 
の部分のシート名を "open" に、Rangeの部分を "D15:G29" に変更。コレに伴って、
列の返す列番号も右に3列ずれているので、
 myCol = MyRng.Column - 3
 
として御使用下さい。
ただ、こちらの検証では、下記の表現に疑問を感じます。
「J列をアクティブにしておき,リストを選択することでAV列に入力されます。
 そのため(.Column + 44)が必要になってきます。」
J列から44列右側の列はBB列になります。
J列をアクティブ、AV列に入力が成されるとすると、(.Column + 38)でなければなりません。
 
(みやほりん)(-_∂)b


みやほりんさん。ありがとうございます。また,返信が遅れてすみませんでした。
早速試させていただきます。
ご指摘の通り間違っていました。J12→D12でした。(ひで)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.