- 締切済み
エクセルマクロの自動実行について
以前に似たような質問をしましたが、改めて質問いたします。 以下エクセルデータの集まりがあり(スペースはセル区切り)、 id 名称 項目1 項目2 項目3 項目4 101 社員1 103 11:11:11 22:22:22 33:33:33(→グループA) 102 社員2 104 11:11:11 22:22:22 33:33:33(→グループD) 103 社員3 200 11:11:11 22:22:22 33:33:33(→グループD) 104 社員4 201 11:11:11 22:22:22 33:33:33(→グループC) 105 社員5 202 11:11:11 22:22:22 33:33:33(→グループB) (以下120レコード続く) ifかcaseでid毎にグループ分けし、その結果を行単位で別シートに貼り付けるマクロ処理を考えています(以下結果)。 グループ id 名称 項目1 項目2 項目3 項目4(←項目欄) グループA 101 社員1 103 11:11:11 22:22:22 33:33:33 グループB 105 社員5 202 11:11:11 22:22:22 33:33:33 グループC 104 社員4 201 11:11:11 22:22:22 33:33:33 グループD 102 社員2 104 11:11:11 22:22:22 33:33:33 103 社員3 200 11:11:11 22:22:22 33:33:33 ※項目2~4は便宜上データが同じ値にしてますが、実際はほぼすべて違います。 idから項目1まではvariant変数を使って出来ましたが、項目2からが書式を指定しなければならず、 対応できるのはrangeでpastespecialプロパティだけで、その場合セルを1つずつ下にずらして120回自動で処理の方法が分かっていません。 出来るかどうかは調べている最中ですが、 (1)一旦IDセルのみチェックし、その後範囲を項目4まで広げて、行ごと同形式でコピー&別シートに貼り付け。を120回繰り返す。 →セル範囲拡張方法とセル移動をoffsetで対応できるかの調査。 (2)rangeオブジェクトでもセルごとの自動チェックが出来るか再調査。 いずれの方法にしても、変数を使って内容を調べ自動で処理する方法を探しています。 いい方法をご存知の方が居ましたら、ご教授願います。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- keithin
- ベストアンサー率66% (5278/7941)
グループって何か不明なので無視します。 IDが101、102、103とあるときに、それぞれをGP1、GP2、GP3という名前のシートにコピーしてみます。 sub macro1() dim a as variant dim b as variant dim i as long a = array(101,102,103) b = array("GP1","GP2","GP3") for i = 0 to ubound(a) worksheets("シート名").range("A:A").autofilter field:=1, criteria1:=a(i) worksheets("シート名").cells.copy worksheets(b(i)).range("A1") next i worksheets("シート名").autofiltermode = false end sub #参考 >変数を使って内容を調べ自動で処理する方法を探しています。 マクロの基本中の基本なので、そのレベルで出来ないのでしたら「初めてのエクセルVBA」タイプの参考書を1冊勉強する事をお勧めします。 作成例: sub macro2() dim h as range for each h in worksheets("シート名").range("A2:A120") select case h.value case 101 h.entirerow.copy destination:=worksheets("GP1").range("A65536").end(xlup).offset(1) case 102 h.entirerow.copy destination:=worksheets("GP2").range("A65536").end(xlup).offset(1) case 103 h.entirerow.copy destination:=worksheets("GP3").range("A65536").end(xlup).offset(1) end select next end sub
- pati5090
- ベストアンサー率50% (1/2)
書式設定が問題なのでしょうか? であれば、書式設定を設定したテンプレートを別ファイルor別シートで作れませんか? (ユーザーが変更できないように、シートを非表示にしておくなどの工夫も必要) 流れとしては、 (1)テンプレートファイルを開く(シートの場合は不要) (2)コピー範囲を選択してコピーする。 (3)テンプレートファイルorシートにペーストする。 (4)-1. 1グループ1IDでファイル保存してよければ、 テンプレートファイルを別名保存して(1)に戻る。 (4)-2. 1グループ1シートの場合は、ペーストしたシートをコピーして別名にする。 テンプレートのシートをクリアして(1)に戻る。 後、ID毎に並び替えしてよいのであれば、 IDの変わり目をループでチェックして範囲指定でコピーした方が1行ずつよりは良い気がします。
お礼
アドバイス有難うございます。 詰まっていたのは、値貼り付けだと時分秒(「::」部分)が「そのままの形式」で貼り付けされないことでした。 やろうとしていたのは、ID値を調べどのグループ(AとかBとか)に所属するかを決定し、 ID~項目4までをままの形式で別シートにグループ分け&ソートして貼り付け、でした。 (コントロールボタンに↑の処理を組み込んで処理したかったのです。) rangeオブジェクトで扱えば出来ることは調べて分かりましたが、その場合セルを特定(”A1:B3”とか)する方法しか知らず変数でカウントアップの方法を模索していました。 アドバイスを参考にしながら、もう少し調べてみます。
お礼
アドバイス有難うございます。 頂いたコードをまだ理解できていないので、仰るとおり入門書を見ながらまた考えてみます。