[[20060627161702]] 『マクロでの資料作り[オートフィルタ・VLOOK]』(takako) ページの最後に飛ぶ

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

 

『マクロでの資料作り[オートフィルタ・VLOOK]』(takako)

いつも参考にさせていただいています。
今回、今まで手動で毎月1回行っていた資料作りを、
何とかマクロで行えないかと思い、質問いたします。
(過去の履歴を検索したのですが、よくわかりませんでした。)
なにぶん、初心者なので、わかりづらいところがあればご指摘ください。

Excelバージョン : Excel2003
OSバージョン : WindowsXP
シート「元データ」に、

    A  B   C    D      E

1  日付   品名   合計金額 グループ  判別

2  4/1  みかん   30    みかん科   ○

3  4/3  ぶどう   100    ぶどう科

4  4/5  もも    120    もも科

5  4/1  みかん   30    みかん科   ○

上記のようなデータが2000行ほどあります。
マクロの記録で
元データのシートをコピー⇒品名をフィルター⇒判別をフィルター⇒シートをつくる

という風にやったのですが、
他のファイルで使おうとするとフィルターの部分でエラーがでてしまいます。
どこが悪いのでしょうか。。

よろしくお願いします。

Selection.Copy

    Sheets("元データ").Select
    Sheets.Add
    Range("A1").Select
    ActiveSheet.Paste
    Sheets("元データ").Select
    Application.CutCopyMode = False
    Sheets("元データ").Move Before:=Sheets(1)
    Sheets("Sheet1").Select
    Range("A:B,D:G").Select
    Range("D1").Activate
    Selection.Delete Shift:=xlToLeft
    Range("1:7,9:9").Select
    Range("A9").Activate
    Selection.Delete Shift:=xlUp
    Rows("1:1").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=3, Criteria1:="=*みかん*", Operator:=xlOr, _
        Criteria2:="=*もも*"
       ↑この部分が黄色くなります。
   Rows("575:575").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
        ・
        ・     ・


 エラーの内容はどのようなメッセージでしょうか?
 あと、フィルタかけたあとで、どのような処理をしたいのでしょうか。

 (川野鮎太郎)

 手元に実際のものがないのでエラーの内容はわからないのですが、
「品名」をフィルター
⇒選んだ行をすべて削除
⇒「判別」をフィルタ
⇒それぞれのシートを作る
として、データを整理したいと思います。
(takako)

「RangeクラスのAutoFilterメソッドが失敗しました」
とエラーメッセージがでていました。
よろしくお願いします。
(takako)


 遅くなりました。
 >「RangeクラスのAutoFilterメソッドが失敗しました」
 が出るってことは、そのVBAを使おうとしているファイルに
 フィルタ出来るデータがないってことではないでしょうか。
 恐らく、
    Range("A:B,D:G").Select
    Range("D1").Activate
    Selection.Delete Shift:=xlToLeft
 の部分で列データが削除されているので、
>Selection.AutoFilter Field:=3  ←3列目でフィルタ
 が出来ていないのでしょう。

 他のファイルのデータがどのようになっていて、どのような処理を
 具体的に、出来るだけ詳細にご提示いただければ、解決策があるかもしれません。

 (川野鮎太郎)

早速ありがとうございます。

3行目をフィルタしたい事はかわらなかったので、
下記のように行・列を消すマクロを変更したら、

上記のエラーは消えました。
(元データのシートのA・B・C〜G列までと、1〜5・7の行を消したいのは固定です。)

  Sheets("Sheet1").Select

    Rows("1:5").Select
  Selection.Delete Shift:=xlUp         
    Rows("2:2").Select                   
    Selection.Delete Shift:=xlUp         
    Columns("A:B").Select                
    Selection.Delete Shift:=xlLeft          
    Columns("B:E").Select                
    Selection.Delete Shift:=xlLeft           

しかし、下記のようにマクロを作ったら、
フィルタをして、削除したいもの以外のものも消えてしまいます。

行の指定が悪いのかと思うのですが、
どのように指定をすればよいかわかりませんでした。。

