[[20091002155247]] 『オートフィルタの設定』(あき) ページの最後に飛ぶ

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

 

『オートフィルタの設定』(あき)

 Sheet1のA1セルに入力した値を、Sheet2のオートフィルタの値にしたいと思っているのですが、
 そういうのは可能でしょうか?

 出来ればマクロで教えていただけたら助かります。
 よろしくお願いします。


 可能だと思います。

 まずは、Sheet2のオートフィルタで
 項目を一つ選んで絞り込む作業
 (仮に「あいうえお」と言う文字)を
 記録にとってみられるのが良いと思います。

 出来たコードの、「あいうえお」の部分を
 「Sheet1のA1セルの値」と言うコードに変更すれば
 良いのではないかと思います。

 上手く行かない様であれば
 記録結果をこちらへ貼り付けてください。

 マクロの記録は↓を参考に。
http://www.excel.studio-kazu.jp/lib/e4b/e4b.html
 ライブラリより「マクロの自動記録」

 (HANA)

 HANAさん、ありがとうございます。

 さっそくやってみました。
 出来ましたが、「Sheet1のA1セルの値」は毎回手入力させたい場合は
 どのようにしたら良いのでしょうか?
 例えば支払いデータの一覧があって、支払日を 「Sheet1のA1」に入力すると、
  Sheet2の一覧にオートフィルタがかかって表示出来たらラクだな、と思っています。

 マクロのオートフィルタでは次のようになっていて、

     Selection.AutoFilter Field:=2, Criteria1:="いいい"

 "いいい"のところにシート名とセルの番地を書き込めばいいのかな?と思ったのですが、
 その書き方が分かりません。

 教えていただけますでしょうか。
 すみませんがよろしくお願いします。

(あき)


 >支払日を 「Sheet1のA1」に入力すると、
 >Sheet2の一覧にオートフィルタがかかって表示出来たらラクだな
 と言う事であれば

 Sheet2の一覧がA1セルから始まっている場合で
 Sheet2のオートフィルタで他の列の絞り込みが
 行われていない と言う条件で、簡単に
 ↓をSheet1のシートモジュールに貼り付けてみて下さい。
     ~~~~~~
 '------
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "A1" Then
        Sheets("Sheet2").Range("A1").AutoFilter _
            Field:=2, Criteria1:=Range("A1").Value
    End If
End Sub
 '------

 Sheet2では、オートフィルタで他の絞り込みがされている可能性が在り
  それは解除して表示させたい
 Sheet2の一覧表はA1セルから始まっていない
 等、詳しいご要望が有る場合は
 コードの変更が必要になります。

 (HANA)

 そう言えば・・・
 >支払日を 「Sheet1のA1」に入力すると
 日付(値)を抽出するのであれば
 表示形式と揃えないと
 上手く行かないかもしれません。

 上手く行かない場合は、その辺りの事も
 詳しく教えて下さい。

 (HANA)

 HANAさん、すごいです。できました!

 ですが、ご指摘通りシステム日付や数値の場合はうまく出来ません。
 何か設定が必要でしょうか?

 現在の表示形式は、文字表示でダイレクトに「20091031」と入力し、
 Sheet2の列(B列)も同様にしています。
 システム日付で確認もしましたが、表示形式もあわせています。
 この表示形式はマクロ上で設定しなおなさないとダメなのでしょうか?
 フォーマット自体に設定させているのは、同じとみなされないのでしょうか?

 Sheet2では、オートフィルタで他の絞り込みがされている可能性はありません。
 また、Sheet2の一覧表はA1セルから始まっているので問題ありません。

 それと、今現在マクロは下のようになっていますが、
 下の「Criteria1:="いいい"」のところはそのままで良いのでしょうか?

 Sub Macro2()
    Sheets("Sheet2").Select
    Cells.Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:="いいい" ←ここ
    Range("B7").Select
 End Sub

 (あき)

 済みません、今日はもう帰ってしまいます。
  (しばらくレス出来ません。)
 ので、まずは 質問だけ。。。

 >現在の表示形式は、文字表示でダイレクトに「20091031」と入力し、
 >Sheet2の列(B列)も同様にしています。
 つまり【日付としては入力していない】と言う事ですか?

 どちらも値で入っているなら
 問題無さそうに思いますが。。。

 両方のセルの書式設定(表示形式)は
 標準 ですか?

 >ご指摘通りシステム日付や数値の場合
 ってことは、Sheet1のA1セルに =TODAY()
 とかって、やってあった?

 (HANA)


 HANAさん

 >つまり【日付としては入力していない】と言う事ですか?
 はい。両方とも試してみました。
 日付と文字と両方です。

 書式設定は、「文字」にしたり「日付」にしたりしました。
 何度も確認したので、違いはないと思います。。。

 =TODAY()は試していません。
 これから試してその回答を載せておきます。

 お帰り間際にありがとうございます。
 お時間の空いてるときに教えていただけたら嬉しいです。
 よろしくお願いします。

 (あき)

 HANAさん

 =TODAY()を試してみましたが、ダメでした。
 一覧データのSheet2の列(B列)の値を「Alt+;」で設定してみたりもしました。

 お手数かけますが、よろしくお願いします。

 (あき)

 遅くなりました。

 >はい。両方とも試してみました。
 ではなく
 「実際のデータがどの様に成っているのか」
 を教えて下さい。
 そうでないと、どの様なデータを想定して
 コードを作れば良いのか分かりません。

 取りあえず、新しいブックで以下の物を作成してください。
 Sheet2に ↓のデータ。
	[A]	[B]	[C]
