[[20150123160233]] 『ドロップダウンリストのあいまい検索について』(とも) ページの最後に飛ぶ

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

 

『ドロップダウンリストのあいまい検索について』(とも)

現在、会社名の検索をリストから選択でドロップダウンを使用しています。
しかしながら、会社名が多いので、検索するのに結局時間がかかってしまいます。
そこで、検索セルでドロップする前のセルにリスト内で共通する文字を手打ちして、
あいまい検索の結果で候補を絞り込むといった方法を教えていただけないでしょうか。

いろいろネット検索をしてみたのですが、マクロを実行しなければならないですか?
私はマクロがまったくの素人なので、コード解読が出来ず・・・ここで質問させていただきました。

『工事完了報告書』というシートのC4セルにドロップダウンを設定しています。
『会社リスト』というシートのB列に会社名リストがあります。
ちなみにC列はフリガナ記載しています。

以上です。
何卒よろしくお願いします。

< 使用 Excel:Excel2007、使用 OS:unknown >


 ドロップダウン ⇒ オートフィルタでOK?

	A	B	C	D	E
1	検索	*(株)			
2					
3				         ▼	
4				(株)AAA	
5				(有)BBB	
6				CCC株式会社	
7			D(株)	D(株)	
8				E(有)	
9				FF有限会社	
10				G Co.LTD	

 B1に検索文字

 C4 =IF(COUNTIF(D4,$B$1),D4,"")  下へコピー。

 C列でフィルタ。
 
(GobGob) 2015/01/23(金) 16:26

(GobGob)さん

コメントありがとうございます。
せっかくアドバイスいただいたのですが、別のセルで検索するのですはなく、
出来ればC列、具体的にはC4セルでドロップダウン検索がしたいと思っております。
C4セルに、会社名の一部を入力し、▼ボタンを押すと、該当の会社名候補が表示されるように
したいのです。

関数では無理なのでしょうか??

(とも) 2015/01/23(金) 17:17


これでは?
 http://www.excel.studio-kazu.jp/kw/20130414233352.html
(ペリカン) 2015/01/25(日) 20:38

 (ペリカン)さん紹介のスレは、あらかじめ企業名にグループコードを割り当ててグルーピングしておくものなので
 あいまい検索には、ちょっとあわないかなと思います。

 それより、C4のドロップリストにこだわっておられますが、ふつうのオートフィルターにしておいて
 ○○を含むもの という抽出を行えばいいんじゃないかと思うんですが?

 C4のドロップダウンにこだわるなら、どこか別のセルに検索ワードをいれ、ドロップダウンリストが相手にしている
 領域に上詰めで、該当のものを顧客リストからセットする、そこを関数で処理しておけばと、思いつきというか
 私には無理ですが、そういったことは、関数専門家の皆さんなら、さらっと、できるのでは?

(β) 2015/01/25(日) 21:01


(β)さん

コメントありがとうございます。

>それより、C4のドロップリストにこだわっておられますが、ふつうのオートフィルターにしておいて
>○○を含むもの という抽出を行えばいいんじゃないかと思うんですが?

私1人が使う資料ではなく、社員全員が使う資料を作成中です。
出来るだけ入力箇所を少なくする工夫と、簡単に検索出来ることを目標にしています。
オートフィルタではなく、あいまい検索にこだわりたいのです・・・。
すいません。

過去ログを拝見したのですが、結局はマクロじゃないと対応できないのでしょうか。
マクロのコードを解読できなかったので、私の求めるコードか分かりませんでした(T_T)

どなたか、ド素人で大変恐縮なのですが、教えてもらえないでしょうか?

