[[20040611204057]] 『Excel VBAの AdvancedFilterについて』(jun) ページの最後に飛ぶ

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

 

『Excel VBAの AdvancedFilterについて』(jun)

 ある書籍でVBAの勉強をしているのですが、以下について理解できません。何らかのヒントをいただければ幸いです。
 「AdvancedFilter」メソッドを使って「三つ以上の抽出条件を満たすデータを取り出す」という技をマスターしたいのですが、書籍に「AdvancedFilterメソッドを使って複数の抽出条件を元にデータを抽出する際は、あらかじめ任意のセル範囲に抽出条件を表形式で入力しておく必要があります」とあり、その通りに抽出したい元の表の横(G1:I2)に「任意のセル範囲」というつもりで抽出条件入力のための表を設けたのですがさっぱりです。
しょうがないので下記ソースの.Range("G2").Value = "A"、 .Range("H2").Value = "B"、 .Range("I2").Value = "C"
 
 の部分でいちいち抽出条件を書き換えているのですが、これやりかたちがいますよね。
どのようにすると「任意のセル範囲」への入力でデータの抽出が出来るのでしょうか。
まだVBAについて超初心者なので説明が足りているか不安ですが、どうぞよろしくお願いいたします。

・以下が書籍にあるソースです。
Sub OutputRec()

    Application.ScreenUpdating = False
    Sheets("Sheet2").Activate
    Cells.Clear

    With Sheets("Sheet1")
        .Range("G1").Value = .Range("B1").Value
        .Range("H1").Value = .Range("C1").Value
        .Range("I1").Value = .Range("D1").Value
        .Range("G2").Value = "A"
        .Range("H2").Value = "B"
        .Range("I2").Value = "C"

        .Range("A3").CurrentRegion.AdvancedFilter _
            Action:=xlFilterCopy, _
            CriteriaRange:=.Range("G1:I2"), _
            CopyToRange:=Sheets("Sheet2").Range("A1"), _
            Unique:=False

        .Range("G1:I2").Clear
    End With

    Sheets("Sheet2").Columns("A:E").AutoFit
    Application.ScreenUpdating = True

End Sub


 人それぞれなので、やり方が違うとか言うことはないと思いますが、
こちらの検証では上記の状態でも動作は確認。
さらにその上で
        .Range("G1").Value = .Range("B1").Value
        .Range("H1").Value = .Range("C1").Value
        .Range("I1").Value = .Range("D1").Value
        .Range("G2").Value = "A"
        .Range("H2").Value = "B"
        .Range("I2").Value = "C"
および
        .Range("G1:I2").Clear
この部分を省いて、セルG1:I2へ表として
 
見出し2	見出し3	見出し4
A	B	C
 
のように入力して実行しました。
この状態でもちゃんと動作するようですが、
どのあたりが「さっぱり」なのでしょうか。
(KAMIYA)


ありがとうございます。

 こちらでの上記のコードでの動作状況を申し上げます。
sheet1に元の表があります。書籍添付のCD-ROMからコピーしたままの状態では、
「抽出のための表」はありません。このままマクロを実行するとsheet2にsheet1の
B1,C1,D1の見出しに合致したA,B、C、の値が抽出されて表示されます。

 次にsheet1の元の表のセルG1:I2に「抽出のための表」を追加し抽出条件にそれぞれ、
D,E,Fを入力しマクロを実行します。それでもsheet2の検索結果に変化はなく最
初のままです。しかも、sheet1に戻ると「抽出のための表」がなくなっています。

 そちらの検証では「上記の状態でも動作は確認」とのことですと、私に何か単純な
事柄についての思い違いや操作ミスがあるのでしょうか。

また、理解をするために以下について教えていただきたいと思います。

@.Range("A3").CurrentRegion.AdvancedFilter の("A3")はどういう意味になるのでしょうか。
 

A .Range("G2").Value = "A"
   
.Range("H2").Value = "B"
   
