数値によってリスト表示を分ける方法とは?

このQ&Aのポイント
  • コード番号が100から150の場合、支出リストに2列表示する方法
  • コード番号が151から200の場合、支出収入リストに表示する方法
  • ユーザーフォームのリストボックスを使用してリスト表示を行う方法
回答を見る
  • ベストアンサー

数値(コード番号)によってリストへの表示を分ける

よろしくお願いします。 C列はコード番号(100から200)コード番号は変動あり D列は項目 コード番号が100から150なら、コード番号と右隣の項目をリストとして、支出リスト(ユーザーフォームのリストボックス)に2列表示する。 コード番号が151から200なら、コード番号と右隣の項目をリストとして、支出収入リスト(ユーザーフォームのリストボックス)に表示する。 With Me.支出リスト .RowSource = Worksheets("AAA").Range("C1:D100").Address(External:=True) End With With Me.収入リスト .RowSource = Worksheets("AAA").Range("C1:D100").Address(External:=True) End With

  • 1211M
  • お礼率54% (90/165)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 方法は幾つかありますが、VBAのリストの扱い方として 基本通りのやり方として ' ' // Dim i As Long   Worksheets("AAA").Select   For i = 1 To Cells(1, "C").End(xlDown).Row     Select Case Cells(i, "C")     Case 100 To 150       Me.支出リスト.AddItem Cells(i, "C")       Me.支出リスト.List(Me.支出リスト.ListCount - 1, 1) = Cells(i, "D")     Case 151 To 200       Me.収入リスト.AddItem Cells(i, "C")       Me.収入リスト.List(Me.収入リスト.ListCount - 1, 1) = Cells(i, "D")     End Select   Next i ' ' // 事前に、各ListBoxについて、デザイン画面にて  ColumnCount 2  ColumnWidths 30 pt;100 pt  RowSource (空) 等、必要な設定を追加、変更、確認しておいて下さい。 質問の文脈として、期待されているものは、 .RowSource に対して、 クエリや関数のような抽出コマンドを指定できるのではないか? ということのように思われますが、 .RowSource に指定できるのは、単純に、 単矩形範囲(ひとつの連続した四角い範囲) のみ、です。 したがって、 VBAの処理として、条件分岐を経て抽出したものを それぞれのListBoxに格納することになります。  Select Case ステートメント  ListBox.AddItem メソッド  ListBox.List プロパティ の3点、理解に自信ないようでしたら、ヘルプ等でお浚いしておいて下さい。 他の方法としては、 配列変数を使って、.Listプロパティをまるごと直接設定する方法など、 場合によっては、より効率的になることもありますが、 難度が高いものですので、今回は、 基礎的な、.AddItemメソッドを提示するに留めます。 より易しい(解り易い)方法については、 一旦、VBAのことは忘れてもらって、 抽出ということなら、 Excelの[フィルター]機能や[フィルターの詳細設定]機能 が、得意とするものですので、 こちらを使うのが易しいかな、と思います。 VBAで難しいことを考える前に、 少しばかりExcelの基本機能をお浚いしておくのも大切です。 例えば、C1:D1 に項目タイトルがあって、 C2:D101 にデータがある、というような設計の基本を守るだけで、 使える機能が増えてきます。  ・1行めは項目タイトル  ・[フィルター]   →[数値フィルター]    →[指定の範囲内]     →[100] [以上]      [AND]      [150] [以下]      →[OK]  ・フィルターで得られた結果を空のシートにコピペ  ・Me.支出リスト.List = 貼り付けられた抽出後のセル範囲の.Value みたいなやり方、この方が、一般には人気あるみたいですね。 (マクロの記録で基本コードを得られますし) ただ、今回ご提示の条件そのままでは手を出し難いですね。 VBAはExcelシートのデザインに従うことしかできませんから、 覚えながら、シートデザインを標準化していくことにも 意識を向けてあげると、いいことあるかも、です。 蛇足ですが、 もしかして、コード番号順に並べ替えた結果をリストにしたい というような場合だったら、Excelの[並べ替え機能]を中心に組めば、 単矩形範囲2つをそのまま.Listに指定するだけで済みますから、 さらに簡単に出来そうですね。 質問を読む人は、もしかして、を考えますから、 何が正解か見つけるの難しかったり、 保険を掛けて難しい方法を敢えて選んだり、します。 ご自身の"やりたい事"を、明確に限定的に言葉にする習慣づけを 大事にしていると、VBAも簡単に言うこと聴いてくれるようになるので、 "やりたい事"はなんなのか、考えては書き、この繰り返しに 慣れて行けば、上達も早くなっていいのかも、です。 以上、ご参考まで。