[1]	項目1	項目2	項目3
[2]		20091001	
[3]		20091001	
[4]		20091001	
[5]		20091002	
[6]		20091002	
[7]		20091002	
[8]		20091003	
[9]		20091003	
[10]		20091003	
 こちらからコピーして、エクセルに
  形式を選択して貼り付け→値
 で貼り付けてもらうと
 セルに分かれて貼り付きますので
 行列番号を削除して
 B1セルに「項目2」が来るようにしてください。

 念のために書いておきますが B列の値は
 2009/10/1 を表示形式で 20091001 としているのではなく
 書式設定が標準のセルに 20091001 と入力します。
 数式バーにも 20091001 と表示される事を確認して下さい。

 次に、Sheet1のシートモジュールに先ほどのコード
 '------
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "A1" Then
        Sheets("Sheet2").Range("A1").AutoFilter _
            Field:=2, Criteria1:=Range("A1").Value
    End If
End Sub
 '------
を貼り付け。

 Sheet1のA1セルに「20091002」と入力して
 Sheet2をみると、20091002のデータが抽出されていると思います。
  コードを実行すると、勝手にオートフィルタも設定されます。

 Sheet1のA1セルの値を変更すると
 該当の値と一致する値のデータが抽出されます。

 これで上手く行くようなら
 B列の値が 実際のデータとどの様に違うのか
 教えて下さい。

 (HANA)

 HANAさん、ありがとうございます!
 指示いただいたサンプルを行ったところ、うまく出来ました。
 解読に時間がかかって、遅くなりました。
 (完全に解読出来ていませんが・・)

 WrokSheet_Change と言う事でシートのセルが異動したら自動計算しているようですが、
 毎月一日に翌月支払い分を抽出して、該当データを印刷しているので、
 それも一括で処理しようと試行錯誤しています。
 現在のは入力したら自動的にオートフィルタがかかっていますが、
 これを「ボタン」を押したらと言うことに変更したいです。
 ちなみに、そんな単純ではないのでしょうが下のようにししてみたらダメでした。

 Sub m1()

    If Target.Address(0, 0) = "A1" Then
        Sheets("Sheet2").Range("A1").AutoFilter _
            Field:=2, Criteria1:=Range("A1").Value
    End If

 End Sub 

 今回、マクロ使えたら便利だなと思って仕事の合間に勉強を始めたばかりなので、
 教えていただけたら助かります。

 (あき)

 >WrokSheet_Change と言う事でシートのセルが異動したら自動計算
 惜しいです。
 WrokSheet_Change と言う事で
  セルの【値が変更】されたら、自動【実行】
 です。

 >これを「ボタン」を押したらと言うことに変更したいです。
 寧ろ、通常はこの様にすると思います。
 今回は詳しい話を聞く前から
 >支払日を 「Sheet1のA1」に【入力すると】
 >Sheet2の一覧にオートフィルタがかかって表示出来たらラクだな
 と言う事だったので、Changeイベントを使いましたが。。。。

 ボタンを押すとマクロが実行されるように変更するわけですが
 マクロが実行されるときにアクティブに成っているシートは
 どこでしょう?
  Sheet1? Sheet2?
  どこがアクティブに成っているかは未定?

 (HANA)

 HANAさん、ありがとうございます。

 > セルの【値が変更】されたら、自動【実行】

 勉強になります。

 素人なので「入力する」と、「ボタン」にと言う区別がつきませんでした。
 作成していると色々分かってきて、面白いような難しいような。。。
 メソッドなど聞き慣れない言葉に振り回されています。

 シート名は思いっきり単純ですが、
 入力するシートは「入力」、データは「データ」にしようかと思っています。

 アクティブは「入力」シートです。

 (あき)

 入力シートのA1セルに入力してボタンをおしたら
 データシートで【密かに】絞り込みが行われている
 って塩梅ですか?

 >毎月一日に翌月支払い分を抽出して、該当データを印刷しているので、
 >それも一括で処理しようと試行錯誤しています。
 入力シートで入力してボタンをおしたら
  データシートで絞り込みが行われて
  印刷されたら ハッピー
 って事?

 そしたら、簡易的な物ですが。。。

 '------