.Range("I2").Value = "C"のA,B,Cは抽出条件を変えて検索するたびに自動的に
書きかわるのですか。
  是非、お教え下さい。
(jun)


 横からお邪魔します。
 色々な方法があると思いますが、先ず、実際の流れ(動き)をマクロ記録されてから
 マクロを変更されてはいかがでしょうか?
 そこで一案として提示させて頂きます。。。

 先ず、新規ブックを立ち上げて
 シート名を「リスト」「抽出条件」「抽出先」とします。
 「リスト」のシートに適当な項目を設定します。
 例
 項目A 項目B 項目C
 4444  5555 7777
 4875  4587 4587
 ・・  ・・  ・・
 例えばこんな感じです。

 次に項目Aから7777までをコピーしてシート「抽出条件」の
 A1に貼付けます。

 次にシート「抽出先」を選択した状態で
 データ→フィルター→フィルターオプション設定→
 指定した範囲にチェック→重複するレコードは無視する。
 にチェックを入れます。

 リストの範囲→シート「リスト」
 抽出条件範囲→シート「抽出条件」
 抽出範囲→シート「抽出先」です。

 以上の動作をマクロに記録しますと以下の様に記録されますので、

 実際の作業と比較されてはいかがでしょうか?

Option Explicit

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2004/6/12 ユーザー名 :

    Sheets("リスト").Range("A1:C14").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("抽出条件").Range("A1:C2"), CopyToRange:=Range("A1:C50") _
        , Unique:=True
End Sub

.Range("A3").CurrentRegion.AdvancedFilter の("A3")はどういう意味になるのでしょうか。

 因みに、A3からC13までデータが入力されている状態で
 A3を選択して「Ctrl+*」とキー操作します。
 これをマクロで記録しますと以下の様になります。

 Sub Macro2()
'
' Macro2 Macro
' マクロ記録日 : 2004/6/12  ユーザー名 :

    Range("A3").Select
    Selection.CurrentRegion.Select
End Sub
 >A,B,Cは抽出条件を変えて検索するたびに自動的に
 書きかわるのですか。

 これがいまいちよく分かりませんが、抽出条件をかえるのは、、
 junさんですよね。
あっ、それから、まる文字は機種依存ですから掲示板では使用しない方がいいですよ。
(koko)


 基本的にExcelの動作に関しても、コードの解釈一つ一つに関しても
理解不足であると思います。私のレスをよく読んでください。
        .Range("G1").Value = .Range("B1").Value
        .Range("H1").Value = .Range("C1").Value
        .Range("I1").Value = .Range("D1").Value
        .Range("G2").Value = "A"
        .Range("H2").Value = "B"
        .Range("I2").Value = "C"
この部分は「抽出のための表」をマクロで書いている部分です。そして、
        .Range("G1:I2").Clear
この部分は「抽出のための表」を消している部分です。
つまり、サンプルのマクロでは自分で「抽出のための表」を勝手に書いて、
抽出が終わったら「抽出のための表」を勝手に消しているのです。
 
コードを書き換えずに「抽出のための表」をいくら入力したとしても
勝手に書き換えてしまうのですから、消されてしまいますよね。
シートに「抽出のための表」を自分で書いて実行したければ、
        .Range("G1").Value = .Range("B1").Value
        .Range("H1").Value = .Range("C1").Value
        .Range("I1").Value = .Range("D1").Value
        .Range("G2").Value = "A"
        .Range("H2").Value = "B"
        .Range("I2").Value = "C"
および
        .Range("G1:I2").Clear
この部分をコメント化するか、削除するかしてからでないと
マクロは同じ動作を繰り返すだけです。
サンプルをただ利用するだけでは上達はしません。
kokoさんの書いているように、一度
「自分の作った表で」
「自分の手でフィルタオプションの設定を記録」してみては
いかがですか?
(KAMIYA)


色々とありがとうございます。

 アドバイスいただいた通りにやってみます。
