[[20040528091932]] 『一覧表から抽出するやりかた』(ゆずな) ページの最後に飛ぶ

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

 

『一覧表から抽出するやりかた』(ゆずな)

困っています。ぜひ教えてください。

 ID 商品名 取扱説明書 故障記録日 故障内容     

という項目の一覧表をsheet1に作っています。
これを別のsheet2で検索欄(入力場所?)を作成し、IDや故障内容などで検索(キーワード入力のやり方でも何でも良いのですが)すると表示されるものを作りたいと思っています。

以下の条件で作成を試みたいのですが、どのような方法がありますか?
ぜひご教授ください。

 @全てで5000件近くの情報が入っています。情報は今後も増える予定です。
 
 A故障内容、故障記録は1つの商品番号に複数入力されている事があり、各商品によっては入力されている数が異なります。(最低1、最高18ほどです。)
 
 B一覧表内での並べ替えが可能な状態にしたいです。
 
 CID、商品名...全ての項目から検索が可能な検索方法
 
 D一覧表と検索・結果表示場所は異なるシートにしたいと思っています。
 
 E商品名とIDは必ず同じではなく同じ商品名でもIDが複数あります。IDは必ず重複しない形にしたいと思っています。

 複雑で大変申し訳ありません。宜しくお願い致します。
 また、環境はexcel2000のWinです。


 フィルタオプションは試しましたか?

  (INA)


INAさん 早速のご返答有難うです。

フィルタのオプションを使用した事が無いので、よくわからないのですが、
それを行うと、上記@〜Eの条件をクリアできるのですか?

よければ操作方法をお教えください。(ゆずな)


 フィルタのオプションで可能ですが、条件を入れ替えるたびに設定をし直すのがちょっと面倒かも・・・
そこで、マクロの自動記録を使ってコードを書き出し、一部書き換えてみました。
(例)
Sheet1に以下のようなデータがあります。
  A   B     C      D       E
1 ID	商品名	取扱説明書	故障記録日	故障内容
2 1	パソコン	有り	5月1日	HDD故障、SW不良
3 2	プリンタ	無し	5月1日	インク切れ
4 3	パソコン	無し	5月2日	HDD故障
5 4	パソコン	有り	5月2日	SW不良
 
Sheet2に条件をA1:E2で設定します。
検索したデータは、A4:E6のように表示されます。
 
  A   B    C        D      E
1 ID	商品名	取扱説明書	故障記録日	故障内容
2						HDD*
3				
4 ID	商品名	取扱説明書	故障記録日	故障内容
5 1	パソコン	有り	5月1日		HDD故障、SW不良
6 3	パソコン	無し	5月2日		HDD故障
 
Sub Macro1()
    Sheets("Sheet2").Range("A4:E10000").Value = Null
    Sheets("Sheet1").Range("A1:E10000").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range("A1:E2"), CopyToRange:=Range("A4:E10000"), Unique:=False
    Sheets("Sheet2").Range("A4").Select
End Sub
 
Excel2002で作成しましたので、Excel2000でどうなるか確認していません。
使い物になりますでしょうか?
  
フィルタのオプションの使い方は↓のページにありました。参考になるでしょうか?
http://www.eurus.dti.ne.jp/~yoneyama/Excel/atfilter/filt-fra.htm
 (マーヤ)

マーヤさん 有難うございます。

早速マクロの設定を行うことにしました。ですがですが・・・・

マクロをどのように設定すればいいのかわかりませんでした。
マクロのvisual〜を選択すればいいのでしょうか?

やり方をお教えください。

無理を言ってしまい、済みませんです。
何卒宜しくお願い致します。   (ゆずな)


 マクロの設定手順が「エクセルの学校」の「ライブラリ」にありました。
こちら↓に解説がありますので、見てください。
(新)VBA入門Win http://www.excel.studio-kazu.jp/lib/e4a/e4a.html
 
コントロールツールボックスの「コマンドボタン」を使う場合は
下のようなコードになります。
なお、家のExcel2000で試したら、画面表示がおかしかったので、
2行追加しました。 (マーヤ)
 
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False  '←(1/2)追加しました。
Sheets("Sheet2").Range("A4:E10000").Value = Null
    Sheets("Sheet1").Range("A1:E10000").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range("A1:E2"), CopyToRange:=Range("A4:E10000"), Unique:=False
    Sheets("Sheet2").Range("A4").Select
