[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.