ฉันใช้เวลาค้นคว้าเรื่องนี้นานมากและเรียนรู้วิธีการทำงานทั้งหมดหลังจากที่ทำให้เหตุการณ์เกิดความสับสน เนื่องจากมีข้อมูลกระจัดกระจายมากมายฉันจึงตัดสินใจแบ่งปันสิ่งที่ฉันพบว่าใช้งานได้ทั้งหมดในที่เดียวทีละขั้นตอนดังนี้:
1) เปิด VBA Editor ภายใต้โครงการ VBA (YourWorkBookName.xlsm) เปิดวัตถุ Microsoft Excel และเลือกแผ่นงานที่จะเกี่ยวข้องกับเหตุการณ์การเปลี่ยนแปลง
2) มุมมองโค้ดเริ่มต้นคือ "ทั่วไป" จากรายการแบบเลื่อนลงตรงกลางด้านบนเลือก "แผ่นงาน"
3) Private Sub Worksheet_SelectionChange มีอยู่แล้วตามที่ควรจะเป็นปล่อยไว้คนเดียว คัดลอก / วางรหัสของ Mike Rosenblum จากด้านบนและเปลี่ยนการอ้างอิง. ช่วงไปยังเซลล์ที่คุณกำลังเฝ้าดูการเปลี่ยนแปลง (B3 ในกรณีของฉัน) อย่าวางมาโครของคุณอย่างไรก็ตาม (ฉันลบคำว่า "มาโคร" หลัง "จากนั้น"):
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) ในบรรทัดหลังจาก "จากนั้น" ปิดเหตุการณ์เพื่อที่เมื่อคุณเรียกใช้มาโครของคุณจะไม่ทำให้เกิดเหตุการณ์และพยายามเรียกใช้ 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
สิ่งนี้จะเปิด / ปิดเหตุการณ์ออกจากโมดูลซึ่งสร้างปัญหาและเพียงแค่ให้ทริกเกอร์การเปลี่ยนแปลงปิดเหตุการณ์เรียกใช้แมโครของคุณและเปิดเหตุการณ์อีกครั้ง