[[20160907153452]] 『本日の日付の行を別シートに値でコピペしたい』(みなみ) ページの最後に飛ぶ

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

 

『本日の日付の行を別シートに値でコピペしたい』(みなみ)

"管理表"シートのN列とQ列に日付が入っていて、当日に該当するものを行ごと値で"本日のリスト"にコピぺし、本日の日付に該当するリストを作成したいと思っています。

N列でオートフィルターをかけて、該当する本日の日付だけを表示して
値でコピぺし、次にQ列で・・・と2段階でコピペするマクロを作成しようと考えていましたが、N列とQ列が計算式のため、オートフィルターで本日の日付を指定できません。

何か良い方法はありますでしょうか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


どんなデータで、どんな計算式が入っているのでしょう?

とりあえず、手作業だとフィルタできますか?
手作業ならばうまくいくならば、マクロの自動記録を試してみてください。
(???) 2016/09/07(水) 16:00


 2行目以降の日付データが式の結果であってもフィルタリングは可能だと思いますが?

 ・タイトル行、N列、Q列 含めて タイトル項目はすべてユニークですか?
 ・タイトル行そのものが数式で入っているということはないですね?

 フィルターオプションを使えば2段構えではなく一発で抽出可能だと思います。

 ★抽出条件は N列もQ列も今日のもの ということでいいのですか?

(β) 2016/09/07(水) 16:23


=IF(ISBLANK(A10),"",A10-1) と、別のセルの日付から1日前というような計算式です。
マクロ記録で試すと、オートフィルタだと日付を指定しなければならないようでした。

Sub MacroTEST()

    Rows("8:8").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$8:$BA$1212").AutoFilter Field:=14, Operator:= _
        xlFilterValues, Criteria2:=Array(2, "9/7/2016")
    Rows("234:247").Select
    Selection.Copy
    Sheets("リスト").Select
    Range("A2").Select
 ActiveSheet.Range("$A$8:$BA$1212").AutoFilter Field:=14
    ActiveSheet.Range("$A$8:$BA$1212").AutoFilter Field:=17, Operator:= _
        xlFilterValues, Criteria2:=Array(2, "9/7/2016")
    Rows("237:243").Select
    Range("AF237").Activate
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("リスト").Select
    Range("A5").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A1").Select
End Sub

5行目と12行目が課題なんです。

タイトル行がユニークでなかったので、ユニークに書き換えました!
また、タイトル行はテキストです。
一発で抽出できるなら助かります。。。
(みなみ) 2016/09/07(水) 16:29


 シートレイアウトはコードから推測しています。
 作業域として、元シートの XFD1,XFD2 を使います。
 なお、元シート8行目がタイトル行のようですが、7行目は空白行だという前提です。
 7行目に、タイトル行に接して、何か値があれば不具合が生じます。(空白行ではないということなら、それなりの手当てもできますけど)

 オートフィルターではなくフィルターオプションを使いました。

 Sub Sample()
    Dim shF As Worksheet
    Dim shT As Worksheet

    Set shF = Sheets("管理表")
    Set shT = Sheets("本日のリスト")

    shT.Range("A1", shT.UsedRange).Offset(4).ClearContents      '転記領域のクリア

    shF.Range("XFD1").ClearContents                             '計算式による条件
    shF.Range("XFD2").Formula = "=AND(N9=TODAY(),Q9=TODAY())"   '抽出条件

    shF.Range("A8").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=shF.Range("XFD1:XFD2"), CopyToRange:=shT.Range("A5"), Unique:=False

    shF.Range("XFD2").ClearContents
    shT.Select

 End Sub

(β) 2016/09/07(水) 16:51


ご教示ありがとうございます!

早速やってみましたが、結果、"本日のリスト"シートの5行目に
8行目が書式ごとそのままペーストされました。

おっしゃる通り7行目が空白ではなかったからかな?と思い、
7行目の値を削除して再トライしてみましたが
やはり同じ結果でした。

shF.Range("XFD2").Formula = "=AND(N9=TODAY(),Q9=TODAY())

