[excel] 셀 변경시 자동으로 Excel 매크로 실행

특정 셀의 값이 변경 될 때마다 Excel 매크로를 자동으로 실행하려면 어떻게해야합니까?

지금 내 작업 코드는 다음과 같습니다.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

여기서 "H5"모니터링되는 특정 셀 Macro은 매크로의 이름입니다.

더 좋은 방법이 있습니까?



답변

코드가 꽤 괜찮아 보입니다.

그러나에 대한 호출 Range("H5")은에 대한 바로 가기 명령 Application.Range("H5")이며 Application.ActiveSheet.Range("H5"). 유일한 변경 사항이 사용자 변경 (가장 일반적인 경우) 인 경우 괜찮을 수 있지만 VBA와 같은 프로그래밍 변경을 통해 활성 시트가 ​​아닌 경우 워크 시트의 셀 값이 변경 될 수 있습니다.

이를 염두에두고 다음을 활용합니다 Target.Worksheet.Range("H5").

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

또는 Me.Range("H5")이벤트 처리기가 문제가되는 워크 시트의 코드 페이지에있는 경우 를 사용할 수 있습니다 (일반적으로 있음).

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

도움이 되었기를 바랍니다…


답변

Worksheet_Change이벤트 또는 이벤트를 처리합니다 Workbook_SheetChange.

이벤트 핸들러는 “Target As Range”인수를 사용하므로 변경되는 범위에 관심있는 셀이 포함되어 있는지 확인할 수 있습니다.


답변

나는 이것을 조사하고 이벤트 트리거를 정말로 엉망으로 만든 후에 모든 것이 어떻게 작동하는지 배우는 데 많은 시간을 보냈습니다. 흩어져있는 정보가 너무 많기 때문에 다음과 같이 한 곳에서 모든 작업을 수행 한 것을 단계별로 공유하기로 결정했습니다.

1) VBA 편집기를 열고 VBA 프로젝트 (YourWorkBookName.xlsm)에서 Microsoft Excel 개체를 열고 변경 이벤트가 포함될 시트를 선택합니다.

2) 기본 코드보기는 “일반”입니다. 중간 상단의 드롭 다운 목록에서 “워크 시트”를 선택합니다.

3) Private Sub Worksheet_SelectionChange가 이미 있어야하므로 그대로 두십시오. 위에서 Mike Rosenblum의 코드를 복사 / 붙여 넣기하고 .Range 참조를 변경 사항을보고있는 셀로 변경합니다 (제 경우 B3). 그러나 아직 매크로를 배치하지 마십시오 ( “Then”뒤에 “Macro”라는 단어를 제거했습니다).

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

또는 왼쪽 상단의 드롭 다운 목록에서 “변경”을 선택하고 Private Sub와 End Sub 사이의 공간에 붙여 넣습니다. If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) “Then”다음 줄에서 이벤트를 해제하여 매크로를 호출 할 때 이벤트를 트리거하지 않고이 Worksheet_Change를 끝없는 주기로 다시 실행하여 Excel을 중단하거나 모든 것을 엉망으로 만듭니다.

Application.EnableEvents = False

5) 매크로 호출

Call YourMacroName

6) 이벤트를 다시 켜서 다음 변경 (및 기타 모든 이벤트)이 트리거되도록합니다.

Application.EnableEvents = True

7) If 블록과 Sub를 종료합니다.

    End If
End Sub

전체 코드 :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

이것은 문제를 일으키는 모듈에서 이벤트를 켜고 끄는 것을 취하고 단순히 변경을 트리거하고 이벤트를 끄고 매크로를 실행하고 이벤트를 다시 켭니다.


답변

이 방법을 선호합니다. 셀이 아닌 범위를 사용합니다.

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If


답변

온라인 재고 데이터베이스에 연결되고 자주 업데이트되는 셀이 있습니다. 셀 값이 업데이트 될 때마다 매크로를 트리거하고 싶습니다.

나는 이것이 프로그램이나 외부 데이터 업데이트에 의한 셀 값 변경과 유사하다고 생각하지만 위의 예제는 어떻게 든 저에게 작동하지 않습니다. 문제는 Excel 내부 이벤트가 트리거되지 않기 때문이라고 생각하지만 그게 내 생각입니다.

나는 다음을했다.

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub


답변