[[20130329104550]] 『リストボックスに表示されたデータをさらに抽出』(ゆき) ページの最後に飛ぶ

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

 

『リストボックスに表示されたデータをさらに抽出』(ゆき)

 Excel2010で受発注・売上データの管理をしています。

 その「全物件データ」シートから、未計上リストや出荷予定リストなどを作成しています。

 最近よく頼まれるのが、
 「○○の物件で先月売り上げた分のリストがほしい」
 「××物件の全部のリストがほしい」
 という、「物件」ごとのリスト(売上状況や出荷状況など)を作成してほしい、という内容です。

 「全物件データ」シートのレイアウトは下記のようなものです(一部省略)

   A		 B	 	 C        D		 E		 F	 G	 H ・・・・ S ・・・・・・・Z
 1
 2 出荷日	納品日	  管理番号 	 	物件名		売上先	  締日   品種 	数量    売上日      受注日
 3 2013/2/20  2013/2/21  AA1302-10	福岡県立いろは高校	××工業  月末   AAA	100     2013/2/28	   2013/2/8
 4 2013/2/26  2013/2/28  AA1302-13	福岡県立いろは高校	××工業  月末   AAA	 30 	   2013/3/12	   2013/2/18
 5 2013/3/15  2013/3/18  BB1303-05	hogeリハビリセンター	□□商事  20日   BBB	 5	  2013/3/19	   2013/3/1
 6 2013/3/21  2013/3/22  AA1303-15	福岡県立ABC病院		○○建設  月末   AAA	 15 	   2013/3/28	   2013/3/15
 7 2013/3/21  2013/3/22  AA1303-03	福岡県立いろは高校	××工業  月末   AAA	 30 	   2013/3/28	   2013/3/16
 8 2013/3/22  2013/3/25  CC1303-02	hogeリハビリセンター	□□商事  20日   CCC	 2	      	   2013/3/18  ※←売上日空白は未売上

 最初はオートフィルタでD列で絞っていたのですが、物件データの量が増えてきたこと、印刷する際に
 入力している私にしか必要のない情報の列があったりして、そのまま印刷すると何ページにも
 分かれるか印刷されたものがかなり縮小されて見にくくなったりすることがあり、
 不必要な情報を除いたデータを他のシートに抜き出して印刷しようと思います。

 雛形を作ってデータを抽出する方法は今までに教えていただいたので分かるのですが、
 今回の場合ユーザーフォームで、以下のような操作で必要な物件を絞りたいと思っています。

 <案1>
 1.リストボックス(物件一覧表示用)・テキストボックス(検索用)・コンボボックス(月検索用)を一つずつ配置
 2.テキストボックスの横に検索用のコマンドボタンを配置、さらにリスト作成用のコマンドボタンを配置
 3.テキストボックスに検索したい物件名の一部分を入力して検索用コマンドボタンを押す
 4.リストボックスに3に該当する物件が表示される
 例:テキストボックスに「福岡県立」と入力すると「福岡県立いろは高校」「福岡県立ABC病院」がリストボックスに表示される
 5.リストボックスに表示された物件名を選択し、リスト作成用のコマンドボタンを押すと該当するデータが
 別シートに抜き出される
 その際、月選択用のコンボボックスに「3月」というような値が選択されていれば、該当物件で該当月売上のデータのみ抽出
 例:「福岡県立いろは高校」を選択してコンボボックスに「3月」が入っていれば上記データの7行目のみ抽出

 <案2>

 基本操作とコントロールの配置は<案1>と同様。
 ただし最初(ユーザーフォームを表示した時)にリストボックスに、以下のようなコードで「全物件データ」シートにある
 全ての物件を重複しないように表示しておく。
 その後、テキストボックスに入力された文字列で絞り込み

    Dim i As Long
    Dim j As Long
    Dim flag As Boolean
    Dim myRow As Long
    Dim sh As Worksheet

    Set sh = ThisWorkbook.Worksheets("全物件データ")

    myRow = sh.Range("A" & Rows.Count).End(xlUp).Row

    With ListBox1
        For i = 2 To myRow
            If .ListCount = 0 Then
                .AddItem sh.Cells(i, 4)
            Else
                flag = False
                For j = 0 To .ListCount - 1
                    If sh.Cells(i, 4) = .List(j) Then
                        flag = True
                        Exit For
                    End If
                Next j
                If flag = False Then .AddItem sh.Cells(i, 4)
            End If
        Next i
    End With

 (参考書から抜き出したコードです)

 それで、分からないのが
 「テキストボックスに入力した文字列の部分一致でリストボックスの中からデータを検索」
 の方法です。

 部分一致にしたいのは、長い物件名があるのですべてをデータシートの文字列と正確に一致するように
 入れるのは大変手間がかかるからです。

 テキストボックスの内容を部分一致でセルから検索する方法は参考書にも載っていたのですが、
 リストボックスから検索する方法をお教えください。

 よろしくお願いします。

 質問文やコードはまだ精読していないけど、ちょっと「あまのじゃく」に。

 <案3>

 抽出したい項目ラベルを別シートにタイトル行として設定しておいて
 フィルターオプションで抽出。

 (ぶらっと)

 コメントしたとおり、ユーザーフォームを使うまでもないとは思うけど、以下はサンプルとして。

 CommandButton1クリックで、ListBox1 にあるデータの中から、TextBox1 にいれた文字列を含むものを抽出してA列に列挙。

 Private Sub CommandButton1_Click()
    Dim i As Long
    Dim k As Long
    Dim s As String

    Columns("A").ClearContents

    For i = 0 To ListBox1.ListCount - 1
        s = ListBox1.List(i, 0)
        If s Like "*" & TextBox1.Value & "*" Then
            k = k + 1
            Cells(k, "A").Value = s
        End If
    Next

 End Sub

 (ぶらっと)

 連投失礼。

 仮に、ユーザーフォームで処理するにしても、"全物件データ"シートを表示させた状態でユーザーフォームを表示すれば
 コントロールは、物件用と指定月用のテキストボックスとコマンドボタンだけで、あとは、その条件に応じて
 シートから抽出すればいいのでは?
 (わざわざリストボックスに持ってくる必要はないと思うけど?)

 で、さらに、そういった構えで、ユーザーフォームをやめて、InputBox関数、あるいは InputBoxメソッドで
 充分では? ○○○○/3 といった入力なら 月も指定された、○○○ だけなら すべての月といった判定もできるし。
 面倒なら、物件用と月用、2回、InputBoxで受ければいいと思うし。

 (ぶらっと)

 ぶらっと様

 リストボックスを使いたいのは、例えば
 >例:テキストボックスに「福岡県立」と入力すると「福岡県立いろは高校」「福岡県立ABC病院」がリストボックスに表示される

 このような状態で、「いろは高校」の方なのか「ABC病院」の方なのかを選択したいためです。

 「あいう大学病院新病棟」「あいう大学病院管理センター」「あいう大学病院ボイラー室」のように、
 よく似た物件名があるので、「あいう大学病院」の部分一致で全部抽出してしまうと物件が混在してしまう可能性があるので…

 で、抽出用雛形シートをコピーしたものに必要なデータを抽出したいと思いまして…

 これから2番目に書いていただいたコードを応用してみます

 (ゆき)

コメント返信:

[ 一覧(最新更新順) ]


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