このN9とQ9を指定している意味合いが理解できませんでした。
素人で申し訳ありませんが、なぜ9行目なのでしょうか???

(みなみ) 2016/09/07(水) 17:23


 コードでは、管理表シートの 8行目にタイトル行があって、9行目からデータ。
 抽出結果を 本日のリストの 5行目から 5行目にタイトル行、6行から下に抽出データを列挙しているんですが
 そうなっていないということでしょうか?

 また、書式ごと というのは具体的には、8行目のタイトル行がどうなったんでしょうか?

 で、フィルターオプションについては、操作で行う場合も含めて、オートフィルターより、はるかに優れた機能ですから
 ネットで検索して、是非、習得しておかれたらよろしいかと思います。
 ( オートフィルターをマクロで実行すると AutoFilterメソッドなんですが、フィルターオプションは AdvancedFilterメソッド。
  名前からして、【進んだフィルター】)

 フィルターオプションでは、一般的に、抽出すべき列のタイトルと、その列の条件としての値を与えて実行します。
 (シート関数でデータベース関数がありますけど、よく似ています)

 もう1つ、どの列ということではなく、条件式を与えて抽出することもできます。
 この場合、抽出条件タイトルは空白、条件式は リスト領域の最初のデータ行に対する式になります。
 8行目がタイトル行(だと推測しました)ですので、最初のデータは9行目ですよね?

(β) 2016/09/07(水) 17:35


(β)さま、ご丁寧にありがとうございます!

そうです。最初のデータは9行目です!そういうことですね。

書式ごとというのは私の言葉足らずでした。
セルの書式設定がそのままだった、という意味です。
が、よく考えたら別に書式設定はそのままでも構わないことに気づきました。
失礼いたしました。

データが抽出されなかったため、ひょっとして・・・と思い、
shF.Range("XFD2").Formula = "=AND(N9=TODAY(),Q9=TODAY())"

ANDをORに書き換えたら、見事できました!ありがとうございます。

ただ、ひとつわからない点がございました。
なぜか、本日の日付ではなく、1日後の日付「9/8」になりました。
元の管理表では計算式ですので、「9/7」と表示されているのですが・・・

もし、管理表シートの計算式の問題でしょうか???

追記:フィルターオプションは是非とも検索して学びたいと思います。
すごく便利そうですね。教えていただきありがとうございました!
(みなみ) 2016/09/07(水) 18:12


 あぁ、OR だったんですか。そちらのコードでは どちらも 当日で抽出していたので
 ANDが要件なんだろうと考えていました。

 >なぜか、本日の日付ではなく、1日後の日付「9/8」になりました。

 こちらで動かすと、9/7のデータが抽出されます。不思議ですねぇ。
 新規ブックのシートのどこかのセルに =TODAY() といれると何日になっていますか?

 ただ、こちらのテストデータの式は、そちらのものとは異なるので、そちらの式に合わしたうえで
 確認してみます。

 追伸 そちらの式と同じようなものにして実行しましたが、やはり、こちらでは
    9/7 のデータが抽出されています。

(β) 2016/09/07(水) 19:01


 なんとなく 抽出行がずれている(抽出されるべき行の1行上が抽出される とか)のではないかと想像したりしています。

 shF.Range("A8").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _

 このコードの上に

 MsgBox shF.Range("A8").CurrentRegion.Address といれて実行してもらえませんか。
 そこで表示される領域が A8から始まっているのか、A7 あたりから始まっていることはないのか、確認願います。

(β) 2016/09/08(木) 08:40


(β)さま

ご親切にアドバイスありがとうございました!

苦心していろいろ試した結果、原因がはっきりわかりませんでしたので
新たにファイルを作成してみました。
すると、なぜか上手く抽出できるようになりました!!

お騒がせして申し訳ありませんでした。
きちんと私のやりたいことをご理解いただき、
とても感動しました!ありがとうございました。

また何かあればご教授くださいますようよろしくお願いします。
(みなみ) 2016/09/08(木) 17:22


コメント返信:

[ 一覧(最新更新順) ]


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