こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

エクセルのマクロ初心者です。

以下のようなデータがあり、
テキストボックスで任意の商品を指定し、
その商品と同じ日付のデータを抽出する操作をしたいです。
A列が商品名、B列が時間、C列が備考欄です。
データ数は月によりランダムですが1000程度あります。

A列   B列        C列
商品A 2011/5/1/12:00 関東
商品B 2011/5/2/2:30 北陸
商品C 2011/5/1/18:15 近畿

(商品Aと入力すると・・・)

A列   B列        C列
商品A 2011/5/1/12:00 関東
商品C 2011/5/1/18:15 近畿
(商品Aと同じ5月1日のデータ(商品C)を抽出)

DAY関数で日付だけ引用してなんとかやってみようと思いましたが、
私の現状の技量ではできませんでした。
まだVBAは参考書のものをコピーして使い、
基本的に「マクロの記録」で操作を覚えさせて用いているレベルなので
初歩的な質問で申し訳ありません。

詳しい方、エッセンスだけでもご教授ください。
不明点がありましたら補足いたします。

投稿日時 - 2011-05-23 00:21:38

QNo.6756802

困ってます

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

既出回答でもコメントされていますが,日付の検索は実はかなりやっかいです。


ところでちょっとご相談で不明の点ですが,いま「(指定の)商品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"

投稿日時 - 2011-05-23 00:52:53

補足

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

投稿日時 - 2011-05-23 22:41:14

お礼

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

投稿日時 - 2012-01-22 18:00:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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
日付に時刻を含めると色々難しくなる。日付列を作ったほうが簡単になるようだ。

投稿日時 - 2011-05-23 10:13:16

お礼

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

投稿日時 - 2012-01-22 18:01:36

CDATE関数を使わないと日付の処理はできません。

なお変数に入れる場合
Dim ** as dateを使うかですね。

EXCELは日付のところが結構めんどくさいので、色々ググってみてください。
普通にLongとかでは変な数字に置き換わりますよ。

投稿日時 - 2011-05-23 00:28:28

お礼

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

投稿日時 - 2012-01-22 18:02:39

あなたにオススメの質問