- ベストアンサー
エクセル マクロについて
エクセルマクロで月毎のデータを同じシートの次の列に 貼り付けるにはどうすればいいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それでは順を追って説明していきますね。 Dim Src As Worksheet, Dst As Worksheet Dim col As Integer これは変数の宣言部です。 Srcはコピー元のシート、Dstはコピー先のシートで、Worksheetオブジェクト型として宣言しています。 colは整数として宣言しています。コピーする列番号を格納するのに使っています。 Set Src = Worksheets("Sheet1") Set Dst = Worksheets("Sheet2") SrcとDstに、それぞれSheet1とSheet2を表すオブジェクトをセットしています。普通の変数の代入と違って"Set"とついているのは、代入する変数がオブジェクトの場合、そうしなければならないと決まっているから、と思ってください。(詳しく説明すると長くなるので) col = Dst.Cells(2, 255).End(xlToLeft).Column + 1 これが一番わかりにくいところかもしれません。よく使う式なのですが、2行目でデータが入っている最後のセルの列番号+1、つまり次にデータを転記する列番号を取得する式です。 End(xlToLeft)とは、Excelにおいて「Endキー+左矢印」を押したときに選択されるのと同じセル、つまりデータが入力されている範囲の端を意味します。(Endキー+矢印の使い方がわからなかったら、自分で適当にセルにいろいろ入力して試してみるとわかります) Dst.Cell(2,255) というのはDest、つまりSheet2の2行目、255列目のセル、という意味で、Range("IU2")と書くこともできます。これはExcelの列数が最大256行目なので、2行目の右端という意味でそう書いたのですが、実はちょっと私の方で勘違いがあり、255と書いてしまいました。厳密に書くとDest.Cell(2,256)が2行目の右端です。 ここから左に戻って、データが入力されている一番右端のセルを、 Dst.Cells(2, 255).End(xlToLeft) で求めており、その列番号をColumnプロパティで取りだして、次にデータを入力するのはその次の列なので+1をしております。 なお、なぜ終端のセルを調べるのに先頭のセルから右へ、でなく最後のセルから左へ、とやっているかと申しますと、先頭からやると途中で空白のセルがあった場合にそこで止まってしまうからです。それで、一番最後から戻って値が入力されているセルを探しています。これなら確実に一番端をとらえることができるので、割とよく使われます。 最後に、 Src.Columns(col).Copy (Dst.Columns(col)) ですが、これを日本語に書くと、Src(Sheet1)のcol列全体をDst(Sheet2)のcol列全体にコピーしなさい、という命令になります。 これでコピー操作が行われます。 で、実は今までこの式に使う変数を代入してきましたが、いったん変数に入れなくてもこの式は、 Worksheet("Sheet1").Columns(Worksheet("Sheet2").Cells(2, 256).End(xlToLeft).Column + 1).Copy (Worksheet("Sheet2").Columns(Worksheet("Sheet2").Cells(2, 256).End(xlToLeft).Column + 1)) とまとめることができてしまいます。しかしこう書くと何がなんだかわからないし、シート名を変更しようとすると何ヶ所も変更しないといけません。それで、一つずつ変数に代入し、最後のコピーの処理をすっきりさせている、というわけです。
その他の回答 (2)
- ham_kamo
- ベストアンサー率55% (659/1197)
> 毎月のデータを蓄積させて、新しく隣の列にマクロを実行する度に > 毎回その月のデータを別シートから反映させたいのですが。。 「別シート」からですか?質問文には「同じシートの次の列に」と書かれてますが…。 データが蓄積されるのはその別シートで、更新のタイミングでそれを月毎のシートに反映させるのですか?その「別シート」は、マクロで更新したいシートと同じフォーマットなのでしょうか。その辺の情報を正確に書いていただけないと、的確なアドバイスができません。 とりあえず、 ・両シートとも同じフォーマット ・1行目はタイトル行(○月とか入ってる) ・A列も項目名などが入っているタイトル行 ・2行目以降にデータが入っていて、一番右の空の列に、元となるシートの同じ列をコピーする。 ・コピー元シート名は"Sheet1"、コピー先シート名は"Sheet2" と仮定して、列をコピーするマクロを書いてみました。 Sub 月別累積データ更新() Dim Src As Worksheet, Dst As Worksheet Dim col As Integer Set Src = Worksheets("Sheet1") Set Dst = Worksheets("Sheet2") col = Dst.Cells(2, 255).End(xlToLeft).Column + 1 Src.Columns(col).Copy (Dst.Columns(col)) End Sub 多分、やりたいことと何か違っているかと思いますので、補足をお願いします。
補足
迅速なご回答ありがとうございます。 >「別シート」からですか?質問文には「同じシートの次の列に」と書かれてますが…。 これは累計データに関数が入っているのでそのまま応用しようとしたのですが コピー元の別シートを同じフォーマットにすればいい話でした。 理解しにくくて申し訳ありませんでした。 そして、上記のマクロを貼り付けてほぼ完成に 近いものができました(≧∀≦) ありがとうございます。 やはり変数を宣言しなけば毎回セルを追加しデータを蓄積 することは自動マクロでは無理がありますよね。。。 自分でも上記のマクロを調べ勉強しようと思っていますが 簡単でいいので内容の注釈を時間がある時に頂けないでしょうか?
- ham_kamo
- ベストアンサー率55% (659/1197)
もう少し具体的な情報をお願いします。 表のフォーマットはどうなっていて、月ごとのデータはどのように入っているのですか? 「月毎のデータを同じシートの次の列に」ということは、月毎に1列ずつあって、一番最後の列を隣にコピーしたいのでしょうか?
補足
抽象的ですいませんでした。 >月毎に1列ずつあって、一番最後の列を隣にコピーしたいのでしょうか? まさにその通りです。 毎月のデータを蓄積させて、新しく隣の列にマクロを実行する度に 毎回その月のデータを別シートから反映させたいのですが。。
お礼
本当にご丁寧かつ初心者にもとても解りやすい ご説明ありがとうございます!! しかも変数を代入しくても作成可能とは驚きでした。 ポイントを付与する程度でのお礼では申し訳 ない思いで一杯です。。。 本当にありがとうございました!!!