フィルタを行って特定の言葉が含まれているすべての行の削除を行いたく、
削除すべき行数はその時によって違います。

    Rows("1:1").Select
    Selection.AutoFilter
  Selection.AutoFilter Field:=3, Criteria1:="=*もも*", 
  Operator:=xlOr,  Criteria2:="=*みかん*"
    Operator_ = xlOr
    Rows("3:3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Rows("523:523").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.ClearContents
    Selection.AutoFilter Field:=3, Criteria1:="=*AAA*", Operator:=xlOr, Criteria2:="=*BBB*"
    Rows("3:3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Selection.AutoFilter Field:=3
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

必要な情報は足りているでしょうか。
お手数ですが、よろしくお願いします。


 少し情報が不足のような気がします。
 1行目から5行目と7行目は必ず削除するとのことですが、
 当初の例題でいけば、全部消されてしまいますよね・・・。
 試すためのデータとしては適してないのではないでしょうか。
 もしも可能であれば、新規のブックにある程度のデータを作って、
 以下のramrunさんのアップローダに、ファイルをアップしてみてください。
http://ryusendo.no-ip.com/cgi-bin/upload/upload.html

 そのデータで、どのようにしたいのかを説明してください。

 (川野鮎太郎)

上の表はいらない行を消したあとのものになりました。。
データをUPしてみましたので、
お手数ですが、よろしくお願いします。


 サンプル拝見しました。
 現在時間がないので、まだ詳しく見ていません。
 夜にでもやってみますのでお待ちください。
 放置されているとご心配なさるといけないので取り合えずコメントだけ(^_^A;

 (川野鮎太郎)


ありがとうございます!!
よろしくお願いします。

(takako)


 取り合えずピボットテーブルは無視してやってみました。
 サンプルブックのSheet1、番号なし、番号有りの各シートのデータをクリアして
 マクロを実行してみてください。
 
Sub detahennkann()
Dim Sh_元 As Worksheet
Dim 売日 As Range, グ1 As Range, 額1 As Range, 番号 As Range
Dim 正味 As Range, 事業 As Range, グ2 As Range, myMultiAreaRange As Range
Dim Last_Row As Long, Last_R As Long
Set Sh_元 = Worksheets("元データ")
With Sh_元
  Last_Row = .Range("C8").End(xlDown).Row '元データシートの最終行を取得し変数に代入
    Set 売日 = .Range("C6:C" & Last_Row)    'C列のデータを変数に代入
    Set グ1 = .Range("I6:I" & Last_Row)     'I列のデータを変数に代入
    Set 額1 = .Range("V6:V" & Last_Row)     'V列のデータを変数に代入
    Set 番号 = .Range("W6:W" & Last_Row)    'W列のデータを変数に代入
    Set 正味 = .Range("Z6:Z" & Last_Row)    'Z列のデータを変数に代入
    Set 事業 = .Range("AO6:AO" & Last_Row)  'AO列のデータを変数に代入
    Set グ2 = .Range("AQ6:AQ" & Last_Row)   'AQ列のデータを変数に代入
    Set myMultiAreaRange = Union(売日, グ1, 額1, 番号, 正味, 事業, グ2) '各列のデータを集合させて代入

    With Worksheets("Sheet1")
        .Columns("A:G").ClearContents                   'Sheet1のデータをクリア
        myMultiAreaRange.Copy Destination:=.Range("A1") '元データシートの必要データをSheet1にコピー
        .Cells.EntireColumn.AutoFit                     '列幅を調整
        .Rows("2:2").Delete Shift:=xlUp                 'Sheet1の2行目を削除
        Last_R = .Range("A65536").End(xlUp).Row            'Sheet1の最終行を取得し変数に代入

    '//////////// B列のフィルタ処理 //////////////
        .Range("A1").AutoFilter Field:=2, _
            Criteria1:="=EEEE", Operator:=xlOr, Criteria2:="=D"  'B列でEEEEまたはDをフィルタ
        .Rows("2:" & Last_R).Delete Shift:=xlUp         'フィルタしたデータを削除
        .Range("A1").AutoFilter Field:=2, _
            Criteria1:="A"                              'B列でAをフィルタ
        .Rows("2:" & Last_R).Delete Shift:=xlUp         'フィルタしたデータを削除

    '//////////// G列のフィルタ処理 ////////////// B列にCCCCCCが含まれているものの内G列のフィルタ
        .Range("A1").AutoFilter Field:=2, _
            Criteria1:="CCCCCC"                             'B列でCCCCCCをフィルタ
        .Range("A1").AutoFilter Field:=7, _
            Criteria1:="=EEEE", Operator:=xlOr, Criteria2:="=D"  'G列でEEEEまたはDをフィルタ
        .Rows("2:" & Last_R).Delete Shift:=xlUp         'フィルタしたデータを削除
        .Range("A1").AutoFilter Field:=7, _
            Criteria1:="A"                              'G列でAをフィルタ
        .Rows("2:" & Last_R).Delete Shift:=xlUp         'フィルタしたデータを削除
        .ShowAllData                                    '全て表示

    '//////////// D列のフィルタ処理1 ////////////// D列が空白行をフィルタ
        .Range("A1").AutoFilter Field:=4, Criteria1:="="
        Worksheets("番号無し").Columns("A:G").ClearContents  '番号無しシートのデータをクリア

        .Range("A1:G" & Last_R).Copy Destination:= _
            Worksheets("番号無し").Range("A1")          'Sheet1のデータを番号無しシートにコピー

    '//////////// D列のフィルタ処理2 ////////////// D列が番号あり行をフィルタ
        .Range("A1").AutoFilter Field:=4, Criteria1:="<>"
        Worksheets("番号あり").Columns("A:G").ClearContents  '番号ありシートのデータをクリア
        .Range("A1:G" & Last_R).Copy Destination:= _
            Worksheets("番号あり").Range("A1")          'Sheet1のデータを番号無しシートにコピー
        .ShowAllData                                    '全て表示
    End With
    Set Sh_元 = Nothing
    Set 売日 = Nothing
    Set グ1 = Nothing
    Set 額1 = Nothing
    Set 番号 = Nothing
    Set 正味 = Nothing
    Set 事業 = Nothing
    Set グ2 = Nothing
    Set myMultiAreaRange = Nothing
End With
End Sub

 (川野鮎太郎)

鮎太郎さん、ありがとうございます!

家のパソコンでやってみたのですが、

excelのバージョンが2002だからか、

「オブジェクトが必要です」となり、

できませんでした。。

本当に無知で申し訳ないのですが、
月曜にまたやってみたいと思います。
(takako)


 すいません・・・、1行抜けている部分がありました。
 上のコードを修正していますので、再度コピペしてください。

 (川野鮎太郎)

 ありがとうございます!
 無事できました。
 マクロを記録してやっていたときより、
 とても早くできました。。
 しっかりマクロを組むととても早いんですね。
 本当にありがとうございます!!
 (takako)

コメント返信:

[ 一覧(最新更新順) ]


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