.Clear
メソッドでは、Worksheet_Change
が再び発生します。 Copy
操作が繰り返され、宛先がクリアされます。 2番目のClear
は何も変更されず、ソースは既にクリアされており、プロシージャは終了します。
Application.EnableEvents = False
と
Application.EnableEvents = True
はここで更新されたコードです:
は、あなたがして、あなたのコードを囲む必要があり
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nowMonth As Integer
Dim nowYear As Integer
Dim sheetNameStr As String
Dim oSheet As Excel.Worksheet
Dim oNewSheet As Excel.Worksheet
Dim sheetExists As Boolean
On Error GoTo errHandler
Application.EnableEvents = False
nowMonth = Month(Now)
nowYear = Year(Now)
sheetNameStr = nowMonth & "," & nowYear
sheetExists = False
For Each oSheet In ThisWorkbook.Worksheets
If sheetNameStr = oSheet.Name Then
sheetExists = True
Exit For 'Found, can exit the loop.
End If
Next
If Not sheetExists Then
Set oNewSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Sheets.Count))
oNewSheet.Name = sheetNameStr
MsgBox "New sheet named " & sheetNameStr & " was created."
End If
Me.Activate
Me.Range("A4:D300").Copy ThisWorkbook.Worksheets(sheetNameStr).Range("A1")
Me.Range("A6:D300").Clear
Recover:
On Error Resume Next
Set oNewSheet = Nothing
Set oSheet = Nothing
Application.EnableEvents = True
Exit Sub
errHandler:
MsgBox Err.Description, vbExclamation + vbOKOnly, "Error"
Resume Recover
End Sub
Worksheets
が今ThisWorkbook
で修飾されていることに注意してください。それ以外の場合、コードはアクティブなワークブックを参照します。また、Sheets("Main")
がMe
に置き換えられました。あなたのコードがMain
ワークシートの背後にあり、そこからMe
がワークシートそのものであると仮定しています。最後に、EnableEvents
をオフにするたびに、問題が発生した場合に再度オンにするための適切なエラー処理を提供する必要があります。
編集
ここでEnableEventsを処理するだけの最小限の変更で元のコードです:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo errHandler
Application.ScreenUpdating = False
nowMonth = Month(Now)
nowYear = Year(Now)
sheetNameStr = nowMonth & "," & nowYear
sheetExists = False
For Each Sheet In Worksheets
If sheetNameStr = Sheet.Name Then
sheetExists = True
Exit For
End If
Next Sheet
If Not sheetExists Then
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = sheetNameStr
MsgBox ("New sheet named " & sheetNameStr & "was created")
End If
Sheets("Main").Activate
Worksheets("Main").Range("A4:D300").Copy Worksheets(sheetNameStr).Range("A1")
Worksheets("Main").Range("A6:D300").Clear
Recover:
On Error Resume Next
Application.ScreenUpdating = True
Exit Sub
errHandler:
MsgBox Err.Description, vbExclamation + vbOKOnly, "Error"
Resume Recover
End Sub
あなたのコードは私のために動作します。 (a)「Change」イベントコードはどのシートですか? (私はそれが "メイン"にないと仮定するか、クラッシュするだろう)(b)あなたは他のイベントタイプのコードを持っていますか? (c)複数のワークブックを開いていて、複数のシートに「メイン」というシートがありますか? (もしそうなら、おそらく、データをコピーしてからそれを消去するのではなく、間違ったワークブックから)。 – YowE3K
@ YowE3K(a)私はそれがメインであると確信していますが、確認する方法はわかりません。 (b)それは私が持っている唯一のイベントタイプコードです。(c)1つのワークブックを開きます – Youiee