(とも) 2015/01/28(水) 15:56


 「オートフィルタではなく、あいまい検索にこだわりたいのです・・・。 」

 オートフィルターで【あいまい検索】をやればどうだろうと申し上げているんですが・・
 まぁ、諸般の事情でオートフィルターは避けたいということなんでしょうね。

 ところで、C4のドロップダウンリスト、ずっと、入力規則をイメージしていましたけど、
 それでいいんですか?
 それとも、フォームツールのドロップダウンやActiveXのコンボボックスがC4に配置されているのでしょうか?

 いずれにしても、少し矛盾がないでしょうか?
 C4に AAA といれると、AAAを含むリストが(どこかのマスタから抽出されて)表示されたとしましょう。
 で、その中から 株式会社AAA商事 というのを選んだとしましょう。
 選んだということは C4に入るということですよね。
 そうすると、C4に入った値、つまり株式会社AAA商事で、あいまい検索をしてしまいますね。
 で、マスタの中には、株式会社AAA商事1つしかないはずですから、そこでできあがるリストは
 株式会社AAA商事だけのリストですね。

 ここで、操作者が、あっ!しまった! 有限会社AAA商会だったということで、▼をおして選びなおそうとしても
 そこには 株式会社AAA商事 しかでていないですよね。
 しょうがないから、もう一度、AAA といれて、リストを復元? なんてことを操作者はやりませんよね。

 ですから、入力規則であれ、フォームツールのドロップダウンであれ ActiveXのコンボボックスであれ
 あいまい検索用にいれる値は、C4【以外】のところにいれなきゃいけませんよね?

 この点、いかがですか?

(β) 2015/01/28(水) 20:01


 とりあえず、入力規則だということで。

 前述の通り、C4 にあいまい検索文字をいれることはできませんので B4 にいれてください。
 会社リストのB列の先頭(B1)にはタイトルが入っているという前提です。
 また、会社リストの W〜Z列を作業列に使います。

 C4に入力規則を設定するシートのシートタブを右クリックして、コードの表示を選んでください。
 そこであらわれたところに(シートモジュール)以下のコードをコピペで貼り付け、右上のXボタンをおして
 シートに戻ってください。

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim a As String
    Dim x As Long

    Set c = Target(1)
    If Intersect(c, Range("B4")) Is Nothing Then Exit Sub
    If c.Value = Empty Then Exit Sub
    'c.value でフィルターオプション
    With Sheets("会社リスト")
        'W〜Z を作業域に使用
        .Columns("W:Z").Clear
        .Range("X1").Value = .Range("B1").Value     '会社名タイトル
        .Range("X2").Value = "*" & c.Value & "*"    'あいまい検索文字列
        .Range("Z1").Value = .Range("B1").Value     '抽出領域タイトル
        .Columns("B").AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=.Range("X1").CurrentRegion, CopyToRange:=.Range("Z1"), Unique:=False
        With .Range("Z1").CurrentRegion
            If .Rows.Count = 1 Then x = 1
            a = .Cells.Offset(1).Resize(.Rows.Count - 1 + x).Address(External:=True)
        End With
    End With

    Application.EnableEvents = False

    'C4の入力規則の再設定
    With Range("C4").Validation
        On Error Resume Next
        .Delete
        On Error GoTo 0
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & a
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .IMEMode = xlIMEModeNoControl
        .ShowInput = True
        .ShowError = True
    End With

    Application.EnableEvents = True

    Range("C4").Activate

 End Sub

(β) 2015/01/28(水) 20:52


 単純に…^^;

 リストに あ・か・さ・た・な… と追加して並べ替え。
 ドロップダウンが設定されているところに、例えば、
 「か」を入力してドロップダウンのボタンを押すと、
 「か」からのリスト表示になりますが、どうでしょう?
 入力した文字によりリストが絞られていくということは
 出来ませんし、いろいろと大変な面もありますが、
 そんなにエクセルの知識を持っていなくても出来るので
 自分だったらこの方法をとると思います^^;

(とっても初心者) 2015/01/28(水) 21:05


 とっても初心者さんの意見が正しいと思いますねぇ。
 その考え方を拡張して、リストに手を加えてこんな感じでいかがでしょう?

 サンプルデータに使った企業名は、以下から引用しました。
http://www.yurai.jp/archives/company_name/

 工事完了報告書シート
	[B]		[C]	[D]
[1]	アグレックス	1	アグレックス
[2]	ジューテック		アイエヌジー
[3]	鈴木金属工業		アイエー
[4]	東計電算		アイ・オー・
[5]	JALUX			アイコム
[6]	JSAT			アイシン精機
[7]	シチエ		
[8]	名機製作所		
[9]	アイエヌジー	9	
[10]	アイエー	10	
[11]	あいおい損害		
[12]	アイ・オー・	12	
[13]	愛光電気		
[14]	アイコム	14	
[15]	愛三工業		
[16]	アイシン精機	16	

 C1=IF(ISERROR(FIND(工事完了報告書!$C$4,B1)),"",ROW())
 D1=IFERROR(INDEX($B:$B,SMALL($C:$C,ROW(A1))),"")

 C列を選択し、数式→名前の管理で「カウント」という名前を付ける
 D列を選択し、数式→名前の管理で「抽出リスト」という名前を付ける

 工事完了報告書シート
	[C]
