2017-09-05 7 views
3

저는 Excel-VBA 초보자이며 워크 시트의 셀 값을 변경하는 누군가에 의해 트리거되는 짧은 코드를 작성하려고합니다. 0보다 작은 경우 변경된 셀의 값을 0으로 설정해야합니다. 코드는 다음과 같습니다Worksheet_Change 이벤트의 대상 범위가 올바르지 않습니다.

Private Sub Worksheet_Change(ByVal Target As Range) 
'Debug.Print Target.Address 
If Target.Column = 6 Then 
    For Each Cell In Target.SpecialCells(xlCellTypeConstants, 3) 
    If Cell.Value < 0 Then 
     Cell.Value = 0 
    End If 
    Next 
End If 
End Sub 

지금 무슨 일 것은 내가 열 6 셀의 값을 변경할 때, 0보다 작은 숫자가 포함 된 시트의 모든 셀 가 제로로 변경 것입니다.

Worksheet_Change 이벤트 처리기에 대해 만들어진 "대상"개체에만 셀/셀이 변경되어 있으므로 내 코드가 수정되어 이벤트를 트리거 한 셀의 값만 변경한다고 생각했습니다. 처음.

Debug.Print을 사용하여 직접 개체의 주소를 출력하는 방법을 시도했습니다. 시트에있는 모든 셀의 주소를 0보다 작은 값으로 출력 했으므로 처리기가 여러 번 실행되었다고 가정합니다.

실제로 문제 자체에 대한 해결 방법을 찾았지만 내 질문은 다음과 같습니다. Worksheet_Change 이벤트를 어떻게 사용하지 못했고 앞으로 문제가 발생하지 않도록하려면 어떻게해야합니까?

+2

application.enableevents = false를 사용하거나 이벤트 프로 시저가 자체적으로 실행됩니다. – Jeeped

+0

'Target'은 변경된 셀에만 관련이 있으며 오류를 복제 할 수 없습니다. Jeeped의 개정을 시도하고 어떻게 시작하는지보십시오. – SJR

+1

나중에 다시 'Application.EnableEvents = True'로 설정하는 것을 잊지 마십시오. 다음 번에 이벤트가 실행되지 않습니다. – Tom

답변

0

편집 1 : 버그 수정과 업데이트 코드는 의견

편집 2에서 제안 : 오류가 귀하의 질문에 배열 수식 대답에서

를 처리하는 처리와 업데이트 코드

[1] 어떻게 Worksheet_Change 이벤트를 사용하지 못하고 [2] 그런 문제가 발생하지 않도록 앞으로 어떻게해야합니까? 다음과 같은 규칙이

당신은 Target 개체의 이해에 올바른 일반에 도움이되지만

  1. 기술적으로 당신은 이러한 유형의 문제에 대한
  2. 아무것도하지 않았다. SpecialCells이 작동 할 단일 셀을 좋아하지 않으므로 코드가 실패했습니다. 그것을 하나주고 그것을 전체로 확장하십시오! 그것을 다른 무엇이 줘 그것을 잘 작동합니다.

    이유 당신의 Debug.Print 표시 모든 세포마다 코드가 다른 변경 이벤트가 트리거 셀을 변경한다는 것입니다. 다행히도 두 번째 것은 0을 찾았으므로 트리거하지 않습니다. 또 하나입니다.

    • 항상 Application.EnableEvents와 통합 문서의 일부를 변경하는 이벤트 처리기 코드를 둘러싸고 다음 일반적인 규칙은 많은 문제, 그냥이 특별한 일을 방지해야한다.

    작동하도록 코드를 수정하려면 SpecialCells 메서드 호출을 제거하면됩니다. Cell.Value2 (here 참조) 대신 Cell.Value을 사용하고 있으므로 VBA 암시 적 유형은 텍스트 형식의 숫자를 실제 숫자로 변환합니다. 따라서 코드는 숫자와 텍스트 값 모두에서 작동합니다.

    코드 :

    Private Sub Worksheet_Change(ByVal Target As Range) 
        'Debug.Print Target.Address; 
        Application.EnableEvents = False 
        For Each Cell In Target '.SpecialCells(xlCellTypeConstants, 3) 
         If Cell.Column = 6 And Cell.Value < 0 Then 
         On Error GoTo Error: 
         Cell.Value = 0 
         On Error GoTo 0 
         End If 
        Next 
    GoTo ExitSub: 
    Error: 
        If Err.Number = 1004 Then ' 1004 -> "You cannot change part of an array." 
        'Application.Undo ' Uncomment to disallow array entering a negative value formula into/across column 6 
        MsgBox "A cell could not be zeroed as" & vbCr & "it is part of an array formula.", vbExclamation, "Microsoft Office Excel" 
        On Error GoTo 0 
        Else 
        On Error GoTo 0 
        Resume 
        End If 
    ExitSub: 
        Application.EnableEvents = True 
    End Sub 
    

    주 :

    - 업데이트 1 : 코드가 올바르게 다중 셀 변경 다루고있다.

    - 업데이트 2 : 코드는 이제 배열 수식 입력을 처리하기 위해 오류 1004를 트랩합니다. 열 수식에서 배열 수식을 입력하면 열 6에 음수 값이 표시되거나 항목을 모두 중지 할 수 있습니다.

+0

ctrl + enter를 사용하여 가로 범위에서 데이터를 입력 할 수 있기 때문에 target.column을 사용하지 않았습니다. –

+0

@PatrickHonorez 이해가 잘 모르겠습니다. * vertical * 범위에 데이터를 입력 할 수도 있습니다. 그러나 수식은 달라야합니다. – robinCTS

+0

'대상'은 범위 일 수 있으며 여러 열을 포함 할 수 있습니다. 따라서'If Target.Column = 6' 오류가 발생하기 쉽습니다. –

0

이 작동

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    For Each c In Target 
     If c.Column = 6 Then If IsNumeric(c) Then If c < 0 Then c = 0 
    Next c 
End Sub 

을 ( 업데이트) 그리고, 배우고 OPTION EXPLICIT을 사용하십시오!

+0

'.SpecialCells (xlCellTypeConstants, 3) '와 함께 작동시키지 못했습니다. – Tom

+0

3은 무엇입니까? [설명서] (https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-specialcells-method-excel)에서 다루지 않습니다. – Tom

+1

@Tom : 설명서 3에 따라 다릅니다. 'xlNumbers + xlTextValues'. 그게 작동했는데, 방금 시도했습니다. –