• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日付に絡むマクロの作り方)

日付に絡むマクロの作り方

このQ&Aのポイント
  • エクセルのマクロ初心者です。以下の要領で商品名と同じ日付のデータを抽出したいです。
  • DAY関数を使用して日付を引用しようとしましたが、できませんでした。マクロの使い方を教えてください。
  • エクセルのマクロを使って商品名と同じ日付のデータを抽出する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

既出回答でもコメントされていますが,日付の検索は実はかなりやっかいです。 ところでちょっとご相談で不明の点ですが,いま「(指定の)商品Aと同じ日付の行を抽出したい」というご相談ですが,各商品そのものは,リストに『必ずひとつしかない』という限定なのでしょうか? 商品Aを指定したとして,それに該当するのは必ずある1日分しか無いのですか?という事です。 準備: リストのいきなり1行目からデータが並んでいるなんて表にせず,1行目はタイトル行,2行目から実データというふつーの表形式のリストを用意する 抽出するのは良いとしてその結果を具体的にいったい「どうしたい」のか指定がありませんので,Sheet2に書き出させてみます 手順: dim h as range set h = worksheets("シート名").range("A:A").find(what:=textbox1.text, lookin:=xlvalues, lookat:=xlwhole) if h is nothing then exit sub worksheets("Sheet2").cells.clearcontents worksheets("シート名").autofiltermode = false worksheets("シート名").range("B:B").numberformatlocal = "yyyy/mm/dd" worksheets("シート名").range("A:C").autofilter field:=2, criteria1:=h.offset(0,1).text worksheets("シート名").autofilter.range.copy destination:=worksheets("Sheet2").range("A1") worksheets("シート名").autofiltermode = false worksheets("シート名").range("B:B").numberformatlocal = "yyyy/m/d/hh:mm" worksheets("Sheet2").range("B:B").numberformatlocal = "yyyy/m/d/hh:mm"

korotanq
質問者

お礼

お礼が遅くなり、申し訳ありません。 勉強の末、無事プログラムが完成しました。 一番やりたいことに近かったのでベストアンサーにいたします。 ありがとうございました!

korotanq
質問者

補足

ご回答ありがとうございます。 「商品A」というのは日付が変わっても全体で1つしかありません。 目的としては指定の商品と同一の日付けのものを 抽出したいというものです。 現在各ご回答者の構文を咀嚼中です。。。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

日付に絡む、というよりは、商品Aが元データに複数(行)あるのではないか。 そのとき出てくる日付は複数になるのではないか。 (1)だから商品と日付を各々1つ指定して検索するという設計にしないとだめでは。上の行で見つかった商品Aだけの日付を問題にするのもおかしいようだ。 結局、(2)1つの日付を指定し、その日の商品明細の中に商品Aがあれば良しとし、無ければ捨てる。 (3)または商品Aの存在する日付の、他の商品もふくめて、リストアップッするのがよいのかな。 商品Aと他の商品の関連などを見るならこういうことかな。 ーー VBAのコード云々するより、経験を積んで、そういう方面をしっかり勉強しないと。また処理方法も2,3ある場合が多い。 ーー 例えば日付でソートし商品をちらべて商品Aがあれば、その日付の全明細を他シートに書き出す。 ーー 日付時刻の入力を 2011/5/1/12:00 のように 日付部分と時刻部分を/で区切って続けてはならない、 エクセルの常識と違うことをやっている。VBAなどが難しくなるだけ。 もし意識して無理にしているなら注記ぐらいすべきだ。 VBAをやる前にエクセルを相当知ってないと、VBAをはじめられないものです。そちらも充実させること。 ーー 日付はDAY関数では日にちだけになるが、質問者の意図としては、年+月+日ではないのか。 参考 Sub test01() MsgBox Day(Now()) For i = 1 To 3 MsgBox Day(Cells(i, "B")) Next i End Sub ーー オートフィルタでやってみると 日付・時刻シリアル値のことから考えて、2011/5/1日分は Sub Macro4() Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:=">=2011/5/1", Operator:=xlAnd, _ Criteria2:="<2011/5/2" End Sub で抜き出せるようだ。(マクロの記録) ーー 抜き出した各行の明細をチェックするために、参考 Sub Macro4() Range("A3:C5").Select Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:=">=2011/5/1", Operator:=xlAnd, _ Criteria2:="<2011/5/2" Selection.SpecialCells(xlCellTypeVisible).Select For Each cl In Selection If cl.Column = 2 Then 'B列だけ MsgBox DateSerial(Year(cl), Month(cl), Day(cl)) End If Next End Sub 日付に時刻を含めると色々難しくなる。日付列を作ったほうが簡単になるようだ。

korotanq
質問者

お礼

お礼が遅くなり、申し訳ありません。 勉強の末、無事プログラムが完成しました。 詳細なご指導ありがとうございました!

noname#157410
noname#157410
回答No.1

CDATE関数を使わないと日付の処理はできません。 なお変数に入れる場合 Dim ** as dateを使うかですね。 EXCELは日付のところが結構めんどくさいので、色々ググってみてください。 普通にLongとかでは変な数字に置き換わりますよ。

korotanq
質問者

お礼

お礼が遅くなり、申し訳ありません。 勉強の末、無事プログラムが完成しました。 ありがとうございました!