• ベストアンサー

VBAの構文を教えてください

エクセルで請求書を取引先別に作っております。 シート1には当月請求データ、シート2は過去の請求データを入れています。 シート1の当月請求データを次月になったら、シート2に移動したいです。 シート1の請求データ(売上日・品名・金額等)をシート2の一番最後の行に移動させるにはどういう構文になるのでしょうか? シート2は月ごとに1行ずつあけてデータを入力させているので、 空白を調べてそこにデータを入力するという構文は使えないのでパソコン教室で習った構文は使えなくて、困っています。

質問者が選んだベストアンサー

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

Sheet1の内容全てで良ければ単純に書けば、 Sub try() Worksheets("Sheet1").UsedRange.Copy _ Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1) End Sub Sheet2のA列を基準に最終行を求めてます。

happine
質問者

お礼

出来ました。どうもありがとうございます。 勉強したことなかった構文でした。 そういうのが載っている本があれば勉強したいです。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 最近、他人のワークシートを見せられて感じたのは、「セルの結合」をふんだんに使ってあるシートでは、マクロがうまくいきません。しかし、少なくとも、今回のスタイルのような場合は、値コピーぐらいはしておいたほうが無難かと思います。言い換えると、貼り付ける側に、すでに、書式を設定しておくとということです。 なお、Excel 2007 でも、65536行をフルに使うのは得策ではありませんので、一応、65536行を最大行にしてあります。 '------------------------------------- '標準モジュール Sub Test1() Dim rng As Range Dim i As Long With Worksheets("Sheet1")  '1行目からなので、A2なら、2行目  Set rng = .Range("A1", .Range("A65536").End(xlUp).Offset(, 5))  rng.Copy  'Offset の場合は、5+1で、6列コピーという意味 End With With Worksheets("Sheet2")  i = .Range("A65536").End(xlUp).Row  If i > 2 Then   '1列目のデータを1行空けて、次の行から貼り付ける   .Cells(i + 2, 1).PasteSpecial xlPasteValues '月度のデータは1行空けるから  Else   '最初の場合は、タイトル行があるから、2行目に貼り付ける   .Cells(2, 1).PasteSpecial xlPasteValues  End If End With If MsgBox("シート1のデータは削除しますか?", vbOKOnly) = vbOK Then  rng.ClearContents Else  Application.CutCopyMode = False End If Set rng = Nothing End Sub 書籍の紹介ですが、 大村あつし氏の 『かんたんプログラミング Excel2003 VBA 基礎編 』技術評論社 http://www.amazon.co.jp/exec/obidos/ASIN/4774119660 もしくは、Excel 2007 でも良いです。一部では、オブジェクトの使い方が大幅に違う部分がありますが、下位バージョンのコードをマスターしていれば、まごつくことはありません。 このシリーズの「応用編」は、Excel2003 やVB6がないと、半分ぐらいは意味がありません。 また、上級レベルまで勉強したい人には、書籍でないと不可能な部分があります。中級レベルですと、オートメーションの使い方などが必要になるのですが、Vista では、あまり直接使えることはなくなりそうな気がします。 現実に、すでに、2000年で、現行のVBAの詳細仕様の公開は終わってしまってしまいし、今年になって、MSDN のWebサイトでも、以前のVBAの日本語バージョンは削除されてしまいました。2007になって、ますます、Helpなども分かりにくくなってしまいましたし、Vista では、VBAでは、セキュリティが厳しくなって制限付きになってきてしまいました。 後は、こうした掲示板で有識者に聞くしか手がありません。もしくは、VBAの基本を勉強して、次の.Net に備えたほうが利口かもしれません。.Net のほうが応用が利きます。VBAでは、ASP やVBScript 程度しかありません。 私は、あまり、個々の人たちが作っているWebサイトは、仮に、Moug でも、単発的な情報だけで、自分自身で学習し構築できるものは少ないのと、コードに癖の強いものや、曖昧な表現で初学者にとって混乱させられるようなものがありますので、基本的なことを学ぶにはあまり適してはいないように思っています。なお、私個人は、MSDN以外では、ほとんど、参考にすることはありません。 いずれにしても、VBAも、プログラミング言語ですから、ひとつずつ、自分の手で500個のコードを書けば、一通りは覚えると思っていいです。

happine
質問者

お礼

詳しくありがとうございます。 お知らせいただいた本は、本屋で注文しようかと思います。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

>そういうのが載っている本があれば勉強したいです。 「Range("A" & Rows.Count).End(xlUp).Offset(1) 」 でWEB照会(Googleなどで)してご覧。 6万件の記事があるそうだよ。私などVBAの回答に毎回使っている。 Range("A65536").End(xlUp).Row でやっているが、データの最下行の行番号数を捉えている。 エクセルは全データ行について繰り返し処理をすることが多いので、最終行まで繰り返しにForNextなど使うと必須の物です。 私見ではVBAで一番早く知るべきことです。 ーーー UsedRangeについてもWEB照会してご覧。

happine
質問者

お礼

本よりサイトの方がいいみたいで。 調べていきます。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

ANo.1です。 >そういうのが載っている本があれば勉強したいです。 私は本よりネットでの回答や解説を参考にしてます。 本は意味を調べたりする程度でしょうか。 http://www.asahi-net.or.jp/~ef2o-inue/top01.html http://www.officetanaka.net/ http://www.eurus.dti.ne.jp/~yoneyama/index.html 特に参考にさせて頂いているサイトです。

happine
質問者

お礼

使いたいと思います。 再度ありがとうございます。 助かりました。

すると、全ての回答が全文表示されます。

関連するQ&A