[4]	ア

 C4の入力規則、リストに以下の式を入れる
 =OFFSET(抽出リスト,,,COUNT(カウント))
 エラーメッセージタブの「無効な〜〜」のチェックを外す

 これで「ア」を入力すれば「ア」を「含む」企業名がリストに出るはず。

 もし「ア」から始まる等検索したければ、GobGobさんのCountifを使った式を使ったほうがいいかも。
 ワイルドカード使えるし。
 ただし、ワイルドカードの使い方を「みんな」が知っているとは限らないので、これで十分だとは思う。

(稲葉) 2015/01/29(木) 09:11


βさんの式が自分の用途に合っていてぜひ活用させて頂きたいのですが、
複数行同じように使えるようにするためにはどのように書換えを行えば実現出来るのでしょうか。
B4,C4セルを下方向へコピーすると、リストボックスは各行に現れますが、抽出条件は各行全てB4を参照してしまいます。

下記のいずれかの箇所を変更すべきなのかと想像していますか、ご教示頂けないでしょうか。
よろしくお願いします。

If Intersect(c, Range("B4")) Is Nothing Then Exit Sub

    If c.Value = Empty Then Exit Sub

Range("X2").Value = "*" & c.Value & "*"

(nob) 2015/10/13(火) 16:33


 別トピを立てられたほうがいいとおもいますけど、とりあえず。

 B4を先頭にB列に値が入れば、その行のC列に、あいまい検索をした結果の入力規則を設定します。
 要件誤解していれば指摘願います。

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim a As String
    Dim x As Long
    Dim r As Range

    Set r = Intersect(Target, Range("B4", Range("B" & Rows.Count)))
    If r Is Nothing Then Exit Sub

    For Each c In r

        If Not IsEmpty(c) Then
            'c.value でフィルターオプション
            With Sheets("会社リスト")
                'W〜Z を作業域に使用
                .Columns("W:Z").Clear
                .Range("X1").Value = .Range("B1").Value     '会社名タイトル
                .Range("X2").Value = "*" & c.Value & "*"    'あいまい検索文字列
                .Range("Z1").Value = .Range("B1").Value     '抽出領域タイトル
                .Columns("B").AdvancedFilter Action:=xlFilterCopy, _
                    CriteriaRange:=.Range("X1").CurrentRegion, CopyToRange:=.Range("Z1"), Unique:=False
                With .Range("Z1").CurrentRegion
                    If .Rows.Count = 1 Then x = 1
                    a = .Cells.Offset(1).Resize(.Rows.Count - 1 + x).Address(External:=True)
                End With
            End With

            Application.EnableEvents = False

            'C列の入力規則の再設定
            With c.Offset(, 1).Validation
                On Error Resume Next
                .Delete
                On Error GoTo 0
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="=" & a
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .IMEMode = xlIMEModeNoControl
                .ShowInput = True
                .ShowError = True
            End With
        End If
    Next

    Application.EnableEvents = True

    r.Cells(1).Offset(, 1).Activate

 End Sub

(β) 2015/10/13(火) 20:00


βさん、早速のご指導ありがとうございます。
素晴らしいです!お陰さまで実現出来ました。感謝いたします。
別トビを立てるべきだったとのこと失礼致しました。

リストが表示されるC4セルに移動した際に表示を自動化させたく、SendKeys "%{Down}" を追加してみたのですが、どの箇所へ挿入してもエラーになってしまいました。
この点のみ追加でご教示頂けませんでしょうか。
(nob) 2015/10/14(水) 10:37


 こちらでは、最後の r.Cells(1).Offset(, 1).Activate の下に SendKeys "%{Down}" を記述することで
 自動的にリスト表示になりますが?

(β) 2015/10/14(水) 12:03


βさん再び早速のご指導ありがとうございます。
最後に追加するべきだったんですね、、申し訳ありません、同箇所のみ試していませんでした。
お陰さまで完結できました。本当にありがとうございました。

(nob) 2015/10/14(水) 14:02


コメント返信:

[ 一覧(最新更新順) ]


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