• 締切済み

エクセルVBAでの複数検索システムについて(図面管理)

質問させて頂きます。 現在会社で図面をスキャンして登録する事で 品番から検索できるシステムをエクセルVBAで作って運用しているのですが 「品番」だけではなく「相手先会社名」で絞り込んだ上で 品番検索できるシステムに変更したいと思っています。 品番  品名 相手先会社名 備考 135A1 あいう 佐藤株式会社 274B2 かきく 中野製作所 355F4 さしす 佐藤株式会社 659A2 たちつ 伊藤工業 788B2 なにぬ 伊藤工業 821A3 はひふ 田中プレス 903B2 まみむ 中野製作所 登録情報は上記のようなもので、登録数は約1000枚分です。 現在は専用フォームを立ち上げ、 品番部分の昇順をコンボボックス内で表示させて選択する事で 該当の情報を表示しています。 これをそのままに、相手先会社名の部分もコンボボックスにして 相手先会社名を選択した場合、その会社名のものだけを品番コンボボックスで表示させて 絞り込んだ状態で品番を選択できるようにしたいと思ってます。 このようなものを作る時に 情報元には当然同じ会社名のものが複数あるわけですが それら重複するものを1つとして表示させ かつ、その会社名を選択するとその会社名のもの全てを 品番のコンボボックス内に表示させ、選択できるようにしたいのですが どうしたら良いのでしょうか。 大雑把な質問内容で恐縮ですが ご存じな方おられましたら教えて頂けますようお願いします。

みんなの回答

  • hotosys
  • ベストアンサー率67% (97/143)
回答No.2

作業シートを使う方法です。 ユーザーフォームにはComboBox1(社名用)とComboBox2(品名用)があるとします。 ユーザーフォームのモジュール部に以下をコピーしてみてください。 Const dataSheetName = "Sheet1" '元データシート名 Const tempSheetName = "Sheet2" '作業シート名 '初期設定(ComboBox1に表示する社名リスト作成) Private Sub UserForm_Activate() Dim dataSheet As Worksheet Dim tempSheet As Worksheet Set dataSheet = Sheets(dataSheetName) Set tempSheet = Sheets(tempSheetName) '作業シートクリア tempSheet.Cells.Clear '相手先会社名を重複を削除して作業シートのA列へコピー dataSheet.Columns("C:C").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:="", CopyToRange:=tempSheet.Range("A1"), Unique:=True '並べ替え tempSheet.Range("A:A").Sort Key1:=tempSheet.Range("A2"), Order1:=xlAscending, Header:=xlYes 'コンボボックスのRowSourceを設定 ComboBox1.RowSource = tempSheet.Name & "!A2:A" & tempSheet.Range("A" & tempSheet.Rows.Count).End(xlUp).Row End Sub 'ComboBox1を選択した場合にComboBox2の品番リスト作成 Private Sub ComboBox1_Change() Dim dataSheet As Worksheet Dim tempSheet As Worksheet Set dataSheet = Sheets(dataSheetName) Set tempSheet = Sheets(tempSheetName) '現在のコンボボックスのデータクリア ComboBox2.Value = "" 'フィルタ用データ作成 tempSheet.Range("B1") = dataSheet.Range("C1") '見出しコピー tempSheet.Range("B2") = ComboBox1.Value '条件にあった品名を作業シートのC列へコピー(余計なデータもコピーされる) dataSheet.Columns("A:C").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=tempSheet.Range("B1:B2"), CopyToRange:=tempSheet.Range("C1") '並べ替え tempSheet.Range("C:C").Sort Key1:=tempSheet.Range("C2"), Order1:=xlAscending, Header:=xlYes 'コンボボックスのRowSourceを設定 ComboBox2.RowSource = tempSheet.Name & "!C2:C" & tempSheet.Range("C" & tempSheet.Rows.Count).End(xlUp).Row End Sub

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