Application.ScreenUpdating = True  '←(2/2)追加しました。
End Sub


 横からお邪魔します。
 方法はいくつかあると思うのですが、ご参考までに、、一案として提示させて頂きます。
 不要でしたら無視して下さい。
 まず、新規ブックを立ち上げてシート名を「データ」「抽出条件」「抽出先」にします。
 「データ」のシートにはフィールド(見出し)を適当に作っておきます。
 エクセル君がリストとみなせるものがいいです。
 次に「抽出条件」のシートには「データ」シートの見出しと一つ下のデータの部分までを
 コピーして貼り付けておきます。
 次に「抽出先」のシートを選択した状態で
 データ→フィルタ→フィルターオプション設定とします。
 次に「指定した範囲」と「重複したレコードは無視する」にチェックをいれます。
 後は、「リスト範囲」「検索条件範囲」「抽出範囲」をマウスで選択してOKを押す。
 「リスト範囲」はシートの「データ」
 「検索条件範囲」はシートの「抽出条件」
 「抽出範囲」はシートの「抽出先」のことです。
 以上の動作をマクロに記録しますと以下の様に記述されますので実際のデータに応用
 されてはいかがでしょうか?
Sub Macro2()
Sheets("データ").Range("A1:E3").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("検索条件").Range("A1:E2"), CopyToRange:=Range("A1:E23") _
, Unique:=True
End Sub
 後はこのMacro2を呼び出してあげればいいわけです。
 呼び出す方法はいくつかあると思いますが、
 ツール→ユーザー設定→ツールバー→でフォームにチェックを入れてフォームのツールバー
 を表示させてから一旦ユーザー設定のダイアログを閉じます。
 するとフォームのツールバーだけが残りますのでそこから「ボタン」をクリックしてシートの
 適当な位置にボタンを書きます。すると自動的にマクロの登録を求めてきますから「Macro2」
 を選択してOKを押します。次からはこのボタンをクリックするたびにこの「Macro2」が実行 
 されます。
 以上ご参考までに、、横から失礼しました。(koko)


マーヤさん、kokoさん有難うございました。
理想のものが出来上がってきました。

とても感謝いたします^v^)有難うございます。

あと、もう1つお教えいただければと思うことがあります。

マーヤさんの方の検索のやり方で、

 >  A   B    C        D       E
 >1 ID	商品名	取扱説明書	 故障記録日	 故障内容    ←見出し
 >2						    ←入力場所

 2の行に検索のキーワードを入れるかと思うのですが、
 もし検索のキーワードが不足の場合、*DD*と入れるとDDを含む文字(例えばHDDとかKDDIとか)が出ますよね?

 検索でマーヤサンのコードやkokoさんのコードを併用して、
 「* *」を入れずに検索してもDDを含む言葉を結果として表示させることが
 出来るようにするためには、なにかいい方法はないでしょうか??

 ご教授ください。宜しくお願い致します。(ゆずな)


 深く考えていませんので、不都合がでるかもしれませんが・・・
入力した文字列の前後に「*」をマクロ中で付けてやるのはどうでしょうか?
Application.ScreenUpdating = False    'この下に↓を追加したらどうでしょうか?
Sheets("Sheet2").Cells(2, 5).Value = "*" & Sheets("Sheet2").Cells(2, 5).Value & "*"
 
セルE2=Cells(2, 5)の例です。  (マーヤ)

 うーんとこれはどうなんでしょうか?ゆずなさんがどんなデータを持っていらしゃるかが
 分かりませんのでなんともいえませんが、多分「D」とだけ入力されても
 出ると思いますよ。というか出なかったら「そう言うものだ」と思ってください。
 実は私もよくこの「あどばんすてどふぃるたー」を使いますが結構拾ってくれますよ。
 この「あどばんすてっどフィルター」は別に特別な機能ではなくエクセル君が本来持っている
 機能ですからそういう事になっているとしかいいようがないですね。
 それから、私からのアドバイスとしてはなるべくフィールドの数を増やすことですね。
 つまり、日付も単に2004年05月30日と一つのフィールドにするよりも
 2004と05と30にわけてあげげるとそれだけ検索条件が増える事になりますからね。
 それから、これは余談ですがコマンドはどこに配置されましたか?
 この「あどばんすてっどふぃるたー」は基本的にコピー貼付けですから、
 抽出先をいつもクリアーにしてあげる必要があります。それ以外は、基本的に
 記録のままでいいのではないかと思います。
 作業の流れからしますと、
 1.データを入力する。
 2.検索条件を入力する。
 3.検索結果を見る。ですよね?
 もしもそれでよければ「抽出先」シートの見出しを右クリックしてコードを
 表示させてそこに↓を貼り付けて下さい。
 Private Sub Worksheet_Activate()
 'この中に抽出したいコードを貼り付けてください。
 End Sub
 Private Sub Worksheet_Deactivate()
 '抽出先のシートをクリアにするコードです。
 Range("A1").CurrentRegion.Clear
 End Sub
 これで、いつも最新のデータが抽出される事になりますが、ゆずなさんの意思とは
 無関係にコードが走りますから注意してくださいね。(koko)

 ちょっと説明を加えておきます。
