- ベストアンサー
VBAでのデータ並び替え、条件判断について
- Excel2003、VBA6.5でマクロに挑戦しているVBA初心者です。
- Sheet1に貼り付けられたデータを、精査(並び替え、条件判断)し、結果をSheet2に出力させたい。
- 具体的な処理フローを示しながら、シンプルな形でVBAマクロを作成したいと思っています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マクロは標準モジュールに書きます。 方法1:エクセルはエクセルらしく使います sub macro1() dim r as long r = worksheets("Sheet1").range("A65536").end(xlup).row with worksheets("Sheet2") .range("A:A").numberformatlocal = "MM/DD" .range("D:D").numberformatlocal = "h:mm" .range("A2:A" & r) = date .range("B2:B" & r).formula = "=Sheet1!B2&Sheet1!C2" .range("C2:C" & r) = "固定値2" .range("D2:D" & r).formula = "=IF(Sheet1!D2=""AM"",TIME(9,0,0),IF(Sheet1!D2=""PM"",TIME(13,0,0),IF(Sheet1!D2=""PM2"",TIME(15,0,0),"""")))" end with '以下は必要に応じて with worksheets("Sheet2") .range("B2:B" & r).value = .range("B2:B" & r).value .range("D2:D" & r).value = .range("D2:D" & r).value end with end sub #補足 >必要になるデータだけ、Sheet1で検索した結果をSheet2に埋めて 詳細がないため盛り込んでいません。 方法2:エクセルを使いたくない人向けの書き方です sub macro2() dim r as long, i as long, res as variant r = worksheets("Sheet1").range("A65536").end(xlup).row worksheets("Sheet2").range("A:A").numberformatlocal = "MM/DD" worksheets("Sheet2").range("D:D").numberformatlocal = "h:mm" for i = 2 to r worksheets("Sheet2").cells(i, "A") = date worksheets("Sheet2").cells(i, "B") = worksheets("Sheet1").cells(i, "B") & worksheets("Sheet1").cells(i, "C") worksheets("Sheet2").cells(i, "C") = "固定値2" select case worksheets("Sheet1").cells(i, "D") case "AM" res = timeserial(9, 0, 0) case "PM" res = timeserial(13,0,0) case "PM2" res = timeserial(15,0,0) case else res = "" end select worksheets("Sheet2").cells(i, "D") = res next i end sub #補足 エクセルのワークシート上には既に「配列」っぽくデータが配置済みです。 もちろん具体的な状況に依りますが,わざわざメモリに値を転送してから計算するより,直接セルから値を取り出して演算したり,直接転記した方が少し高速な場合もあります
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7941)
.range("B2:B" & r).formula = "=Sheet1!B2&"" ""&Sheet1!C2" といった具合で,必要な書きぶりは前回回答でD列に式を入れさせているマクロのほぼそのままです。 追加ご質問から1日置いてもそのまま解決されていないところを見ると,見直し等されていない様子で大変残念です。 また,新しいマクロの記録で実際に「セルに必要な式を記入する」という操作をマクロに録ってみるのも,正しい書きぶりを知るよい手がかりなので,参考になさってみてください。
お礼
すみません、別件の仕事で確認が滞っていました。 スペースについてはお陰様で無事に解決しております。 もっとコードをいじってみて、お教えいただいた事を吸収できるよう、精進していきたいと思います。 本当にありがとう御座いました。
お礼
keithin様 ご回答いただき、ありがとう御座います。 方法1を使い、データ項目を増やしたりして(本来は項目が20程あるのです)テストしていますが順調に動いており、厚く御礼申し上げます。 もし可能でしたら、追加で1つだけお教えください。 方法1の、 .range("B2:B" & r).formula = "=Sheet1!B2&Sheet1!C2" のデータB+データCの結合の部分で、データBとCの間にスペースを入れるように変更を行ってみるべく、 "=Sheet1!B2&" "&Sheet1!C2" 等、幾つか自分なりに調べてみた結果を試したのですが、 コンパイルは問題なく通るものの、シートにはNULLやVALUE 表示になってしまいます。 表示されるような方法はあるのでしょうか。 (方法2なら、cells(i, " ")とかをBとCのデータを表示される間に入れてやることで解決できそうな気はするのですが…