>1000枚分 突然「枚」とはなに?エクセルのシートで1000行? ーー 質問者は、色々書くけど、品名=品番対応か品名=多数品名だろうから品番と会社名を問題にすればよいのでしょう。 多分会社名は重複出現するのだろうが、品番も重複出現するのですか? データを扱うときこれらを明示しないのは、不十分。 ーー 2条件で抜き出して、さらにその中から、人間による第3の選択が必要なのか? ーーー 関数で2条件抜きだしという質問もこのコーナーで多い。 VBAでは検索は(1)フィルタや(2)Findメソッドしかなく、(3)1000行総当り検索は苦しいかな。 (2)Findメソッドはまず品番でしか検索出来ず、見つかった行で、さらに会社列が指定会社名か判別し、一致しなければ捨てて、一致するものだけを表示するようにすれば出来る。 FindメソッドはGoogleででも「VBA Find」で照会すれば、コード例が沢山出るでしょう。しかしFindNextとの組み合わせと見つからないときの捉え方、ヒットの終わりなど、初心者には難しいと思う。 ーーー (1)(2)ともテキストボックス2つで、品番と会社名を指定(手入力)すると十分だが、これらもコンボでの選択が必要か? ーーー (1)のフィルター こんなのはマクロの記録で出来る。「VBAで」と言ってながら、それさえも検討したと質問に報告も無い。操作は「フィルタオプションの設定」に当たる。 まるきり丸投げでは。 ーー 下記を参考に。 例データ A1:D9 品番 品名 相手先会社名 備考 135A1 あいう 佐藤株式会社 274B2 かきく 中野製作所 355F4 さしす 佐藤株式会社 659A2 たちつ 伊藤工業 788B2 なにぬ 伊藤工業 821A3 はひふ 田中プレス 903B2 まみむ 中野製作所 355G3 さしす 佐藤株式会社 ーー 条件セル範囲 G1:H2 品番 相手先会社名 355F4 佐藤株式会社 ーー コード(マクロの記録) Sub Macro1() Range("A1:D8").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "G1:H2"), CopyToRange:=Range("J1:M9"), Unique:=True End Sub 実行結果 品番 品名 相手先会社名 備考 355F4 さしす 佐藤株式会社 「重複するレコードは無視する」にしているので、2行同じものがあっても、1行しか表示されない。 ーー D9は最終行だが、一般化して、この出し方(コード)などわかるよね。 条件セル(G1:H2)は、この操作が、エクセルの機能なので、シート上に置かないと仕方がない。 結果を第3のコンボなどのアイテムに設定したい場合は、一旦シートのセル範囲に出てしまうので、上記J-M列のデータをRowSourceプロパティで設定するか、セルを読み取ってAddItemするほか仕方がない。 ーー そろそろアクセスを利用すべきの域に入ってきたようだ。

