[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数のリストボックスの連携』(しろうと)
selIndex=Me.ListBox.ListIndex Select Case selListIndex Case 0 Me.ListBox2.Rowsource="sheet2!b1:b3" ・ ・ End Select End sub
WindowsXP、Excel2003
(しろうと)
与えるリストを工夫すれば、リストボックスに摘要と収入・支出先(項目名)の2列を同時に表示させることは可能だけど 残念ながら、クリック(選択)という操作で、どちらの列を選択する という、そういう概念がない。 あくまで、その行が選択されたという認識しかできない。
なので、2列方式でいくなら、別途、OptionButton を用意して、今から選ぶのは摘要なのか収入・支出先(項目名)なのかを 選択してから、リストボックス2をクリックするか、または収入・支出先(項目名)専用のリストボックス3を用意するか、 いずれかだね。
追記)仮に2列表示したとして、その中の1行、ここに摘要と収入・支出先(項目名)が表示されるけど この1行に表示されている2つは、紐ついているの? もし、それぞれ別物なら、できる、できないということではなく、別のリストボックスにすべきだね。
(ぶらっと)
ListBox1.RowSource="sheet2!a1:a7" ListBox2.RowSource="sheet2!b1:b7" 現在の後にlistbox3.rowxource="sheet!s1:s7"と入るのですか? また Private Sub ComandButton_Click() With ListBox2 ActiveCell.Value=.List(.ListIndex,0) UserForm2.Hide End with 今のリストボックスが3つあって このコードは変わると思いますががどう変わっていくのか全く見当がつきません。 お尋ねしたい事がうまく説明できていないと思いますが。(しろうと)
Sheet2のA列に科目、B〜R列に、その科目用の摘要、S〜AZ列に、その科目用の収入・支出先の詳細が、それぞれ左詰めで記載されているとして。 もちろん、それぞれ1つ以上あるとして。 また、A列の科目が2行以上であると言うことを前提にして。
ListBox1が科目用、ListBox2が摘要用、ListBox3が収入・支出先の詳細用。
Private Sub UserForm_Initialize() With Sheets("Sheet2") ListBox1.List = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Value End With End Sub
Private Sub ListBox1_Click() Dim z As Long Dim v As Variant With Sheets("Sheet2") z = WorksheetFunction.Match(ListBox1.Value, .Columns("A"), 0) With .Rows(z) v = WorksheetFunction.Transpose(.Range("B1").Resize(, WorksheetFunction.CountA(.Range("B1:R1"))).Value) If IsArray(v) Then ListBox2.List = v Else ListBox1.List = Array(v) End If v = WorksheetFunction.Transpose(.Range("S1").Resize(, WorksheetFunction.CountA(.Range("S1:AZ1"))).Value) If IsArray(v) Then ListBox3.List = v Else ListBox3.List = Array(v) End If End With End With End Sub
(ぶらっと)
まず、エラーであったり、表示が思った通りじゃないのは、前提としているレイアウトが異なるから。 レスの最初で、前提になるレイアウトを説明したよね。 もちろん、これは、こちらで、決めたレイアウトなんだけど、実際のものがそれと異なっていれば 不具合が出るのはあたりまえだよ。
で、どうしても、そちらの現在のレイアウトでやりたい? 運用上、あまり感心しないなぁ。 たとえば、今は科目が 17 行だから 1行目の適用は B列、2行目の適用は C列、3行目はD列・・・ このあたりまでは、メンテナンスも可能だと思うけど、じゃぁ科目が102個になったら、あるいは、何かの科目を廃止したら? さぁ、これは何列だったかなぁと指を折って勘定する? さらには、S列以降に科目用の収入・支出先の詳細の列があるとして、それも、ぱっと見ただけでは じゃぁ、Z列は、どの科目用なんだろうと。わかりにくいと思うなぁ。
それよりも、こちらで提案したように、 1行目が繰越金であれば、その1行目のB〜R列が繰り越し金用の適用、同じく1行目のS〜AZが繰越金用の収入・支出先の詳細 としたほうが運用しやすいと思うけど?
もちろん、レイアウトはそちらの仕様なので、もし、それで、いくんだということなら、コードを書き直すけどね。
ただ、夜まで外出で時間がとれないので、しばらく待ってもらうことになる。
(ぶらっと)
おそまつなコードミスだった。 ListBox2 にセットすべきところで1カ所、ListBox1と記述していたところがあった。 その他、リスト配列生成のところにも、おかしなところがいくつか。 あわせて、万が一、摘要や収入・支出先の詳細が1件も登録されていないときもサポートするよう、 データの有無チェックと、その後の扱いを少し丁寧にした。
ただ、その後にアップしてもらったコメントにつき、念のために、こちらのコードの想定を以下に。 アップしたコードは、ListBox は3つ。それぞれ、項目は1列だけ。 ListBox2は選ばれた科目に関する摘要だけ、ListBox3は選ばれた科目に対する収入・支出先の詳細だけ。 摘要は B〜R列に左詰めで、収入・支出先の詳細はS列から最終列までに、これも前詰めで。 ただし、この"S"列というのは、コード上は、
strDtl = "S" '詳細項目開始列記号
ここで規定。なので、もう少し前とか後ろという要望があれば、レイアウトを変更した上で、ここを変更すればOK。
ListBox1_Click を以下でリバイスして試してみて。
Private Sub ListBox1_Click() Dim z As Long Dim v As Variant Dim x As Long Dim n As Long Dim strDtl As String
With Sheets("Sheet2") strDtl = "S" '詳細項目開始列記号 z = WorksheetFunction.Match(ListBox1.Value, .Columns("A"), 0) With .Rows(z) x = .Range(strDtl & "1").End(xlToLeft).Column If x < .Columns("B").Column Then ListBox2.Clear Else n = x - .Columns("B").Column + 1 v = WorksheetFunction.Transpose(.Range("B1").Resize(, n).Value) If IsArray(v) Then ListBox2.List = v Else ListBox2.List = Array(v) End If End If x = .Cells(1, .Columns.Count).End(xlToLeft).Column If x < .Columns(strDtl).Column Then ListBox3.Clear Else n = x - .Columns(strDtl).Column + 1 v = WorksheetFunction.Transpose(.Range(strDtl & "1").Resize(, n).Value) If IsArray(v) Then ListBox3.List = v Else ListBox3.List = Array(v) End If End If End With End With End Sub
(ぶらっと)
そういう仕様が使いやすいかどうかはなはだ疑問だけどダブルクリックで。
シートモジュールに
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With UserForm1 .Tag = Target.Address .Show End With End Sub
ユーザーフォームモジュールに
Private Sub ListBox2_Click() If IsObject(Evaluate(Me.Tag)) Then Range(Me.Tag).Value = ListBox2.Value End If End Sub
Private Sub ListBox3_Click() If IsObject(Evaluate(Me.Tag)) Then Range(Me.Tag).Value = ListBox3.Value End If End Sub
(ぶらっと)
(しろうと)
じゃぁ以下。(とりあえずB列が科目列というコード。違っていたら修正してね)
シートモジュール
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True If Target.Column <> 2 Then 'B列じゃなかったら MsgBox "科目列(B列)をダブルクリックしてください" Exit Sub End If With UserForm1 .Tag = Target.Address .Show End With End Sub
ユーザーフォームモジュール
Private Sub ListBox1_Click() If IsObject(Evaluate(Me.Tag)) Then Range(Me.Tag).Value = ListBox1.Value End If End Sub
Private Sub ListBox2_Click() If IsObject(Evaluate(Me.Tag)) Then Range(Me.Tag).Offset(, 1).Value = ListBox2.Value End If End Sub
Private Sub ListBox3_Click() If IsObject(Evaluate(Me.Tag)) Then Range(Me.Tag).Offset(, 2).Value = ListBox3.Value End If End Sub
(ぶらっと)
そうだった。すでに存在したんだね。 うん、そのようにして。
(ぶらっと)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.