Excel2000とExcel2002とではフィルタオプションの働きに違いがあるようです。
 
Excel2002は完全一致の検索ですがExcel2000は前方一致?のような検索になります。
先に回答しました、「入力した文字列の前後に「*」・・・」の後ろの方の「*」は
Excel2000では不要と思います。
 
例えば、Excel2000で「HDD」で検索すると「HDD故障・・・」も検索されますので。
Excel2002では「該当データ無し」になりますので、「HDD*」とします。
 
逆にExcel2000で“「HDD故障」のみ”の検索を行うには「="=HDD故障"」と入力します。
ちなみにExcel2002では「HDD故障」となります。
 
使う環境によって、条件の指定の仕方がちょっと異なるので、マクロでの処理方法も
環境まで考慮しないといけないような気が致します。
 (マーヤ)

 そうだったんですかぁ、、それは大変失礼しました。m(__)m

 >「* *」を入れずに検索してもDDを含む言葉を結果として表示させることが
 出来るようにするためには、なにかいい方法はないでしょうか??

 の代替案として検索条件のシートに↓を張るのはどうでしょうか?
 でもこれだといつも「* *」がついちゃうからだめですかね?
 Private Sub Worksheet_Change(ByVal Target As Range)
 Application.EnableEvents = False
 Cells(2, 5).Value = "*" & Cells(2, 5).Value & "*"
 Application.EnableEvents = True
 End Sub
 何れにしても横からお邪魔して混乱させてしまったようですみませんでした。
 マーヤ様 どうか気分を悪くなさらないでくださいね。
 m(__)m(koko)


マーヤさん。kokoさん。有難うございます。

早速教えていただいた方法で、作成してみました。
どちらもとてもよい感じでとても嬉しく思います。

 ところで、マーヤさんの方法で、**が2Eに表示されるようになり、
 その場所のみ**を入力不要で出来るようになりましたが、
 これを、2B、2D、2Eといった限定した複数にその条件をつける場合、
 どうすればよろしいでしょうか?
 (B、D、Eの列は、文字ほどの文章になっているのです。)

またkokoサンのコードでもこのような条件を付けることは出来ますか?

何かと質問ばかりで大変申し訳ありませんが、ご教授くださいです。


 B,D列の検索値にマクロで前後に「*」を付けるのでしたら、
Sheets("Sheet2").Cells(2, 2).Value = "*" & Sheets("Sheet2").Cells(2, 2).Value & "*"
Sheets("Sheet2").Cells(2, 4).Value = "*" & Sheets("Sheet2").Cells(2, 4).Value & "*"
を付け加えればよいかと思います。
B2セル:Sheets("Sheet2").Cells(2, 2).Value、D2セル:Sheets("Sheet2").Cells(2, 4).Value
ですので、この辺は使い勝手の良いように変更されたらよろしいかと思います。
 (マーヤ)

 私の場合は、「検出条件」シートの見出しを右クリックしてコードを表示させて
 そこに↓を貼り付けて下さい。(koko)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("B2:E2")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Target.Value = "*" & Target.Value & "*"
Application.EnableEvents = True
End Sub


 kokoさん、マーヤさん有難うございます。
 おかげですばらしいものが出来上がりました。
 感謝します。有難うございました。
 こんご、この一覧表をフル活用したいと思います^v^)   (ゆずな)


コメント返信:

[ 一覧(最新更新順) ]


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