2016-06-06 3 views
0

아무도 도와 줄 수 있습니까? (나는 VBA에 새로 왔고이 매크로를 만드는 데 도움을 받았습니다.)VBA 오류 13 : 형식 불일치

파일에 대한 매크로를 만들었고 처음에는 잘 작동했지만 오늘은 파일과 매크로를 수백 번 열고 다시 시작했습니다. 나는 항상 다음과 같은 오류가 발생합니다 : Excel VBA 런타임 오류 '13'유형 불일치

매크로에서 아무 것도 변경하지 않았고 오류가 발생하는 이유를 모르겠습니다. 또한 매크로를 실행할 때마다 매크로를 업데이트하는 데 오랜 시간이 걸립니다 (매크로는 약 700 행을 실행해야 함).

오류는 ** ** 사이에 있습니다.

VBA :

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim i As Integer 
Dim j As Integer 
Dim z(8) As Integer 

Set ws = ThisWorkbook.ActiveSheet 

For i = 6 To ws.Cells.SpecialCells(xlCellTypeLastCell).Row - 3 
    If Not ws.Rows(i).Hidden = True Then 
     For j = 0 To 8 
      If Not ws.Cells(i, j + 5) = "" Then 
       ** z(j) = z(j) + ws.Cells(i, j + 5) ** 
      End If 
     Next j 
    End If 
Next i 

Application.EnableEvents = False 
For j = 0 To 8 
    ws.Cells(ws.Cells.SpecialCells(xlCellTypeLastCell).Row - 2, j + 5) = z(j) 
Next j 
Application.EnableEvents = True 
End Sub 

답변

2

ws.Cells(i, j + 5)의 특정 포인트는 z(j)에 추가 할 수있는 값을 포함하지 않습니다. 아마도 비어 있거나 숫자가 없습니다.

한 수정

On Error Resume Next 'switch off error handling 
z(j) = z(j) + ws.Cells(i, j + 5) 
On Error Goto 0 'the idiomatic way of switching the default error handling back on 

효과적으로 다음, 매크로가 z(j)에 숫자가 아닌 값을 추가하려고 시도하지 않습니다 작성하는 것입니다.

그러나이 방법으로 문제를 해결하는 것은 마치 망치를 깨는 데 쓰레기를 사용하는 것과 비슷합니다. 아마도 오류를 일으키는 셀의 내용을 조사하고이를보다 우아하게 프로그래밍하는 것이 좋습니다.

나는 또한 이것이 왜 VBA에 있어야하는지에 대해 질문합니다. 실제로 당신은 정상적인 계산에서 Excel이 할 수있는 일을하고 있습니다. (SUMIFSUMIFS) VBA 변경 이벤트에 응답하는 대신 VBA를 사용하면 더 빠를 것입니다.

+1

VBA 맞춤 수식을 유지하기가 더 쉽습니다. –

+1

매크로가있는 통합 문서는 유지 관리하기가 어렵습니다. – Bathsheba

+0

아니요, 수식은 드래곤 포커에 대한 규칙보다 약간 덜 복잡합니다. 중첩 된 if 공식, 7 개의 진술보다 간단한 사용자 정의 수식을 유지하는 것이 훨씬 쉽습니다. –

1

@ Bathsheba에 언급 된 것 이외에도 문제를 피하기 위해 변수를 사용하기 전에 변수 선언을 고려하는 것이 좋습니다. Excel에서 Z()을 처리하는 방법을 모르고 UDF로 생각 했으므로 코드를 실행할 수 없었습니다. 다음을 시도해보고 문제가 해결되면 알려주세요.

Option Base 0 
Option Explicit 

Sub tmpTest() 

Dim ws As Worksheet 
Dim i As Long, j As Integer 
Dim z(0 To 8) As Double 

Set ws = ThisWorkbook.ActiveSheet 

For i = 6 To ws.Cells.SpecialCells(xlCellTypeLastCell).Row - 3 
    If Not ws.Rows(i).Hidden = True Then 
     For j = 0 To 8 
      If Not ws.Cells(i, j + 5) = "" Then 
       z(j) = z(j) + IIf(VarType(ws.Cells(i, j + 5).Value) = vbError, 0, ws.Cells(i, j + 5).Value) 
      End If 
     Next j 
    End If 
Next i 

Application.EnableEvents = False 
For j = 0 To 8 
    ws.Cells(ws.Cells.SpecialCells(xlCellTypeLastCell).Row - 2, j + 5) = z(j) 
Next j 
Application.EnableEvents = True 

End Sub