• 締切済み

エクセルマクロの構文

エクセルマクロに関してご教示いただきたく存じます。 下記の手順を1つのマクロで実行したい場合、どのような構文を書けば実現できますでしょうか? 前提: ・エクセル中、シート(1)、シート(2)を準備。 ・シート(1)には毎日1日分のデータを入力(例えば、1行目の経費項目、金額、経費支払者 の3カラムヘッダーの下に、2行目から1日分のレコードを入力していく) ・シート(2)には毎日の日別データを累積していく(例えば、シート(1)に1日目で10レコード、2日目で15レコード、3日目で20レコードの場合、3日目終了時に計45レコードにしたい。1行目の経費項目、金額、経費支払者 の3カラムヘッダーはシート(1)と同様) マクロ実行: ・シート(1)に1日目のデータ入力(10レコード)が終わった段階で、ボタンを押し、下記マクロを実行  (1)シート(1)の10レコード(A2:C11)を、シート(2)のA2:C11にコピー  (2)シート(1)の10レコード(A2:C11)を、削除(データクリア) ・シート(1)に2日目のデータ入力(15レコード)が終わった段階で、上記と同じボタンを押し、下記のマクロを実行  (1)シート(1)の15レコード(A2:C16)を、シート(2)のA12:C26にコピー(シート(2)において1日目のデータの次に累積させていく)  (2)シート(1)の15レコード(A2:C16)を、削除(データクリア) ・シート(1)に3日目のデータ入力(20レコード)が終わった段階で、上記と同じボタンを押し、下記のマクロを実行  (1)シート(1)の20レコード(A2:C21)を、シート(2)のA27:C46にコピー(シート(2)において1日目のデータの次に累積させていく)  (2)シート(1)の20レコード(A2:C21)を、削除(データクリア) ・4日目以降、同じボタンでマクロを実行する度に、シート(1)のデータがシート(2)の47行目以降、空白なく追加されていく 以上、皆様のお知恵をお貸しください。

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.4

シンプルに。 Sheet1及びSheet2の部分は適切に変更してください。 コピー後に元のデータを削除するので連打しても問題ないはずですが。 (1)Alt+F11でVBEを開き、挿入から標準モジュールを挿入し   最下のコードを貼り付け「×」でVBEを終了。 (2)Excelの開発タブ(なければオプション設定で表示)から   挿入→フォームコントロール→ボタンを挿入。 (3)「sample」マクロを選択。 また、図形などをボタンとして利用する場合は上記の(2)(3)は不要で、 (1)の後に図形を右クリックしてマクロ登録から「sample」を選んでください。 Sub sample() Dim St(1) As Worksheet, myRng As Range Set St(0) = Worksheets("Sheet1") Set St(1) = Worksheets("Sheet2") Set myRng = St(0).Range(St(0).Range("A2"), St(0).Cells(Rows.Count, "C").End(xlUp)) myRng.Copy St(1).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) myRng.ClearContents End Sub

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんにちは Sub test()   Dim sh1 As Worksheet   Dim sh2 As Worksheet   Dim t As Range   Set sh1 = Worksheets("Sheet1")   Set sh2 = Worksheets("Sheet2")   With sh2     Set t = .Range("A" & .Range("A1").CurrentRegion.Rows.Count + 1)     sh1.Range("A1").CurrentRegion.Offset(1).Copy t   End With End Sub これ位でも。 既出ですが、2重登録を防ぐ手段は必要ですよね。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 もし例えば、       A列   B列    C列 1行目  経費項目  金額  経費支払者 2行目   a     100    あ 3行目        110    い 4行目   b     120    う 5行目        140    え 6行目        150    お などの様にA列の最終行が必ずしも入力データの最終行であるとは限らない事もあり得る場合には、下記の様なVBAのマクロとして下さい。  尚、下記のVBAのマクロでは、入力用のシートにデータが未入力となっている場合には、 「処理すべきデータが見当たりませんません。  マクロを終了します。」 という表示が現れて、処理を行わないようになっておりますので、 >何度もクリックすると累積も無駄なものになる という心配はありません。 Sub QNo9284968_エクセルマクロの構文() Const InputSheetName As String = "Sheet1" '入力用シートのシート名 Const RecordSheetName As String = "Sheet2" 'データ蓄積用シートのシート名 Const FirstRow As Long = 2 '入力用シートの実際のデータ(項目名は除く)を入力する最初の行の行番号 Const FirstColumn As String = "A" '入力用シートのデータを入力するセル範囲の中で最も左端の列の列番号 Const LastColumn As String = "C" '入力用シートのデータを入力するセル範囲の中で最も右端の列の列番号 Const PasteColumn As String = "A" 'データ蓄積用シートのデータ転記先のセル範囲の中で最も左端の列の列番号 Dim buf As Variant, Sh(1) As Worksheet, LastRow(1) As Long, i As Long, c As Range buf = Array(InputSheetName, RecordSheetName) For i = 0 To 1 If IsError(Evaluate("ROW('" & buf(i) & "'!A1)")) Then MsgBox Array("入力", "データ蓄積")(i) & "用シートとして設定されている" _ & vbCrLf & vbCrLf & buf(i) & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set Sh(i) = Sheets(buf(i)) Next i For i = 0 To 1 With Sh(i) For Each c In .Range(FirstColumn & Rows.Count & ":" & LastColumn & Rows.Count) buf = c.End(xlUp).Row If LastRow(i) < buf Then LastRow(i) = buf Next c End With Next i If LastRow(0) < FirstRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Sh(0).Range(FirstColumn & FirstRow & ":" & LastColumn & LastRow(0)) .Copy Sheets(RecordSheetName).Range(PasteColumn & LastRow(1) + 1) Application.CutCopyMode = False .ClearContents End With End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

質問文が長い。 10レコードは毎回決まっているのか、それ以上もあるのか?など不明だが。 コードは下記のように、いたって少数で済むのでは。 Sheet2の第1行にもSheet1と同じ見出し文言を入れておく。 Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") lr1 = sh1.Range("A10000").End(xlUp).Row '最終行数の取得 lr2 = sh2.Range("A100000").End(xlUp).Row MsgBox lr1 & " " & lr2  ’確認用 sh1.Range("a2:D" & lr1).Copy sh2.Range("A" & (lr2 + 1))  'コピー貼り付けSheet1->Sheet2 sh1.Range("a2:D" & lr1).Clear ' Sheet1元データクリア End Sub ボタンのクリックイベントにモジュール名1行をいれたら仕舞いでは。 何度もクリックすると累積も無駄なものになるので、防止策をどうするか考えること。 日付などがあれば、その日付でSh2の最終行の日付とSh1の最終行の日付が同じなら、注意コメントを出して取り消しできるようにするとか。

関連するQ&A