[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『特定データを抜出し別シートに貼り付け』(ともP)
いつも的確なアドバイスをいただき大変助かっております。 今回も苦手なマクロを教えていただきたく、何卒よろしくお願いします。
早速ですが、下記の通り、お客様からの注文データが毎週送られてきます。 そのデータには、私が必要とするもの・しないものが混在しています。 品番をキーにして判別し、必要となるデータのみを別シートに貼り付けたいと 思っています。
【元データ】 [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [M] [1] 変更区分 品番 オーダー識別 No 発行日 納期日 数量 タイプ status 作成日付 品名 仕入先 仕入先名 [2] I 1027583-5 803492 2009/10/7 2009/10/8 5000 P P 40018 R RK20CAY10KJ-T1 * [3] I 1027583-5 804488 2009/10/8 2009/10/9 5000 P P 40011 R RK20CAY10KJ-T1 * [4] I 1027583-5 805492 2009/10/9 2009/10/13 5000 P P 40018 R RK20CAY10KJ-T1 * [5] I 1027583-5 807491 2009/10/14 2009/10/15 5000 P P 40017 R RK20CAY10KJ-T1 * [6] I 1027583-5 808492 2009/10/15 2009/10/16 5000 P P 40018 R RK20CAY10KJ-T1 * [7] I 1027583-5 812492 2009/10/21 2009/10/22 5000 P P 40018 R RK20CAY10KJ-T1 * [8] I 1027595-9 789489 2009/9/16 2009/9/17 5000 P P 40015 R RK20CAY33KJ-T1 * [9] I 1027814-1 747999 AAA 2009/7/10 2009/8/3 2000 P R 40003 R RN1/4P2K200KF-T1 * [10] I 1027848-6 751999 BBB 2009/8/6 2009/8/7 2000 P O 40009 R RN1/4P2K28.7KF-T1 * [11] I 1029435-0 763492 2009/8/4 2009/8/7 2000 P P 40018 C CE11R85A1E470-T1 * [12] I 1029435-0 777492 2009/8/31 2009/9/3 2000 P P 40018 C CE11R85A1E470-T1 * [13] I 1029435-0 791492 2009/9/18 2009/9/24 2000 P P 40018 C CE11R85A1E470-T1 * [14] I 1029435-0 803492 2009/10/7 2009/10/13 2000 P P 40018 C CE11R85A1E470-T1 * [15] I 1029455-4 794492 2009/9/24 2009/9/29 2000 P P 40018 C CE11R85A1V330-T1 * [16] R 1029478-3 757488 CCC 2009/7/27 2009/7/30 2000 P R 40018 C CE11R85A1H010-T1 * [17] I 1029478-3 790490 2009/9/17 2009/9/23 2000 P P 40016 C CE11R85A1H010-T1 * [18] I 1029484-8 788492 2009/9/15 2009/9/18 2000 P P 40018 C CE11R85A1H4R7-T1 * [19] I 1029485-6 776490 2009/8/28 2009/9/2 200 P P 40016 C CE11R85A1H100 * [20] I 1029486-4 756492 DDD 2009/7/27 2009/7/29 2000 P R 40018 C CE11R85A1H100-T1 * [21] I 1029486-4 761488 2009/7/31 2009/8/5 2000 P P 40011 C CE11R85A1H100-T1 *
【具体的にしたいこと】 ※最終的に抜出したいセル↓↓ [B] [C] [D] [E] [F] [H] [I] 品番 P品番 仕コード オーダー識別 No 納期日 数量
@記載されている(品番)は得意先品番の為、[C列]※(項目名はP品番)に行挿入し、 当社の品番リストシートを参照しVLOOKUP関数にて変換。 ※=VLOOKUP(B2,品番リスト!$D$1:$E$561,2,0)
同時に[D列]※(項目名は仕コード)にも行挿入し品番リストしーとから、 仕入先コードをVLOOKUP関数で表示する。 ※=VLOOKUP(B2,品番リスト!$D$1:$S$561,16,0)
[C列]の『N/A以外』つまり変換できた品番のみが対象。
A@の該当した品番の中で、今月+翌月末までをシート名(内示)とし貼り付け。 (リストの中には、もっと先までの情報が盛り込まれています) (処理した日が7/3でも、7/25でも、当月(つまり7月)+翌月(8月)末までとする)
B処理した週からカウントして、以降12週までを必要データとし、 (例えば7/6に処理をした場合、7/6の週を1週目とし、12週目の10/9までが対象) その中でAで抜出した翌月末までの情報はシート1へ貼り付け完了している ので、翌月末以降で該当週(処理日からカウントして12週目まで) をシート名(情報)とし貼り付け。(具体的には9/1〜10/9)まで。
CA・Bともに[D列]のコードが『21291』のものとそれ以外のもので 更に分けたい。できれば別シートへ。
長々と希望ばかりを書き綴りましたが、このようなことは処理可能でしょうか。 また、マクロのご伝授をお願いいたします。 質問の内容が分かりにくいようであったらご容赦くださいませ。 何卒よろしくお願いいたします。
(ともP)
マクロの伝授よりも、早くご自身で作れるようになれる事を願っていますので まずは1番と2番の内容(ネットで○付き数字はダメよ)はマクロの記録で ほとんど出来ると思うのでやってみてください。
そこからどうするか、を考えていきましょう。 (momo)
momoさん
ご指摘ありがとうございます。 おっしゃるとおり自分で出来るようにならなければいけないのですが、 期限がいつも緊迫しており、なかなかじっくりと自分で悩んでいる暇がなく こちらで教わる結果となっておりました。 今回も大至急の納期で困っています。 また○付き数字はいけないのですね・・・。申し訳ございませんでした。
早速ですが、ご指摘の通り、1・2についてということでしたが、 マクロの前に、関数自体にも知識不足で、2については分かりませんでした。 1については下記の通りやってみました。
Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2009/8/3 ユーザー名 : ○○▲▲□□株式会社
'
'
Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("C2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R[-1]C[1]:R[559]C[2],2,0)" ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" Range("C2").Select Selection.AutoFill Destination:=Range("C2:C21") Range("C2:C21").Select Columns("C:C").EntireColumn.AutoFit Columns("D:D").Select Selection.Insert Shift:=xlToRight Range("D2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R[-1]C:R[559]C[15],16,0)" ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D21") Range("D2:D21").Select Range("C1").Select ActiveCell.FormulaR1C1 = "P品番" ActiveCell.Characters(2, 2).PhoneticCharacters = "ヒンバン" Range("D1").Select ActiveCell.FormulaR1C1 = "仕コード" ActiveCell.Characters(1, 1).PhoneticCharacters = "ツコウ" Range("C1").Select Selection.AutoFilter Selection.AutoFilter Field:=3, Criteria1:="<>#N/A", Operator:=xlAnd End Sub
その後、今月+翌月末【当月(つまり8月)+翌月(9月)末】の抜粋の処理ですが、 当月の判別はどのようにしたらいいのでしょうが。 =MONTH(H9) のように、月自体は表示させたり出来ますがそれが当月という判別の仕方が分かりません。 その点に付きましても教えていただけないでしょうか? 急いでおりますので、自分でもいろいろ検索してみたいとは思っておりますが、 何卒よろしくお願いいたします。
(ともP)
>今回も大至急の納期で困っています。 という事でしたら、とりあえず手作業の方が早いと思います。
それを理由にされると、私としてはとても回答しにくいです。 私の回答でじっくり検証が成されないまま、ともPさんの仕事を進められて ミスがあったときに責任が取れないからです。
とりあえず >その後、今月+翌月末【当月(つまり8月)+翌月(9月)末】の抜粋の処理ですが、 >当月の判別はどのようにしたらいいのでしょうが。 についてですが、当月+翌月の範囲内かどうかを判別する方法の案の1つです。
Sub Test() Dim myDay As Variant, d As Variant myDay = Array(#7/31/2009#, #8/1/2009#, #8/31/2009#, #9/1/2009#, #9/30/2009#, #10/1/2009#) StartDay = Date - Day(Date) + 1 EndDay = DateAdd("M", 2, StartDay) - 1 For Each d In myDay If StartDay <= d And d <= EndDay Then MsgBox d & "の日は当月+翌月の範囲内です" Else MsgBox d & "の日は範囲外です" End If Next d End Sub
(momo)
momoさん
レスありがとうございます。 おっしゃる通りかもしれませんが、毎回私が処理をするわけではないので、 今回のみ手作業で処理してしまったら、 今後誰も処理できなくなってしまうので、マクロ完成後のデータを提出しなければ ならないため、 >>今回も大至急の納期で困っています。 >という事でしたら、とりあえず手作業の方が早いと思います。 というのは避けたいのです。
>私の回答でじっくり検証が成されないまま、ともPさんの仕事を進められて >ミスがあったときに責任が取れないからです。 そうかもしれませんね。 momoさんが質問者の事を思って、自分でやってみなさいというコメントを下さったので やってみようという気になったのですが・・・。
過去にアドバイスくださった方の様に希望する処理内容を把握してくださり マクロのコマンドを表示くださった方々の方法で私は責めるつもりも文句のレスを 残した事はございません。 どなた様もご親切に教えてくださっていますから。
>マクロの伝授よりも、早くご自身で作れるようになれる事を願っていますので >まずは1番と2番の内容(ネットで○付き数字はダメよ)はマクロの記録で >ほとんど出来ると思うのでやってみてください。 との事でしたが、1番について表示してみましたが、これについては何のコメントも なかったので問題ないということでしょうか? また、2番について・・・恐らくこのまま貼り付けたらできるかと思いますが、 今見る限りで、私具体的に理解が出来ません・・・。 また、通常の関数では、求められるような関数はありませんか? INDIRECT関数かと思いましたが、それが正しいのかどうか分かりません。
momoさんに限らず、どなた様でも結構です。 お時間ありましたら、具体的にコメントくださいませんでしょうか?? momoさんのおっしゃるように、頑張って理解し、勉強したいと思いました。
何卒よろしくお願いいたします。
(ともP)
(momo)さん
何度もスイマセン。 先ほど貼り付けてくださった、今月+翌月末【当月(つまり8月)+翌月(9月)末】の抜粋の処理 についてですが、一度トライしてみました。 確かに判別する事ができ、momoさんもおっしゃるとおりあんの1つだと思います。 しかしながら、1件ずつ、ポップアップが出て聞いてくるので、私がしたい処理とは 若干違います。 翌月末までのデータを判別し別シートに貼り付けたいわけです。 先ほども質問しましたが、関数では出来ませんか? もし、関数が分かれば、momoさんがおっしゃるとおりに、自分でマクロの記録作業が できるんじゃないかと・・・。関数が分かってもダメなんですかね・・・。
(ともP)
基本的に、記録できたものを再実行して良い結果が得られればそれで良いと思います。 2番に進むには、まだ足りない要素もあります。 たとえば >A@の該当した品番の中で、今月+翌月末までをシート名(内示)とし貼り付け。 ここで言う今月+翌月末に該当する日付はどの列の日付ですか?
関数でもVBAでも出来ますけど 関数であれば 当月の月は =MONTH(TODAY()) で出ますよね? 翌月は当然 =MONTH(TODAY())+1 です そうしたら、例えばA1からA列にチェックする日付があったとして 作業列としてB1に=OR(MONTH(A1)=MONTH(TODAY()),MONTH(A1)=MONTH(TODAY())+1) で、フィルすれば該当日ならTRUE、違うならばFALSEが返りますので その作業列でフィルタリングすれば良いと思います。
>おっしゃる通りかもしれませんが、毎回私が処理をするわけではないので、 >今回のみ手作業で処理してしまったら、 >今後誰も処理できなくなってしまうので、マクロ完成後のデータを提出しなければ >ならないため、 という事ですので、なお更ともPさんが御理解されてコードを組まないと 仕様の変更などに対応できないと思いますので私としては一発で動くコードは 書きにくいです。 すみません。 もし他の理解を示される回答者さんがいらっしゃれば、そちらにお任せいたします。 (momo)
>基本的に、記録できたものを再実行して良い結果が得られればそれで良いと思います。 これで、私の理解と認識してしまっていいのでしょうか。 そうであれば
>なお更ともPさんが御理解されてコードを組まないと とコメントくださいましたが、これには該当しないんじゃないでしょうか。
>仕様の変更などに対応できないと思いますので私としては一発で動くコードは >書きにくいです。 そうですね。ただし、仕様の変更は無いですので、今後私が修正することは無いのです。
>>A@の該当した品番の中で、今月+翌月末までをシート名(内示)とし貼り付け。 >>ここで言う今月+翌月末に該当する日付はどの列の日付ですか? 失礼いたしました。【納期日】のことです。 それをご理解いただいたうえで、
>Sub Test() > Dim myDay As Variant, d As Variant > myDay = Array(#7/31/2009#, #8/1/2009#, #8/31/2009#, #9/1/2009#, #9/30/2009#, #10/1/2009#) > StartDay = Date - Day(Date) + 1 > EndDay = DateAdd("M", 2, StartDay) - 1 > For Each d In myDay > If StartDay <= d And d <= EndDay Then > MsgBox d & "の日は当月+翌月の範囲内です" > Else > MsgBox d & "の日は範囲外です" > End If > Next d > End Sub このコードを教えてくださったのじゃないのですか??すいません。コードの理解が出来なかった為 このような質問をさせていただきました。
momoさんは、当初の私の質問が説明不足で理解できないということでしょうか? そうであれば、大変申し訳ございません。 やみくもに質問しているつもりは無く、出来るだけご理解いただけるように 質問したつもりなのですが・・・。 結局、わたしがコードを書いたもの、間違いじゃありませんか? また、momoさんがコードを書いてくださったのを トライした結果について、コメントいただけませんか?
>もし他の理解を示される回答者さんがいらっしゃれば、そちらにお任せいたします とコメントされてしまいましたので、大変失礼ではございますが、どなたがアドバイスいただける方 いらっしゃいましたら、よろしくお願いいたします。
(ともP)
momoさんは「動くかどうか試して、動けば次に行ける」ようにコードを提示しました。 そのコードは元より、意味を理解できない、するつもりがないのでしたら「私には理解できないので答えだけ教えてくだしあ」と素直になってmomoさん以外から教えていただいたほうがいいですよ。 あなたが提示したコードを動かすためにはユニークなシート名や十分そろっているデータが必要なので 「試せ」というのは酷というものです。
マクロではないですが、作業列とピポッドテーブルをうまく使えば目に見えるデータは作れると思います。 変更したデータを何に使っているのかわからないですけどね。
http://oshiete1.goo.ne.jp/qa1760205.html
こちらが参考になるのではないでしょうか?
(とおりすがっ太)
(とおりすがっ太)さん
>momoさんは「動くかどうか試して、動けば次に行ける」ようにコードを提示しました それが私には意味が理解できませんでした。 ですので、momoさんがコードを書いてくださった内容を具体的に教えてくださいと お願いしたのです。
>するつもりがないのでしたら「私には理解できないので答えだけ教えてくだしあ」 >と素直になってmomoさん以外から教えていただいたほうがいいですよ このように思われてしまうのは残念でした・・。 私の書き方に問題があったのであれば申し訳ございません。
>「試せ」というのは酷というものです そんなつもりはございません。 先にも書きましたが、そうとられてしまうようなコメントをしてしまっているのであれば 失礼でしたが、私にはそんなつもりは無く、教えていただきたいと思って出来るだけ詳しく 説明したつもりでした。
最初から私は苦手なので教えてくださいと書いているように、質問しているのです。 その後、自分でやってみてはというコメントをいただいたので、私がわかる範囲で実行し、 そのコードを添付しただけです。そこからどうするか考えて行きましょうとコメントいただいた とおり、わからなかった事を再度質問したつもりなのですが・・・。
なにしろ、私の質問の仕方など、間違っているのかもしれませんね。 申し訳ございません。 それほど、無知ということなんでしょうね・・・。 ごめんなさい。何がいけなかったのかわからなくなってきました。
(ともP)
そんなに事を荒立てる気は無いので、私の書き方も足りなかったのだと思いますよ。 ともPさんが何度か質問されているのは知っていますので、 そろそろ順を追ってVBAを理解する方法を身につけて頂けたらな・・・と思っただけですので。
で、関数の方は試してみて頂けましたか?
まだ先に進めるおつもりでしたら、いくつか疑問があります。 ・結果、マクロでやるのか関数で行いたいのか? ・7/6の12週後が10/9になる理由(私の計算ではならないのですが・・・)
などですね。 他にもこれから出てくると思いますが なにしろ、急がれてるという事があると私も自身がありません。 (私も仕事を抱えていますので) (momo)
ざっくりですけど、こんな感じのコードで出来るのではないでしょうか? フィルタオプションを使ったサンプルです。 上の質問のとおり、12週後の日付がよくわからないので直接指定しています。 また、変数の定義、エラー処理等は省略しています。(ちょっと忙しくて・・・) 新しいブックにデータを用意して試してみてください。
Sub Macro1() With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日")
.Range("Q2:T2").Value = Array("<>#N/A", "21292", ">=" & sDay, "<=" & eDay) .Range("A1:O" & LastRow).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = "内示(21292)" .Range("A1").CurrentRegion.Copy Sheets("内示(21292)").Range("A1") .ShowAllData
.Range("Q2:T2").Value = Array("<>#N/A", "<>21292", ">=" & sDay, "<=" & eDay) .Range("A1:O" & LastRow).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = "内示(21292以外)" .Range("A1").CurrentRegion.Copy Sheets("内示(21292以外)").Range("A1") .ShowAllData
sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(#10/9/2009#, "yyyy/m/d") '12週後の日・・・? .Range("Q2:T2").Value = Array("<>#N/A", "21292", ">=" & sDay, "<=" & eDay) .Range("A1:O" & LastRow).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = "情報(21292)" .Range("A1").CurrentRegion.Copy Sheets("情報(21292)").Range("A1") .ShowAllData
.Range("Q2:T2").Value = Array("<>#N/A", "<>21292", ">=" & sDay, "<=" & eDay) .Range("A1:O" & LastRow).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = "情報(21292以外)" .Range("A1").CurrentRegion.Copy Sheets("情報(21292以外)").Range("A1") .ShowAllData
.Range("Q1:T2").ClearContents End With End Sub
(momo)
momoさん
レスありがとうございます。 早速ですが、書き込んでくださったコード試してみました。 結論として、求めたい形となっていました。ありがとうございます。 ここから、少しずつ修正していかなければならないのですね。
・まず、質問したいことは、P品番や仕コードについて、変換する為のVLOOKUP関数を どこに入れ込んだらいいのか。 ・新たに出来上がったシートが出来上がるまで、何度か『値の更新:品番リスト』といのが 出てきました。これは、『当社の品番リストシートを参照しVLOOKUP関数にて変換』という コードを入れ込むということでしょうか。
>で、関数の方は試してみて頂けましたか? はい。トライしてみました。 初めて使った関数でした。TURE FALSE にて認識可能となりました。
>まだ先に進めるおつもりでしたら、いくつか疑問があります。 >・結果、マクロでやるのか関数で行いたいのか? マクロで進めて行きたいと思っています。
>・7/6の12週後が10/9になる理由(私の計算ではならないのですが・・・) 申し訳ございません。私のINPUTミスでした・・・。 7/6の12週後は9/21の週でした。大変失礼いたしました。
(momo)さん
何度かトライし、出来上がりの状況把握しております・・・。 結果、完璧でした。本当にありがとうございます。
先ほど、とんちんかんな質問をしてしまいました・・・。 >・まず、質問したいことは、P品番や仕コードについて、変換する為のVLOOKUP関数を >どこに入れ込んだらいいのか。 >・新たに出来上がったシートが出来上がるまで、何度か『値の更新:品番リスト』と >いのが出てきました。 >これは、『当社の品番リストシートを参照しVLOOKUP関数にて変換』という >コードを入れ込むということでしょうか。 『値の更新:品番リスト』となった時に、品番リストがあるファイルを クリックしたら、ちゃんと品番変換され、求めたい結果が求められました。 申し訳ございません。
同じファイル内に、品番リストのシートを貼り付け実行してみたら、 スムーズに翻訳され、処理が走りました。
新しく作ってくださった、『21292』で判別したシートについてですが、正しくは『21291』で、 コードの『21292』の部分を『21291』に変更すればよいのですね?
それから、基本的なことですが、レスくださったコードは、マクロの記録で実行した後 そのコードを貼り付けたのでしょうか。 そもそも、マクロの作り方がよく分からないのです。 コード自体のスペルをいちいちINPUTしているわけではないですよね!? こんな質問したらまた、指摘されそうですが、マクロコードが出来るまでの 過程を知りたいのです。
お忙しいところ大変恐縮ですが、何卒宜しくお願いします。
(ともP)
もう一つ質問です。 momoさんからご指摘のありました、
>>・7/6の12週後が10/9になる理由(私の計算ではならないのですが・・・) >申し訳ございません。私のINPUTミスでした・・・。 >7/6の12週後は9/21の週でした。大変失礼いたしました についてですが、
『eDay = Format(#10/9/2009#, "yyyy/m/d") '12週後の日・・・?』 のところだと思いますが、ここを、当日の週を1週目として、12週後というのを求めるには どうしたらいいのでしょうか。 本日ですと、8/3の週が1週目とし、12週目は10/19の週になるのです。 何度も本当に申し訳ございません。 何卒宜しくお願いします。
(ともP)
いくつか質問があるので順番に・・・
>新しく作ってくださった、『21292』で判別したシートについてですが、正しくは『21291』で、 >コードの『21292』の部分を『21291』に変更すればよいのですね? そのとおりです。 急いで作ったのでミスがあってすみません。
>それから、基本的なことですが、レスくださったコードは、マクロの記録で実行した後 >そのコードを貼り付けたのでしょうか。 >そもそも、マクロの作り方がよく分からないのです。 >コード自体のスペルをいちいちINPUTしているわけではないですよね!? >こんな質問したらまた、指摘されそうですが、マクロコードが出来るまでの >過程を知りたいのです。
結果的にはすべて手打ちでコードを書いています。 ただ、マクロがわからない本当の初心者の頃は記録を頼りにSelectなどを使わない記述に 変える事を学んでいました。 その後、色々なオブジェクトやプロパティ、メソッドなどを理解していく過程で 自然と何も考えずに手入力で出来るようになっていました。 慣れと積み重ねが大切だと思いますので継続して頑張って頂きたいです。
> 『eDay = Format(#10/9/2009#, "yyyy/m/d") '12週後の日・・・?』 >のところだと思いますが、ここを、当日の週を1週目として、12週後というのを求めるには >どうしたらいいのでしょうか。 >本日ですと、8/3の週が1週目とし、12週目は10/19の週になるのです。 この、週というのは たとえば(今日は月曜なので明日として)8/4の場合も 週の頭である8/3からになるのですか? また、12週目は何曜日までですか? 8/4が本日として、具体的に何日から何日までが対象範囲かを教えてください。 (momo)
>結果的にはすべて手打ちでコードを書いています。 >ただ、マクロがわからない本当の初心者の頃は記録を頼りにSelectなどを使わない記述に >変える事を学んでいました。 >その後、色々なオブジェクトやプロパティ、メソッドなどを理解していく過程で >自然と何も考えずに手入力で出来るようになっていました。 >慣れと積み重ねが大切だと思いますので継続して頑張って頂きたいです。 そうでしたか。 やはり手打ちなんですね。本当にmomoさんのように自発的に手打ちが出来るようになるのか 今の私では創造しずらいですが、コードをよく見るようにするしかないということですね。 ありがとうございます。
>この、週というのは たとえば(今日は月曜なので明日として)8/4の場合も >週の頭である8/3からになるのですか? そうですね。8/4に処理をしたとしても、その週(8/3〜8/7)までは1週目とカウントしたいのです。
>また、12週目は何曜日までですか? 稼働日で集計したいので、実質は金曜日までです。
>8/4が本日として、具体的に何日から何日までが対象範囲かを教えてください。 8/4〜10/23までが12週目ということになります。 8/5の場合も10/23まで。 8/10の場合は10/30までです。
(ともP)
日付の範囲について解りやすく説明ありがとうございます。 では、こんな感じでどうでしょうか? 実際のデータがわからないのでエラー処理は相変わらずしていませんが
・変数の宣言を行った事 ・21292を21291に変更 ・情報シートの日付範囲を掲示されたとおりの12週目に設定 ・フィルタオプション部分をサブプロシージャ化
というように変更してみました。
試してみて、OKでしたら 解らない事を1つづつ調べながらVBAを楽しく覚えていっていただきたいです。
Option Explicit
Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)"
sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)"
.Range("Q1:T2").ClearContents End With End Sub
Sub myFilter(myRng As Range, mCode As String, msDay As String, meDay As String, MakeShName As String) With myRng.Parent .Range("Q2:T2").Value = Array("<>#N/A", mCode, ">=" & msDay, "<=" & meDay) myRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = MakeShName .Range("A1").CurrentRegion.Copy Sheets(MakeShName).Range("A1") .ShowAllData End With End Sub
(momo)
長文のレスありがとうございます。 早速試してみたのですが、『インデックスが有効範囲にありません』という エラーメッセージが出てしまいました。
ThisWorkbookに貼り付けただけなのですが・・・(T_T) 先ほどのコードではうまく作動したのですが、何がいけなかったのでしょうか? 私もエラーか箇所が何だったのか理解したいので教えていただけませんか?
それから、少し、PCが使える環境ではなくなるので、お返事できるのに時間がかかるかもしれませんが 必ず拝見し考えますので、コメントよろしくお願いいたします。
(ともP)
>早速試してみたのですが、『インデックスが有効範囲にありません』という >エラーメッセージが出てしまいました。
インデックスのエラーが出るという事は・・・
>With Worksheets("Sheet1") '実行シート
の所の最初のデータのあるシート名が違っていませんか? シート名がわからないのでとりあえず「Sheet1」にしていますが 最初のデータのあるシートの名前に変更してください。
という事を書いてませんでした。 すみません。
(momo)
momoさん
お返事遅くなりまして大変申し訳ございませんでした!! 再度教えていただいたとおり、Sheet1という事を確認し、再トライ。 見事に私の求めたい結果となりました。 ありがとうございます。
ココで質問ですが、構成として、 sub コード名()
End Sub となっているかと思いますが、間に挟まれている中で、 With
End with というのもありますね。どちらも青字になっています。 基本的な質問で呆れられるかもしれませんが・・・コレの 意味を教えてください。
また、マクロ処理前のF列(納期日)を【2009/8/5】という表示から 【20090805】という表示に変えたいと思い、マクロの記録でコードを 表示してみて、momoさんの作ってくださったコードの中に取り込もうとしたのですが、 『型が一致しません』というエラーが出てしまいました・・・。
私が入れ込んだコード及び箇所、不足コードを教えていただけないでしょうか? 下記にてエラーが出てしまったコードを貼り付けました。 ★印箇所です。
Option Explicit
Sub Macro1() ★Range(Selection, Selection.End(xlDown)).Select ★Selection.NumberFormatLocal = "yyyymmdd" Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyymmdd") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyymmdd") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)"
sDay = Format(DateValue(eDay) + 1, "yyyymmdd") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyymmdd") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)"
.Range("Q1:T2").ClearContents End With End Sub
Sub myFilter(myRng As Range, mCode As String, msDay As String, meDay As String, MakeShName As String) With myRng.Parent .Range("Q2:T2").Value = Array("<>#N/A", mCode, ">=" & msDay, "<=" & meDay) myRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = MakeShName .Range("A1").CurrentRegion.Copy Sheets(MakeShName).Range("A1") .ShowAllData End With End Sub
(ともP)
横からお邪魔します。 上から追って読んできたんですが、どうもともPさんが 「判らないことは(回答者に)判り易く質問する」ということにとらわれ過ぎちゃってる気がしたので。 検索して調べるということ、忘れてませんか? 例えば直前のレスで質問されている
With End with の件、[with end with]とそのままgoogleに入れるだけでも回答が得られます。 その検索結果から、「withってwithステートメント」と呼ばれるものなんだ。 とわかれば、またそれを検索語とすると より的確なページに辿り着けます。
http://msdn.microsoft.com/ja-jp/library/wc500chb%28VS.80%29.aspx ご一考を〜(ぞう@ヘルプって手もあるよ)
蛇足かもしれませんが… 判らない命令などのところにカーソルを置いてF1キーを押すと(インストールされていれば)その語句に関するヘルプが表示されます。 (既にご存知であればごめんなさい) (独覚)
コメントありがとうございます。 >「判らないことは(回答者に)判り易く質問する」 というのは私が無知であるがゆえに大切な事だと思っておりますので、 とらわれすぎているととられても仕方がありません。 もちろん、検索して調べたりしておりますが、今回回答していただいておりました momoさんの説明や、質問しやすい受け答えに私が甘えていたのだと思いますが・・・。 ご回答者様が端的に的確にご説明いただいておりましたので、私のボヤッとした理解度を 更に高めたいと思いました。なにしろ初心者中の初心者なので・・・。
また、検索ページのご提案までありがとうございました。
(独覚)さん
ご提案ありがとうございました。 知りませんでした。 早速使ってみたいと思います。 コードについて、また分からない事があれば質問させていただきます。 ありがとうございました。
どなた様か、申し訳ないのですが ★印の質問に対して、不足しているコードや、挿入位置など教えていただけないでしょうか? 何卒よろしくお願いいたします。
(ともP)
ヘルプは積極的に活用してみてください。 私はほとんどヘルプとネットだけで、VBAを覚えてきました。 本は参考になるものもあるのでしょうけど、読んだ事がありません。 F1キーは壊れるほど使いました。
という事で、Withステートメントについては調べてみてください。
さて、 > また、マクロ処理前のF列(納期日)を【2009/8/5】という表示から > 【20090805】という表示に変えたいと思い、 については
> With Worksheets("Sheet1") '実行シート > LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
の後に
.Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"
と、してみてください。
わざわざ
>Range(Selection, Selection.End(xlDown)).Select
などとしなくても
> LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
これで最終行を取得しているので活用できます。
(momo)
(momo)さん
本当に感謝します。 うまく作動しました。 ご指摘いただいたとおり、ヘルプ機能を大いに活用し、理解を深めたいと思います。 しかしながら、現時点では、その説明文自体が難しく、なかなか納得できないでいます・・・。 時間がかかりそうですね。
皆さんはどれ位の期間でVBAコードを覚えてらっしゃるのでしょうか。 momoさんにおいては、ネットとヘルプのみで習得されてらっしゃるようで、すごいですね。
まだまだ質問させていただく事も多いかと思いますが、今後とも何卒よろしくお願いいたします。
(ともP)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.