Sub Aki()
    With Sheets("データ")
        .Range("A1").AutoFilter _
            Field:=2, Criteria1:=Range("A1").Value
        .PrintPreview
        .AutoFilterMode = False
    End With
End Sub
 '------

 ≪注≫テストのため、PrintPreview にしてあります。
    確認して良い様なら、PrintOut にして下さい。

 もしかして、入力シートの方も印刷が必要だったりして。

 (HANA)

 HANAさん、ありがとうございます。
 早くてなかなかついていけません・・。
 入力シートの印刷は必要ありませんので大丈夫です。
 HANAさんの言うとおりでハッピーなのですが、質問です。

   1) With Sheets("データ")
   2)    .Range("A1").AutoFilter _
           Field:=2, Criteria1:=Range("A1").Value
   3)   .PrintPreview
   4)   .AutoFilterMode = False
   5) End With

 1)は、"データ"シートで次の処理をしてね、と言う宣言。
 2)ここでオートフィルタをしている。
   "データ"シートのA1からデータがあるので、A1を指定。
  その時、"Field:=2" = B列の値を"入力"シートのA1の値と同じものを表示する。
 3)プリントフリビューを表示。
 4)オートフィルタを外す。
 5)ここで処理はお終い。

 と言う解読でいいのでしょうか?

 入力シートの入力するセルを、B9にしようと思ったのと、
 支払日がデータシートのR列にあるので、下のようにしました。

    With Sheets("データ")
       .Range("A1").AutoFilter _
           Field:=18, Criteria1:=Range("B9").Value
      .PrintPreview
      .AutoFilterMode = False
    End With

 「RangクラスのAutoFilterメソッドが失敗しました」と言うメッセージが出てしまいました。
 でも、サンプルで列やセルを変えてもオートフィルタでデータが出てくるので、
 元々の書式設定が異なるのかも知れません。。。

 と、思ったら出来ました!
 分かりました!
 書式設定の表示が「*2009/03/14」と「2009/03/14」となっていたのでダメでした!
 "/"があったし、日付形式だったので、見落としていました。。。

 ありがとうございました!

 (あき)


 >と言う解読でいいのでしょうか?
 おおよそ良いと思いますが With の辺りが不安に思います。

 例えば、該当のコードは With を使わずに
    Sheets("データ").Range("A1").AutoFilter _
        Field:=2, Criteria1:=Range("A1").Value
    Sheets("データ").PrintPreview
    Sheets("データ").AutoFilterMode = False
 と書くのと同じです。

 しかし、「Sheets("データ")」が目障りですよね。
 そこで、With でまとめてしまいます。

 つまり
  1) これ以降の 「.」の前には「Sheets("データ")」が付いていると見なす。
  5) 「Sheets("データ")」が省略されているのはココまで
 って感じです。

 >と、思ったら出来ました!
 無事に変更出来ましたか?

 >毎月一日に翌月支払い分を抽出して、該当データを印刷しているので
 と言う事ですが、現在のコードだと一日分しか抽出出来ませんよね?
 支払いの日付は特定の日付で入力してあるから日付指定で良い
 って事かな?

 (HANA)

 HANAさん、ありがとうございます。

 > しかし、「Sheets("データ")」が目障りですよね。
 >そこで、With でまとめてしまいます。

 "."で始まるのは、Withの中のみ、と記述があり、
 それは省略していると言うことなのですね。

 異なるシートで処理を行いたい場合は、省略しなければWithの中で指定出来るのでしょうか?
 その場合はWithを使用せずにした方がいいのでしょうか?

 なんとか無事に出来ました。
 ありがとうございます。

 基本的に支払日は月末が多いので日付指定で大丈夫ですが、
 一応処理漏れが無いように違う場合のデータを出そうと思って、
 「入力した日付と異なる場合」は、=ではなく、<>で書けば良いと思ったのですが、
 違うみたいでした・・。

 マクロの記録を参考にしたのですが、Rangeでしている場合は違うんですね。

 '----

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "A1" Then
        Sheets("Sheet2").Range("A1").AutoFilter _
            Field:=2, Criteria1:=Range("<>A1").Value   ←ここ
    End If
 End Sub

 '-----

 簡単にはいかないのですね。。。

 (あき)


 >異なるシートで処理を行いたい場合は、省略しなければWithの中で指定出来るのでしょうか?
 >その場合はWithを使用せずにした方がいいのでしょうか?
 済みません、意味が分かりません。
 具体的にシート名の例を挙げて
 イメージを伝えてもらえますか?

 >「入力した日付と異なる場合」は、=ではなく、<>で書けば良いと思ったのですが、
 >違うみたいでした・・。
 日付が入っている列には一年分のデータが入っているんじゃないんですか?
 でしたら、「○○と等しくない」では、その他の月のデータも
 表示されてしまうと思いますが?

 >Criteria1:=Range("<>A1").Value   ←ここ
 に関しては、もう一度考えてみて下さい
  ◆Criteria1:="いいい" ←ここ
 これの「いいい」がA1セルに入っているから
 「Range("A1").Value」に変わって
  ◆Criteria1:=Range("A1").Value
 に成ったのですよ?

 「いいい」と等しくない はどの様に記録されましたか?
 その「いいい」の部分が「Range("A1").Value」に変わります。

 (HANA)


 >異なるシートで処理を行いたい場合は、省略しなければWithの中で指定出来るのでしょうか?
 >その場合はWithを使用せずにした方がいいのでしょうか?
 > 済みません、意味が分かりません。
 > 具体的にシート名の例を挙げて
 > イメージを伝えてもらえますか?

    With Sheets("データ")
         .Range("A1").AutoFilter _
           Field:=18, Criteria1:=Range("B9").Value
       Sheets("Sheet2").PrintPreview
         .AutoFilterMode = False
    End With

 こんな風に書けるのかな?と思っただけです。
 単純に素人の疑問です。
 マクロを作るときにはあり得ないのかも知れません。
 実際にやってみましたが、エラーになりましたので・・。

 > 日付が入っている列には一年分のデータが入っているんじゃないんですか?
 > でしたら、「○○と等しくない」では、その他の月のデータも
 > 表示されてしまうと思いますが?

 そうなんです。
 なので、支払い一覧表に年月の列を用意して、支払日を入力すると、
 自動的に年月を表示する様に関数をセットしてみました。
 そうすると年月で絞れるので、
 今回日付指定で入力したところを年月にしようかなと思っています。 

 > 「いいい」と等しくない はどの様に記録されましたか?
 > その「いいい」の部分が「Range("A1").Value」に変わります。
 >  ◆Criteria1:=Range("A1").Value

 当初、 Criteria1:=<>Range("A1").Value と思ったのですが、
 マクロの記録で、オートフィルタのオプションで記録してみたら、
 
    Selection.AutoFilter Field:=3, Criteria1:="<>2009/8/31", Operator:=xlAnd

 と言う様に書き込まれていたので、最初の回答のように設定しました。

 Criteria1:<>Range("A1").Value
 Criteria1:=<>"Range("A1").Value"
 Criteria1:="<>"Range("A1").Value

 手当たり次第にやってみましたが、エラーになってしまいました。。。
 と、色々ネットで検索してみたら、出来ました!

 Criteria1:="<>" & Range("A1").Value

 "&"を入れる必要があるんですね。
 これは、文字をつなげる為に使用しているのだと思いますが、

    Selection.AutoFilter Field:=3, Criteria1:="<>2009/8/31", Operator:=xlAnd ←これ

 の様に、値をつなげている、と言うことなんですね。

 あぁ、難しいですね。

 (あき)

 >こんな風に書けるのかな?と思っただけです。
 そんな風に書けます。

 新しいブックで試してみて下さい。
 Sheet1のA1セルに「テスト」
 Sheet2のA1セルに「Sheet2」と入力して
 Sheet1を選択した状態で
 ↓のコードを実行