1211M
質問者

お礼

realbeatin様 詳細な解説ありがとうございます。 とても勉強になります。 解決しました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#1です。 DataSourceについて、配列利用・法でやってみました。 下記コードのUserForm1.ListBox1.List() = Aのあたりが特徴です。 ーー 質問とは、2列に振り分ける区分点が、質問と違ったままにしていますが コードを修正してください。 ーー データ例 Sheet1 C1:D7 コード 科目 121 あ1 131 あ2 142 あ3 161 あ4 175 あ5 184 あ6 ーー 操作など、メニュー選択など ーー 開発 VisualBasic 挿入 ユーザーフォーム ユーザーフォームにリストボックス2つ貼り付け Listbox1をクリック 右クリック プロパティでColumncountを2(2列) ユーザーフォームの「コードの表示」 各リストボックスの第I列、第2列の表示幅を十分広げる(手動)。またはコードで設定もできる(略) Listbox2についても同じ。 ーーーー コードは、ユーザーフォームでコードの表示で、Initializeイベントにコードを書く。 Private Sub UserForm_Initialize() Dim A(1000, 2) Dim B(1000, 2) '-- k = 1 l = 1 lr = Worksheets("Sheet1").Range("C100").End(xlUp).Row MsgBox lr '-- For i = 2 To lr v1 = Worksheets("Sheet1").Range("C" & i) v2 = Worksheets("Sheet1").Range("D" & i) If Worksheets("Sheet1").Cells(i, "C") < 150 Then A(k, 0) = v1 A(k, 1) = v2 k = k + 1 Else B(l, 0) = v1 B(l, 1) = v2 l = l + 1 End If Next i UserForm1.ListBox1.List() = A UserForm1.ListBox2.List() = B End Sub (注意) 下記は適宜修正 ・シート名の指定 ・配列のデータ要素の限度 ・リストボックスを収入と支出に振り分けるコード部分(上記では150で分けたが)

1211M
質問者

お礼

imogasi様 早速のご回答ありがとうございます。 解決しました。

回答No.3

あ、 並べ替えしてもいいのでしたら、例えばこんな感じで。 ' ' // Dim i As Long   With Worksheets("AAA")     With .Range("C1:D" & .Cells(1, "C").End(xlDown).Row)       .Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo       i = WorksheetFunction.Match(150, .Columns(1).Cells, 1)       Me.支出リスト.List = .Resize(i).Value       Me.収入リスト.List = .Rows(i + 1).Resize(.Rows.Count - i).Cells.Value     End With   End With ' ' // 後から#1補足に気が付きました。失礼。

1211M
質問者

お礼

realbeatin様 早速のご回答ありがとうございます。 解決しました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

