2014-12-09 6 views
3

내 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 
+0

몇 가지 의견 : Application.CutCopyMode를 False로 설정 했습니까? 또한 NewRow() 하위에서 LastRow() 함수를 사용하면 어떤 이점이 있습니까? 대신 내장 함수를 사용하여 마지막 행을 결정할 수 있습니까? – Mike

+0

A1 : 전에는 몰랐습니다. 이 게시물을 작성한 후 복사 된 범위 주변의 표시를 제거하기 위해 코드에 추가했습니다. 그것 이외에 다른 이점이 있는지 나는 모른다. 나는 읽을거야. 그러나 CutCopyMode = False를 프로 시저 끝 부분에 추가 한 후에도 여전히 문제가 발생합니다. A2 : Cells.Find ("*", [A1],, xlByRows, xlPrevious)와 같은 내장 함수 .Row 또는 End (xlUp)는 필터에 의해 숨겨진 텍스트를 등록하지 않습니다. – user1283776

+0

복사 행의 서식/텍스트가 안에 있습니까? 클립 보드에 이미 이전 행이 있고 행을 다시 복사하려고하기 때문에 Excel에서 메모리가 부족할 수 있습니까? wks.Rows (lLastRow) 전에 빈 셀을 직접 복사하려고합니다. 클립 보드를 "지우고"이것이 도움이되는지 확인하십시오. – Michael

답변

0

이것은 VB 명령이 일반적으로 Excel이 자체 인터페이스에서 수행하는 명령에 해당한다는 사실과 관련이 있습니다. 대부분의 경우이 문제는 발생하지 않습니다. 사실 매크로 기록이 작동하는 이유입니다 (매크로 기록이 제대로 작동하지 않는 경우에도 마찬가지입니다). 때때로 당신은 단도를 얻습니다. 이 중 하나와 같은 냄새가납니다 (복사/붙여 넣기를 포함하는 다른 하나는 종종 붙여 넣기 명령보다 붙여 넣기가 호출 될 때 InvalidOperation 예외가 발생하는 통합 문서 레이어의 모든 상호 작용입니다).

이 경우 일부 셀을 복사 한 다음 오른쪽 열이나 행을 클릭하는 것이 좋습니다. 삽입 옵션이 완전히 제거되었음을 알 수 있습니다 - "복사 된 셀 삽입"옵션 만 있습니다. 이는 워크 시트가 CutCopyMode 인 한 계속 유지됩니다. 그것이 나오면 삽입 옵션이 반환됩니다.내 생각 엔 당신의 코드가 금지 된 행동이나 때 귀하의 코드가하려고하는 범위에 삽입 할 때 복사 한 셀 삽입을 시도

  • 가 아니라 (삽입 셀 복사보다는) 삽입을 시도하거나

    • 입니다 몇 가지 빈 삽입 할 준비가.

    그래도이 두 가지 방법을 모두 디 컴파일해야 할 수도 있습니다. 다행히 당신이 솔루션을 제안했습니다.

  • 관련 문제