私の場合、少々鈍いので時間が掛りますが必ず
理解してみたいと思っています。もうちょっと
マシな質問が、出来るようになったら再び質問
させて下さい。
よろしくお願いいたします。(jun)


 お書きになっている内容が非常に危なっかしかったもので、
つい「理解不足」という言葉を使ってしまいました。
言葉が過ぎていました。読み返して反省してます。
遅いかもしれませんが、スミマセン。
 
サンプル集は便利な反面、基礎の部分をすっ飛ばしている
物が多いので、理解せずに使うのはやはりよろしくない。
(前掲のサンプルも画面更新もOFFにしているので、
そのままではステップインでの動作確認(デバッグ)も出来ない。
その意味であまり勉強向きのサンプルではないです)
 
面倒くさいですが、一行一行がどんな意味の命令文なのか、
理解しながら勉強してみてください。とにかく解らない単語があったら
カーソル合わせてF1キーでヘルプ表示です。
(KAMIYA)


とんでもありません。

私にとって大変ありがたいサイトだと思っております。
間違いなく大いなる参考になっております。
そもそも私ごときが"VBA"に手を出すのが早かったのかも
知れません。でも親切にお答えいただきましたので少しづつ
ですが理解の方向に帆が向いていると思います。
こんなに面白い世界はありませんよね。
どうぞ皆様によき回答者になってあげてください。
今後ともよろしくお願いいたします。


 横からお邪魔してまた、また、混乱させてしまったかなと反省しております。
 KAMIYAさん junさんどうもすみませんでした。m(__)m
 ところで、同じHNの方がいらっしゃったのでびっくりしちゃったですぅ。。。
 今すぐに思い浮かばないのでとりあえず(夏目雅子似)にしときますぅ。^^;
 もう、あまりお邪魔することもないかと思いますが、いつも楽しみに
 拝見させて頂いておりますので、みなさん頑張ってください。
 また、わからない事がありましたらお邪魔しますので、その時は
 よろしく、お願い致します。(夏目雅子似)

(夏目雅子似)様 ありがとうございます。

前に回答いただいた通りにシートを分けてやって見ましたらうまく行きました。
解かり易く説明いただいたので、なんとなくですがコードの流れがつかめました。なるほどなと思いました。さっそく「三つ以上の抽出条件を満たすデータを取り出す」という事を実用させたいと思います。私の仕事で受注表というのがありまして、その受注表の中からある特定の期間の特定の顧客データを抽出するという作業をしたいと思っておりまして、そこである書籍でたまたま見つけた「AdvancedFilter」というメソッドを適用すればと思いました。それでも他にもっと良い方法がありましたらヒントをいただければと思います。

余計な質問で恐縮ですが、この掲示板の書き込み方ですが、回答者の方々のような文字の大きさでの入力や、改行の方法がわからないのですが教えていただけませんか。

既に使われているHNを使っているようで、ごめんなさい。

よろしくお願いいたします。(jun)


 この掲示板の書き込み方は「編集」画面の下に「テキスト整形のルール」が掲載されています。
下に文字の大きさの具体例を書いてみます。

行頭から書き込むと、このように大きな文字になるようです。

 半角スペースを空けて書き込むと、このように小さな文字になるようです。

 改行は行頭から書き込んだ場合は、空白行を入れると、段落区切りで改行?になります。
(Enterのみは無効で、連続行として扱われるようです。)
先頭に半角スペースで書き始めると通常の改行(Enter)でOKのようです。

なお、IEでは文字の大きさが異なりますが、Netscapeでは全て小さい文字のようです。
ブラウザによって、異なるようです(^^;)

 また、こちら↓に簡単な説明があります。
http://www.hyuki.com/yukiwiki/wiki.cgi?TextFormattingRules
ただし、↑はYukiWiki 2.1.2 のようですので、こちらのYukiWiki 1.6.7 とは
異なる部分があるような気がします。参考になるかもしれません。
  (マーヤ)

コメント返信:

[ 一覧(最新更新順) ]


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