丁寧に質問を文章表現せよ。 補足を考えてみて。 ユーザーフォームに左右?または上下2つのリストボックスを設ける(または、設けてあるとする) あるワークシートのC列にはコード番号(3けた 、そして対応する(隣の)D列には対応する項目文字列があるということだな。 収入項目も、支出項目も行的に混じっているのだな。 するとどういう風に収入と支出を振り分ければよいのか。 収入のコードと支出のコードが別列に振り分けてないと、どうして振り分けるのか。コードに区分コード1桁?を含んでいないような場合です。 人間のように、知識や経験や常識をプログラムで持たせることは出来ないのは、わかっているだろう。 ーー 上記は小生の質問の読みが間違っているか。 一括して、RowSource で設定できない場合は、2系列の配列に前もって振り分けるか、1行ずつ支出か収入か判別して、どちらかのリストボックスにAddItemすることになろう。 ーー もう一つ問題点があろう。」 C、D列のコードの増減や変更に即座に対応するということになれば、むつかしいよ。シートのChangeイベントというのがあるが、うまく使えるかな。

1211M
質問者

補足

imogasi様 ご回答ありがとうございます。 説明になるかどうかわかりませんがよろしくお願いします。 今、使用している、C列のコード番号は、100から130および151から170です。 131,132,133と新規に増えた場合は最終行の1つ下に入力し、C列の数値でC列とD列の並べ替えをなっています。 その時にC列の値が150以下なら支出リストに、151以上の値なら収入リストに表示するようにしたいと思っています。

関連するQ&A

  • VBAのリストボックス連動がうまく表示されません。

    例えば、エクセル表に下記のようなデータが入っているとします。 A列は項目であり、B列は項目内容数(D列以降の項目数)、D列にはA列項目の内容が入っています。しかし、この列は変動する為、変数で指定しています。 これをリストボックス1で、まずA列の内容を表示させて、その中で選んだ項目をリストボックス2でD列以降の行内容を表示させ、リストボックス2の値を取得したいのですが、リストボックス2がうまくい表示できません。 リストボックス1では .RowSourceを使ってセル指定して表示させています。 このようなケースがuserformに多数あり、for~の処理はできるだけ避けています。 例えばUserForm_Initialize()で次の通りです。 With ListBox1 .ColumnCount = 1 .BoundColumn = 1 .RowSource = Worksheets(wksheet).Range(Cells(2, item_No), Cells(item_max_cnt, item_No)).Address(External:=True) VBA初心者で恥ずかしい質問ですが、どなたかご教示宜しくお願い致します。m(_ _)m A列_B列__D列_E列_F列_G列_H列 … a_3__あ_い_う b_1__か c_5__さ_し_す_せ_そ

  • リストボックスのリストをシートのセル範囲で表示する

    リストボックスのリストをシートのセル範囲で表示する おはようございます。 朝から行き詰っています。 リストは、シートのセル範囲で列の離れたリストを複数表示させる。 下のようにしたのですが、うまくできません。 よろしくアドバイスをお願いします。 With ListBox2 .ColumnCount = 3 .ColumnWidths = "150;150;150" .RowSource = "受注物件!C5:D,F5:F" & Worksheets("受注物件").Cells(Rows.Count, 5).End(xlUp).Row .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption End With

  • コンボボックスの記述の簡素化

    下記の記述でコンボボックスにデーターを表示するようにしたのですが 大量に記述が必要になります。 もっと簡素化できないでしょうか。 よろしくお願いします。 If Worksheets("Sheet2").Range("C3").Value = Worksheets("Sheet2").Range("C2").Value Then 品名リスト.RowSource = "Sheet2!D3:D18" ElseIf Worksheets("Sheet2").Range("C4").Value = Worksheets("Sheet2").Range("C2").Value Then 品名リスト.RowSource = "Sheet2!E3:E20" ― ― 省略 ― ― ElseIf Worksheets("Sheet2").Range("C20").Value = Worksheets("Sheet2").Range("C2").Value Then 品名リスト.RowSource = "Sheet2!U3:U20" ElseIf Worksheets("Sheet2").Range("C21").Value = Worksheets("Sheet2").Range("C2").Value Then 品名リスト.RowSource = "Sheet2!V3:V20"

  • リストボックスのプロパティを設定できません

    excelのuserform上にリストボックスを作って表示させようとしているのですが、 ↓ここでエラー  (1)ColumnWidths = "50:50"  (ColumnWidths プロパティを設定できません。) (2) .RowSource = Worksheets("過去データ").Range("A" & lastRow & ": B" & lastRow).Address     (RowSourceプロパティを設定できません。) ここでエラーになるのですが、何が違うのかわかりません。 ちなみに Worksheets("過去データ").Range("A" & lastRow & ": B" & lastRow).Select で選択させてみるとちゃんと選択しているのです。 今はAB列だけで試しているのですが、最終的には39列ありすべて表示させるつもりです。 listbox1(←番号)をクリックすると、クリックした値で、Worksheets("過去データ").にフィルターがかかり、 フィルタをかけた状態で、最終行を選択し、listbox2(←その番号に付随する詳細内容)に表示され、そしてlistbox1のチェックボックスにチェックの入ったものを、登録ボタンを押すと別のシートに貼り付ける、ということが最終的にはしたいのです。 1日中悩んでおりましたがわかりません。どなたか助けてください。 ------------------------------ Private Sub ListBox1_Click() Worksheets("過去データ").Cells(1, 1) = UserForm1.ListBox1.Text Unload UserForm1 Dim target As String target = Worksheets("過去データ").Range("A1").Value Worksheets("過去データ").Cells(1, 39).AutoFilter Field:=1, Criteria1:=target, Operator:=xlAnd Dim lastRow As Long With Worksheets("過去データ") lastRow = .Range("A" & Rows.Count).End(xlUp).Row MsgBox lastRow End With With ListBox2 .ColumnCount = 2 '.ColumnWidths = "50:50" '.RowSource = "過去データ!A" & lastRow & ": B" & lastRow.Address .RowSource = Worksheets("過去データ").Range("A" & lastRow & ": B" & lastRow).Address End With End Sub

  • リストボックス内の表示について

    マクロ初心者です。(エクセル2003使用_ユーザーフォーム) リストボックスを作成しました。 Sheet1でA5からAEまでを選択することはできたのですが、 下記コードでは、リストボックス内の表示がA,B,Cの値がでてしまいます。自分は、G,H,Iの値を表示したいのですが、どこが違うのか教えてください。 (Sheet1のデータ) A  B  C ・・・・G  H  I ・・・・AE 犬  猫  鳥     馬  羊  蝶     猿 (コード) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "45;18;90" .ColumnCount = 3 .RowSource = "Sheet1!A5:AE" & Worksheets("Sheet1").Range("AE" & Rows.Count).End(xlUp).Row End With End Sub ↑これだと、リストボックスには<犬 猫 鳥>となってしまいます。 <馬 羊 蝶>にするやり方を教えてください。 よろしくお願いいたします。

  • リストボックスに複数シートのデーターを表示させる。

    リストボックスに複数シートのデーターを表示させる。 下記の構文で複数表示はできたのですが、このListBox1のColumnCount7つ目に シートBのC列のデーターを表示させる方法をお教えください。 With ListBox1 .ColumnCount = 7         ↓ .ColumnWidths = "0;100;120;0;0;0;120" .RowSource = "シートA!B5:G" & Worksheets("シートA").Cells(Rows.Count, 5).End(xlUp).Row        → .RowSource = "シートB!C5:C" & Worksheets("シートB").Cells(Rows.Count, 5).End(xlUp).Row .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption End With よろしくお願いします

  • オプションボタンとリストボックスの連動

    下記コードを作りましたが、全く反応がありません。 どこが悪いのか、指摘いただけませんでしょうか? よろしくお願いします。 ・オプションボタン1を選択=リストシートのB列をリストボックスへ表示 ・オプションボタン2を選択=リストシートのC列をリストボックスへ表示 ・リストボックスから一項目を選択、値を入力シートへ入力 Private Sub UserForm2_Initialize() If OptionButton1.Value = True Then With UserForm2 .ListBox1.RowSource = "リスト!B3:B" & lastRow End With End If If OptionButton2.Value = True Then With UserForm2 .ListBox1.RowSource = "リスト!C3:C" & lastRow End With End If End Sub Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) Worksheets("入力!").ActiveCell.Value = ListBox1.Value End Sub 以上

  • excel vbaの関数の使い方

    excel VBAでsumproduct関数を使いたいがでますのですがどうしても実行できません 何が原因でしょうか、どなたか教えてください。 ------------------------------------------------- 下記コードは実行できます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.Sum(Worksheets("日常").Range("h4:h13")) 下記コードは型が違うとのコメントがでます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.SumProduct((Worksheets("日常").Range("c4:c13") >= j2) * Worksheets("日常").Range("c4:c13") <= k2) * Worksheets("日常").Range("d4:d13") = l2 * Worksheets("日常").Range("f4:f13") = m2 * Worksheets("日常").Range("h4:h13") --------------------------------------------------------------------- ワークシートは、日常、集計、の二つがあります。 「日常」には、C4:H13にデータがあります。 c列に年月日、d列にコード番号、e列に購入箇所、f列にコード番号、g列に商品、h列に金額 が入力されています。 「集計」には、j2に開始日、k2に終了日、l2にd列のコード番号、m2にf列のコード番号、 が入力されています。 環境は、windows10 使用しています。 ----------------------------------------------------------- 以上の状況ですがvba でsumproduct関数を使いたいのですが実「実行」できません,たかどなたか教えて頂けませんか。

  • リストボックスにシートの値を表示させたいのですが

    vbaでシートのリストボックスにシートの値を表示させたいのですが シートモジュールでこのコードを実行しようとしてもエラーになり出来ないのですが どこが間違ってますか? Sub リストボックスに値を表示する() Me.ListBox1.RowSource = Range("c1:c10").Value End Sub Me.ListBox1.Value = Range("c1:c10").Value もエラーになりました。

  • リストボックスのリストを右詰で表示する

    リストボックスのリストを右詰で表示する おはようございます。 先般、お教えいただいた複数列表示の構文ですが ColumnCountの5つ目の数値が左詰で表示されます。 これを右詰で表示したいのですが、構文がわかりません。 よろしくご教示をお願いします。 With ListBox2 .ColumnCount = 5 .ColumnWidths = "150;150;0;0;150" .RowSource = "受注物件!C5:G" & Worksheets("受注物件").Cells(Rows.Count, 5).End(xlUp).Row .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption End With

専門家に質問してみよう