2016-07-10 2 views
1

VBA에 비교적 익숙하지 않습니다. 그리고 워크 시트에서 작업 할 때 열 행의 조건을 기반으로 행을 자동으로 숨기거나 숨김 해제하는 코드를 만들었습니다 (0 숨김/1 숨김). 이 비교적 쉬운 매크로는 다른 시트를 추가 할 때까지 잘 작동했습니다. 이 시트에는 매크로가 없기 때문에 관련이 없다고 생각합니다. 하지만 지금은 매번 END IF 함수에서 런타임 오류가 발생하며이를 해결하는 방법을 알지 못합니다. 아마도 간단한 해결책이있을 수 있지만 찾을 수는 없습니다.VBA - 런타임 오류 END IF

Private Sub Worksheet_Calculate() 
    Application.ScreenUpdating = False 
    Dim LastRow As Long, c As Range 
    Application.EnableEvents = False 
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row 
     On Error Resume Next 
     For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107") 
     If c.Value = 1 Then 
      c.EntireRow.Hidden = True 
     ElseIf c.Value = 0 Then 
      c.EntireRow.Hidden = False 
    End If 
    Next 
    On Error GoTo 0 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
    End Sub 
+0

아닌 오류의 원인하지만 당신은 포함 할 수있는 모든'... 그렇지 ... 끝 If'는'c.EntireRow.Hidden = CBool ​​(c.Value)로' – Jeeped

+1

은 오류가없는 경우 '런타임 오류'보다 * 더 많은 것을 말하시겠습니까? – usr2564301

+0

'On Error Resume Next'를 제거하거나 주석 처리하고 상위 오브젝트 워크 시트 참조를 범위 오브젝트에 적용합니다. 워크 시트에 다른 워크 시트의 변경으로 인해 계산 이벤트가 트리거되는 일시적인 수식이있을 수 있습니다. – Jeeped

답변

1

제거하거나 더 완전한 디버깅 정보를 원하는 경우 On Error Resume Next을 주석 : 여기

는 코드입니다. Worksheet_Calculate처럼 자주 실행되는 이벤트 매크로에서는 필요하지 않습니다.

범위 개체에 부모 워크 시트 참조를 적용하십시오. 워크 시트에 다른 워크 시트의 변경으로 인해 계산 이벤트가 트리거되는 일시적인 수식이있을 수 있습니다.

부모 워크 시트에 ActiveSheet property이있는 경우에만 코드가 실행되도록 넓은 조건을 추가했습니다. 워크 시트에는 다른 워크 시트 (또는 다른 통합 문서)의 변경으로 인해 계산 이벤트가 트리거되는 휘발성 ¹ 수식이있을 수 있습니다.

LastRow 할당 후에 아무런 문제가 없으므로 (문제이므로) 삭제했습니다.

Range.Hidden 속성을 한 줄로 단순화했습니다.

Private Sub Worksheet_Calculate() 
    If Me.Name = Activesheet.Name Then 
     Application.ScreenUpdating = False 
     Application.EnableEvents = False 
     Dim c As Range 
     For Each c In Me.Range("BA34:BA56,BA73:BA74,BA76:BA107") 
      c.EntireRow.Hidden = CBool(c.Value2) 
     Next c 
     Application.EnableEvents = True 
     Application.ScreenUpdating = True 
    End If 
End Sub 

휘발성 기능, 전체 통합 문서가 변경 될 때마다 아무것도 계산 ¹ 아니라 때 그 결과의 변화에 ​​영향을 미치는 뭔가. 휘발성의 기능은 INDIRECT, OFFSET, TODAY, NOW, RANDRANDBETWEEN의 기능입니다. CELLINFO 워크 시트 함수의 일부 하위 함수는이를 변동 가능하게 만듭니다.

+0

답변 해 주셔서 감사합니다. 실제로 초기 오류는 런타임 오류 뿐이므로 매크로가 작동하는 데 오랜 시간이 걸렸습니다. Sheet는 단지 "Sheet1"입니다. 그것을 당신의 제안과 바꾸면 런타임 오류 "1004"가 발생합니다. 귀하의 도움과 신속한 대응에 진심으로 감사드립니다. – AlmarM

+0

실을 끝내기 만하면됩니다. 난 당신이 쓴 코드의 조합을 기반으로 그것을 해결, 0은뿐만 아니라 숨기기 해제하는 방아쇠가되어야합니다. 오류 줄이 문제를 일으킨 것 같습니다. – AlmarM

+0

'CBool ​​(0)'이'False'로 해석되므로 실제로이 문제를 이해하지 못합니다.거의 모든 프로그래밍 언어에서 '거짓'은 0과 부울의 용어로 동일하지만 거짓이 아닌 것은 사실입니다. 예 : #define False 0 : #define True가 False가 아닙니다. – Jeeped

0

스레드를 완료하기 만하면됩니다. 난 당신이 쓴 코드의 조합을 기반으로 그것을 해결, 0은뿐만 아니라 숨기기 해제하는 방아쇠가되어야합니다. 오류 줄이 문제를 일으킨 것 같습니다.

Private Sub Worksheet_Calculate() 
    Application.ScreenUpdating = False 
    Dim LastRow As Long, c As Range 
    Application.EnableEvents = False 
    LastRow = Cells(Cells.Rows.Count, "BA").End(xlUp).Row 
    On Error Resume Next 
    For Each c In Range("BA34:BA56,BA73:BA74,BA76:BA107") 
     If c.Value = 1 Then 
      c.EntireRow.Hidden = True 
     ElseIf c.Value = 0 Then 
      c.EntireRow.Hidden = False 
     End If 
    Next 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
    End Sub 
아마