내 VBA 코드에서 다음 줄을 :Range.Copy가 오류를 발생시키는 원인은 무엇입니까?
wks.Rows(lLastRow).Copy
보통은 잘 작동합니다. lLastRow는 항상 11입니다. wks는 항상 활성 시트입니다.
그러나 때로는 위의 행에서 "범위 클래스의 복사 메소드가 실패했습니다"라는 유형의 오류가 발생하기 시작합니다.
그런 다음 Excel 파일을 다시 시작해야 줄이 다시 작동합니다.
문제의 원인에 대해 생각해보십시오. 파일이 다시 시작되면 Range.Copy
문이 작동을 멈추고 다시 작업을 시작할 수있는 원인은 무엇입니까?
편집 : 여기 내 코드가 더 있습니다. 이 코드는 NewActionButton()
Sub NewActionButton()
'Dim runState As New cRunState
'Set runState = New cRunState
If bProduction = True Then On Error GoTo ErrHandler
'START
Dim lStart As Long
Dim lId As Long
Dim lDate As Long
Dim lEnd As Long
Dim wks As Worksheet
Set wks = GetSheetByCodename(ThisWorkbook, "wActions")
lStart = 2
lId = 3
lDate = 2
lEnd = 12
Call NewRow(wks, lStart, lId, lDate, lEnd)
'END
On Error GoTo 0
Exit Sub
ErrHandler:
MsgBox ("Ett of" & oe & "rutsett fel har skett.")
End Sub
나는 오류가있는 프로 시저를 호출 버튼에 의해 시작됩니다. 처음 실패하면 .Insert 문에 오류가 발생하는 것 같습니다. 그런 다음 매크로를 다시 실행하면 .Copy 문에 오류가 발생합니다. 문서를 다시 시작하면 작동합니다.
Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
Dim lLastRow As Long
Dim rConstants As Range
Dim rConstant As Range
Dim rEarlierIds As Range
'Determine last row based on criteria column
lLastRow = LastRow(wks.Columns(lIdCol))
'Copy template row from directly above
wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy
'Insert new row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert
'Remove unwanted properties
Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
If Not rConstants Is Nothing Then
For Each rConstant In rConstants.Cells
rConstant = ""
Next rConstant
End If
'Add ID
Set rEarlierIds = wks.Columns(lIdCol)
wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")
'Add Date
wks.Cells(lLastRow + 1, lDate) = Date
'Remove copy marking
Application.CutCopyMode = False
End Sub
EDIT2 다음를 취소하려면 문은 새 범위를 삽입한다. 그러나, 그럼에도 불구하고, 실행이 중지되고 나는 오류 메시지가 "범위 클래스의 삽입 방법은 실패 그래서 라인은 작업 수행, 아직 오류가 발생합니다 및 실행이 중지
EDIT3 :.. 나도 몰라 무엇이 잘못되었지만 패턴을 발견했습니다 .Excel 파일을 연 후 immedietly 매크로를 실행하면 .Insert 문이 작동하며 원하는 횟수만큼 실행할 수 있습니다. 그러나 셀을 두 번 클릭하면 바로 ESC를 클릭하여 셀을 종료 한 다음 매크로를 다시 실행하면 .Insert 문이 오류를 발생시킵니다.이 점은 나에게 이해가 가지 않습니다.이 코드는 현재의 모습으로 업데이트되었습니다. .
EDIT5 : 아래 코드는 완벽하게 작동합니다. 내가 바꾼 점은 내가 복사 한 다음 삽입하지 않는다는 것입니다. 대신에 먼저 새 행을 삽입 한 다음 복사합니다. 나는 아직도 나의 이전 코드가 작동하지 않는 이유를 모른다. 누군가가 아이디어를 가지고 있거나 버그를 발견하고 어떤 상황에서 버그가 발생했는지에 대해 말할 수 있기를 바랍니다.
Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
Dim lLastRow As Long
Dim rConstants As Range
Dim rConstant As Range
Dim rEarlierIds As Range
'Determine last row based on criteria column
lLastRow = LastRow(wks.Columns(lIdCol))
'Insert new row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert
'Copy template row from directly above
wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy
'Paste formulas row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).PasteSpecial xlPasteFormulas
'Remove values
Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
If Not rConstants Is Nothing Then
For Each rConstant In rConstants.Cells
rConstant = ""
Next rConstant
End If
'Add ID
Set rEarlierIds = wks.Columns(lIdCol)
wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")
'Add Date
wks.Cells(lLastRow + 1, lDate) = Date
'Remove copy marking
Application.CutCopyMode = False
End Sub
몇 가지 의견 : Application.CutCopyMode를 False로 설정 했습니까? 또한 NewRow() 하위에서 LastRow() 함수를 사용하면 어떤 이점이 있습니까? 대신 내장 함수를 사용하여 마지막 행을 결정할 수 있습니까? – Mike
A1 : 전에는 몰랐습니다. 이 게시물을 작성한 후 복사 된 범위 주변의 표시를 제거하기 위해 코드에 추가했습니다. 그것 이외에 다른 이점이 있는지 나는 모른다. 나는 읽을거야. 그러나 CutCopyMode = False를 프로 시저 끝 부분에 추가 한 후에도 여전히 문제가 발생합니다. A2 : Cells.Find ("*", [A1],, xlByRows, xlPrevious)와 같은 내장 함수 .Row 또는 End (xlUp)는 필터에 의해 숨겨진 텍스트를 등록하지 않습니다. – user1283776
복사 행의 서식/텍스트가 안에 있습니까? 클립 보드에 이미 이전 행이 있고 행을 다시 복사하려고하기 때문에 Excel에서 메모리가 부족할 수 있습니까? wks.Rows (lLastRow) 전에 빈 셀을 직접 복사하려고합니다. 클립 보드를 "지우고"이것이 도움이되는지 확인하십시오. – Michael