Sub Test()
    With Sheets("Sheet3")
        .Range("A1").Value = Range("A1").Value
        Sheets("Sheet2").PrintPreview
    End With
End Sub

 Sheet3のA1セルに、Sheet1のA1セルの値を入れ
 Sheet2を印刷プレビューします。

 そうそう、忘れてました。
 PrintPreview = 印刷(プリント)プレビュー です。
  単なるタイプミスなら良いですが。

 >実際にやってみましたが、エラーになりましたので・・。
 エラーメッセージは何が出ましたか?
 データやシートなど動く環境がそろっていれば
 問題なく動くと思いますよ。

 >"&"を入れる必要があるんですね。
 例えば、A1セルに「いいい」と入っていて
 A2セルに"<>いいい"と言う文字列を作るなら
 ="<>"&A1
 の式を入れますね。

 マクロでA1セルの値は Range("A1").Value と表すので
 "<>" & Range("A1").Value

 実は、結構一緒なんですよ。

 >なので、支払い一覧表に年月の列を用意して、支払日を入力すると、
 >自動的に年月を表示する様に関数をセットしてみました。
 >そうすると年月で絞れるので、
 そうですね。
 日付を オートフィルタで Criteria1:=Range("A1").Value
 の様に抽出するのは不安なので、その様にしておかれるのが
 安心に思います。

 (HANA)

 > 新しいブックで試してみて下さい。
 > Sheet3のA1セルに、Sheet1のA1セルの値を入れ
 > Sheet2を印刷プレビューします。

 テストしてみたら、できました!
 知らないだけで、色々出来るんですね。

 > 実は、結構一緒なんですよ。

 コードばかりなので、すごく難しそうに感じるのですが、
 一つ一つ分かると思い通りに動いて達成感があります。

 >日付を オートフィルタで Criteria1:=Range("A1").Value
 >の様に抽出するのは不安なので、その様にしておかれるのが
 >安心に思います。

 ありがとうございました。
 自分でも勉強しますが、 またお邪魔するときがあると思います。
 その時はよろしくお願いします。

 (あき)

コメント返信:

[ 一覧(最新更新順) ]


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