エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、
sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。
マクロを実行するには、Visual Basicを開いてF5を押しています。
それをsheet1かsheet2の中身の一部分でも変更すると
そのときに自動的にマクロが実行されるようにしたいです。
sheet1とsheet2(sheet3は空白のまま)に
Private Sub Worksheet_Change(ByVal Target As Range)
Call マクロ()
End Sub
を入れ、
次に、標準モジュールに
Sub マクロ()
'下記よりsheet1とsheet2の内容をsheet3にコピーする
Worksheets("sheet1").Range("C1:BE50").Copy _
Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50")
Worksheets("sheet2").Range("C1:BE100").Copy _
Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150")
'下記より上記sheet3の状態から余分な空白行を削除する
Dim UsedCell As Range
Dim Max_Row, RowCount As Integer
Set UsedCell = ActiveSheet.UsedRange
Max_Row = UsedCell.Cells(UsedCell.Count).Row
Application.ScreenUpdating = False
For RowCount = Max_Row To 1 Step -1
If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then
Rows(RowCount).Delete
End If
Next
Application.ScreenUpdating = True
End Sub
をやって、sheet1かsheet2のセルを変更すると
エクセルが固まってしまいます。
デバックでは
Rows(RowCount).Delete
がよくないようです。
書き方が間違っているのでしょうか?
間違いのその1:
今のマクロは,changeイベントが走った時点でのactivesheetに対して諸々処理をするマクロになってしまっています。少なくともそうじゃなく,Sheet3に対して削除なりをするように直す必要がありますね。
付随しての間違いのその2:
上述の結果,シート1/2の空行を削除してしまっています。するとそのアクションがまたchangeイベントをトリガします。結果してchangeイベントから「マクロ」マクロの呼び出しが多重で発生し,場合によってはスタックオーバーフローで停止します。
で。こんなカンジですかね。
シート1とシート2のシートモジュールに:
private sub worksheet_change(byval Target as excel.range)
call macro1
end sub
標準モジュールに:
sub macro1()
with worksheets("Sheet3")
.cells.clearcontents
on error resume next
worksheets("Sheet1").range("C1:BE50").specialcells(xlcelltypeconstants).entirerow.copy _
destination:=.range("A1")
worksheets("Sheet2").range("C1:BE100").specialcells(xlcelltypeconstants).entirerow.copy _
destination:=.range("A" & .usedrange.rows.count + 1)
end with
end sub
質問者
補足
ありがとうございます。
sheet1とsheet2の全ての情報をsheet3にコピーしてまとめ、
sheet1とsheet2の間にある空白行を削除する件ですが、
アドバイスをいただいたコードをそのままコピペしましたが
マクロを実行しても何も起きません。
マクロは有効にしてあります。
コピペしたコードの貼付場所はMicrosoft Excel Objectsのsheet1とsheet2に
Private Sub worksheet_change(ByVal Target As Excel.Range)
Call macro1
End Sub
といれ、
標準モジュールのModule1に
Sub macro1()
With Worksheets("Sheet3")
.Cells.ClearContents
On Error Resume Next
Worksheets("Sheet1").Range("C1:BE50").SpecialCells(xlCellTypeConstants).EntireRow.Copy _
Destination:=.Range("A1")
Worksheets("Sheet2").Range("C1:BE100").SpecialCells(xlCellTypeConstants).EntireRow.Copy _
Destination:=.Range("A" & .UsedRange.Rows.Count + 1)
End With
End Sub
を入れました。原因は何でしょうか・・・
補足
詳しくアドバイスして頂き、ありがとうございます。 いろいろ試してみましたが、やはりダメでした。 ↓その作業画面を画像にして、アップロードしました。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/newfile_sample.html