関連するQ&A

  • Excel VBA の質問です

    ユーザーフォームの中のコンボボックスの値をリストから呼び出して選択したとき、テキストボックスの値を同じリストの別の列から表示させたいです 会社の仕事で品番と品名がありますが、必ず品番は一つの固定の品名を持っています。 なので、品番を製品のマスタからひろってきてるのでわざわざ品名を入力するのは面倒です 製品マスタは例えばA列の2行目に ある品番があればその品名がB列の2行目に必ずあります よろしくお願いします

  • エクセルVBA

    初心者です エクセル2003 ユーザーフォームのコンボボックスの連携について教えてください   Seet1       A     B     C     D      E     F           1   種類1   商品1  商品A  商品あ        コンボ1  2   種類2   商品2  商品B  商品い 3   種類3   商品3  商品C  商品う                4   種類4   商品4  商品D  商品え        コンボ2 5   種類5   商品5  商品E  商品お (1)コンボボックス1と2を別々のユーザーフォームで配置(ダブルクリックにて表示 F1とF4) (2)コンボボックス1でA列の種類を選択によりコンボボックス2のリストが変わる (3)コンボボックス1で選んだ種類をF1のセルに挿入 (4)コンボボックス2は種類1の場合はB列             種類2の場合はC列             種類3の場合はD列のリストとします (5)コンボボックス2で選択した商品をF4に挿入といった具合です 何度か挑戦しましたが、同一ユーザーフォームにコンボボックス2つは成功するのですが うまくいきません コード及びコード記入場所を教えていただけませんか よろしくお願いいたします

  • エクセルシートでVBAについての質問です。

    VBA初心者です。 エクセルのシート上にコンボボックスを配置してリストを選択すると同じシート上のセルに選択されたリストが表示されるようにしたいのですが、よくわかりません。 コンボボックスのオブジェクト名は名前ボックスに表示される名前でいいのでしょうか? 詳しい方ご教授お願いします。

  • エクセル VBA コンボボックスで検索

    エクセルVBA初心者です。 シート1行目には工場名、2行目に見出し、3行目からデータが記入されています。 2行目に見出しとして、A列には作業者名、B列に工事番号、C列から作業時間などが記入されています。 ユーザーフォームにコンボボックス、コマンドボタンを設置し、コンボボックスには工事番号一覧が表示されるようにするところまではできましたが、コンボボックスで工事番号を選択し、コマンドボタンを実行することで、1シート内の一致する行だけを表示したいのですが、いろいろなサイトを参考に試してみたのですがうまくいきませんでした。 同じ内容のシートが複数ありますが、シート毎での検索・抽出をしたいと考えています。 どのようなコードを作成したら良いのかご教授願えたら幸いです。 よろしくお願い致します。

  • EXCELで検索用のリストBOXを作りたいのですが

    お世話になっております。 EXCELで検索用のリストBOXを作りたいのですが、作り方を教えていただけないでしょうか? 現在、以下のような表がありまして、 顧客番号 会社名 都道府県 住所  TEL 001    A社   東京    ○○   ×× 002    B社   静岡    △△   □□ この表の上にツールボックスのリストボックスかコンボボックスを作って検索をかけたいのです。 リストボックスに会社名を入力すると(会社名の一部でも可)ヒットしたリストが出てきて、選択した会社の行がフィルタリングされて表示するようにさせたいのですが、そのような事が出来るのでしょうか? 宜しくお願いします。

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • エクセルVBAで納期管理するために

    エクセルVBAで納期管理を目的として 受注状況の確認や追加受注の入力をしたいと思っています 入力フォームをつくり その中に「年月日・品番」などを入力(選択式で)できるようにしたいと思っています まず最初にその入力フォームの中に「納期」というタイトルのラベルをつくり テキストボックスに年月日の数字を入力するのではなく ドロップダウンリストで選択式にしたいのですが(コンボボックス?) リストに呼び出すために年月日にあたる数字を他のシートに用意するのですか? いろいろサイトをみてみたんですがよくわかりませんでした よろしくお願いいたします

  • エクセルVBA コンボBOXの相互連動

    皆さんこんにちは。 エクセル2013を使用しています。 ネットや本では 地方名>都道府県名>市町村名のような 順にコンボボックスで行う絞り込み検索の方法が たくさん載っています。 コンボボックス1を選択しないとコンボボックス2・3の 選択肢は表示されないようなものです。 ですが、私がやりたいのは どのコンボボックスから選択しても 残りのコンボボックスが連動するものを作りたいのです。 おそらくやりたい事はオートフィルターだ!と思ったので 今、私の知りうる数少ない知識を駆使した結果がこれです。 (1)原本Sheetをコピー→コンボ用Sheetを作成 (2)コンボ用SheetのA~C列を列ごとに重複除去をし  除去した内容をE~F列に記載 (3)E~Fの内容をコンボボックス1~3のコントロールにする (4)コンボボックスのどれかを選択すると  そのコンボボックスのTEXTでオートフィルターがかかる、  原本Sheet対応列を絞り込み (5)コンボ用Sheetを削除 (1)~(5)エンドレス・・・みたいなコードでやりたい事に対応出来ましたが 何しろシートのコピー・削除が何回もあるので 重くて重くてとても使い物にはなりません。 どうにか重くならずに同じような作動をするコードはないでしょうか。 このような感じで原本Sheetは作成されております。 [原本Sheet]     A    B    C 1   駅名  顧客名  店舗名 2   ○    △    □ 3   ○    ▲    ■ 4   ◎    △    □ 5   ◎    ▽    ◇ 6   ●     ▽    ◆

  • excel vba ユーザーフォーム

    現在、セルa101からa110までに「商品名」、セルb101からb110までに「金額」が 入力済みです。 このデータを、ユーザーフォーム上にコンボボックスを2つ作成し、セルa1へ 商品名を選択後、入力。また、b2へ金額を選択後、入力させたいのです。 また、ユーザーフォーム上にテキストボックスを作成し、ここに入力した 「備考」の全角10文字をc1へ移動したいです。 今のところ、ユーザーフォーム、コンボボックス、テキストボックスを作成した だけで 立ち往生しています。 どなたか、ご教授お願いいたします。

  • エクセルVBA コンボボックスからの選択

    コンボボックスにある選択項目を選択した後、 エクセルの指定されたセルへ選択した項目を 貼り付けたいのですが、どのように指示したら よいのでしょうか? 例えば コンボボックス内の選択項目が A・B・Cとあったとします、その項目の 中からAを選択したら、作業中のsheetの A1のセルへAと表示させるにはどうしたら よいのでしょうか? アドバイスお願い致します。

専門家に質問してみよう