• 締切済み

VBA 繰り返しと特定条件の抽出

まだ初心者ですが、会社から指示をされ四苦八苦しながら取り組んでいます。是非ともご教示ください。 (作成したいVBA) ・あるデータファイル(注釈1)から、特定の条件(注釈2)に合致するセルを抽出して別シートにコピーしたい。 ・コピーに際しては、日付の古い順に並べ替えたい。 (注釈:その1) ・データファイルはデータ数が変化します。(列は変わりません) (注釈:その2) ・データファイルには下記のデータが入っています。   A  B   C   内容  数量  日付 1 麦  10  9/10 2 米  15  2/15 3 麦  12  3/12 4 粟  14  9/18 ・特定の条件とは、本日から3か月以上経過している内容を日付の古い順番に別用紙にコピーする、というものです。 ・別シートには、取引内容ごと(「麦」「米」「粟」)にデータを集約し、1枚のシートにて完成させたいのです。 零細な職場で、唯一エクセルを触れるとのことで特命を受けてしまいました(汗)。VBAの本を買ってきてもどうしてもできません。なおかつ、1週間で作成せよとの指示で本当に困っています。どうかいい知恵をお貸しください。

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.5

ANo3様の回答と同じですが・・・ 考え方はいろいろありますが、以下の様に分解して考えれば良いのでは? 分解したひとつひとつの処理は、マクロの自動記録を利用すればほとんどそのものに近いものが記録されます。(若干の修正が必要ですが) 1)元データ(多分1シートですよね?)を変更しないために、最初にシート全体を別シートにコピーする。(以下は別シート上での処理) 2)日付をキーにして、全体を並べ替える。  (「データ」-「並べ替え」を利用して昇順にする) 3)日付欄を上から調べていって、3ヶ月以内以降のデータを消す 4)最後に「内容」を第一キーに、「日付」を第二キーに指定して、全体を並べ替え 以上で求めるものができます。 少しだけ知識が必要なのは、3)の日付を調べてゆくとこるぐらいでしょうか。ここだけは自動記録ではやりにくいので。 日付は、データがシリアル値になっていれば、そのまま比較できます。 (並べ替えもこれを利用しています) 2)で並べ替えているので、それぞれの日付が3ヶ月前よりも大きいか小さいかで必要なデータと消してしまいたいデータの境目を知ることができます。 同じ判定の繰返しなので、ループといわれる繰返し構文を使用するか、VLOOKUPなどのようなワークシート関数を利用しても可能です。

AZAM1987
質問者

お礼

ご回答ありがとうございました。まず、マクロの記録で努力してみて、ご指導いただいたところまでたどり着きたいと思います。丸投げになってしまった質問に本当にありがとうございました。

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

こんなの下記のロジックでやればよいのではないですか。 やるべきことを下記のように分解する。(下記はやり方の1方法ではあるが) (1)データ最下行の行番号を取得する(仮にdとする) 参考 常套手段 d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row (2)データの第1行目から第d行まで繰り返し(ForNextなど利用) (3)データ行各1行について     3ヶ月前より小(前)のデータか判別(日付は日付シリアル値という整数なので、実体は3ヶ月前の日を示す整数より大か小かの判別に過ぎない。(IF文利用) (4)日付が小であれば、麦ー>Sheet2、米ー>Sheet3、栗ー>Sheet4、・・のシートに振り分けてデータを、該当シートに代入すればよい (5)その際、各シートの最下行の下に追加しないといけないので、 (1)で使った方法を使える。d+1行に代入。 (6)(4)のシートの振り分けは、シート名を麦、米、栗・・にして下記で処理するか 参考 泥臭いが、シート名が「麦」シートを作っておいて、テストでやってみて Sub test01() Dim sh For Each sh In Worksheets If sh.Name = "麦" Then sh.Range("A1") = "麦シート" End If Next End Sub あるいは 麦ー>Sheet2->麦、米ー>Sheet3、・・の対応表をプログラムコードの中で持つて、それで割り出すかどちらか。 (7)全行終了後、必要があれば、各シートの所定列で希望のようにソートする。 (マクロの記録を勉強) ーー 上記の丁寧なヒントでも、コードが作れないようなら、このレベルの課題に対して、まだ経験不足ということだと思う。

AZAM1987
質問者

お礼

ご丁寧にありがとうございました。こんなにすぐ回答できるなんて、すごいですね。ご指導いただいた内容は理解できました。(とても自分で作成するレベルではないことがわかりました。) 一方的な質問に対し、ここまで丁寧な回答をいただき本当に感謝しています。経験不足を少しでも補っていきます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

オートフィルタで商品と日付で絞込み、全体をコピーして、別シートに貼り付け、貼り付け先を日付昇順で並べ替えといった方法でもできます。必要なら、それをマクロの自動記録を行えば良いでしょう。「今日の日付を自動で与えて絞り込むにはどうすれば良いの?」といった個々の不明点について質問すれば、回答が得られやすいです。

参考URL:
http://www.eurus.dti.ne.jp/~yoneyama/Excel/filter.htm
AZAM1987
質問者

補足

ご回答ありがとうございました。不慣れですが、ご指導いただいたとおりの方法で現在試行錯誤中です。 今度はより丸投げではなく、適切な質問ができるところまで努力します。本当にありがとうございました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

丸投げ禁止ですよ なぜVBAでなければいけないの この程度なら、内容、日付をキーにして並べ替え 結果をコピーすれば終わりでしょ どうしても、マクロでやりたいなら この作業をマクロの記録で記録してアレンジすればよいのでは

AZAM1987
質問者

お礼

ご指摘のとおりです。自分なりに短期集中で取り組んでいますが、とても付け焼刃で太刀打ちできるものではなく、甘えてしまいました。何歳になっても絶対やってやると思っていましたが、悔しいです。もう一度丁寧に勉強し直します。 本当にすぐ回答をつけていただき、ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

・本日から3か月以上経過している内容を日付の古い順番に別用紙にコピーする ・取引内容ごと(「麦」「米」「粟」)にデータを集約し、1枚のシートにて完成させたい コピー先のシート状況がよく見えないのですけど。

AZAM1987
質問者

補足

すいません。指示された内容をそのまま記載しました。会社から求められているのは、次のような完成品だと理解しています。 (コピー先シートの状況) ・1枚であること ・取引内容ごとにまとまった3か月経過した取引を古い順に表示 上司に確認したところ、麦の取引、米…というように、横に取引を並べ、縦には必要とするセル(取引日、数量)をコピーするというものです。言葉足らずで申し訳ありません。これでご理解いただけますか。

関連するQ&A