excel vbaのことで質問ですExcel2003を使用していま

Writer: admin Type: ゃべり、雑談 Date: 2018-12-18 00:00
excel vbaのことで質問ですExcel2003を使用しています。シート1のA1からG1までに項目名が入ってA2から値が入力されていきます。日によって入力される行はまちまちですが、フォームボタンを押すと、入力された行を日ごとにカットしてシート2へ貼り付けをして集計するようにしたいのです。集計だけに下へ下へとデータも追加していきたいのですけれど下記のコードでは、アプリケーション定義またはオブジェクト定義のエラーとなるのですが、どのような記述が足りない(無駄)なのかも分からないので、ご教授いただければ幸いです。よろしくお願いいたします。Sub cutpaste() Range("A2:G2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Sheets("Sheet2").Select Range("A2").Select Selection.End(xlDown).Offset(1, 0).Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A2").SelectEnd Sub共感した0###Sheet2 にまだデータがない場合Selection.End(xlDown).Offset(1, 0).Selectでエラーになります。.End(xlDown)でシートの最終行になり、.Offset(1, 0)でその次の行になりますが、そんな行はないのでエラーになります。 Range("A1").Select Selection.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Selectとすればエラーなく貼り付けられます。ただし、Select しなくてもカットペーストは可能です。また、どのシートのどのセル範囲かを変数に代入してそれを利用すると、シンプルに記述できますし、処理も高速です。また、Select に頼ると想定外のシートが選択されていたりすると想定外の動作になるなど不安定になるのでこれは避けたいですね。もろもろ考慮して自分が書くなら下記のコードになります。Sub cutpaste()    Dim rng1 As Range    Dim rng2 As Range    Set rng1 = Worksheets("Sheet1").Range("A1").CurrentRegion    Set rng1 = rng1.Resize(rng1.Rows.Count - 1).Offset(1)    Set rng2 = Worksheets("Sheet2").Range("A1").CurrentRegion    Set rng2 = rng2.Resize(1).Offset(rng2.Rows.Count)     rng1.Cut rng2End SubCurrentRegion は指定したセルを含むデータのある矩形範囲を取得します。今回のように複数列のデータがあり、空欄があることも考慮するとCurrentRegion を使うと間違いがないです。ナイス0
###早速の回答ありがとうございました。問題点の指摘から、解決策までご提示していただきまして重ねて御礼申し上げます。今回いただいたコードから、また勉強させてもらおうと思いますいち早く回答頂けたのでBAに。

 

TAG