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


91

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

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

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

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

더 좋은 방법이 있습니까?


FormulaDesk의 RunMacroWhenValueChanges UDF가 요구 사항을 충족합니까? formuladesk.com
Gareth Hayter

답변:


107

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

그러나에 대한 호출 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

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


4
H5이 다른 시트에서 변경 sheet2 되면 위의 기능이 작동하지 않습니다. 이것에 plz 도움.
dhpratik 2013 년

2
Google 검색에서 여기로 오는 사람은이 코드를 내가 한 모듈이 아닌 vba의 시트에 붙여 넣어야합니다. 볼 stackoverflow.com/questions/15337008/...
hammythepig

Application.ActiveSheet.Range ( "H5"). ==> target.parent.range ( "H5")가 더 안전합니다
Pierre

1
@WillEdiger 시트 참조를 명시 적으로 지정하지 않을 때마다 Excel은을 가정하고 ActiveSheet작업중인 Excel을 명시 적으로 지정하지 않을 때마다 Excel은 Application.
Scott Marcus

1
(A 어디에있는 워크 시트 코드 모듈에, 그 주 Worksheet_Change에는 적정는, 이벤트가 있어야합니다) Range않습니다 하지 기본값 ActiveSheet대신 코드가 포함 된 시트를 말합니다. 따라서이 답변의 코드는 질문의 코드와 사실상 동일합니다. (참고 : 돌아 가기 2009 년이 대답은 그것이 기록 된 때 달라졌을,하지만 난 그게 아니 었 꽤 확신합니다.)
YowE3K

7

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

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


감사합니다. 나는 범위를 예를 들어 Target.Address = Range("H5").Address. 더 쉬운 방법이 있습니까?
namin

대안 : Not (Intersect(Target, Range("H5")) Is Nothing) . 이렇게 하시겠습니까?
namin

2
첫 번째 주석 ( Target.Address = Range("H5").Address)은 셀이 변경된 범위의 일부일 경우 작동하지 않습니다 . 두 번째 의견은 여전히 ​​Mike Rosenblum이 설명한 문제를 안고 있습니다.
Ant

5

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

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

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


3

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

    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

하나의 세포와 같습니다. 범위를 하나의 셀, 연속 셀 범위 또는 분산 된 셀 (모두 쉼표로 구분)로 설정할 수 있습니다.
Shai Alon 2015

0

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

나는 이것이 프로그램이나 외부 데이터 업데이트에 의한 셀 값 변경과 유사하다고 생각하지만 위의 예제는 어떻게 든 저에게 작동하지 않습니다. 문제는 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

1
어떤 이유로이 작업을 수행 할 수 없습니다. VBA에서 코드를 실행하도록 지시하면 팝업 메뉴가 표시되고 매크로를 자동으로 실행하는 대신 매크로를 실행할 것인지 묻습니다.
데이비드 반 데르 Vieren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.