Câu hỏi tự động thực thi macro Excel trên một thay đổi ô


Làm thế nào tôi có thể tự động thực thi một macro Excel mỗi khi một giá trị trong một ô cụ thể thay đổi?

Ngay bây giờ, mã làm việc của tôi là:

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

Ở đâu "H5" là ô cụ thể được theo dõi và Macro là tên của macro.

Có cách nào tốt hơn?


76
2018-01-03 17:33


gốc


Liệu RunMacroWhenValueChanges UDF trong FormulaDesk có thỏa mãn các yêu cầu của bạn không? formuladesk.com - Gareth Hayter
Có thể trùng lặp excel VBA chạy macro tự động bất cứ khi nào một ô được thay đổi - cemper93


Các câu trả lời:


Mã của bạn trông khá tốt.

Hãy cẩn thận, tuy nhiên, để bạn gọi đến Range("H5") là một lệnh phím tắt để Application.Range("H5"), tương đương với Application.ActiveSheet.Range("H5"). Điều này có thể tốt, nếu những thay đổi duy nhất là thay đổi người dùng - đó là điển hình nhất - nhưng có thể thay đổi giá trị ô của bảng tính khi nó không phải là trang tính hoạt động qua các thay đổi có lập trình, ví dụ: VBA.

Với ý nghĩ này, tôi sẽ sử dụng 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

Hoặc bạn có thể sử dụng Me.Range("H5"), nếu trình xử lý sự kiện nằm trên trang mã cho trang tính được đề cập (thường là):

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

Hi vọng điêu nay co ich...


98
2018-01-06 01:59



nếu ô H5 được thay đổi từ một trang tính khác, nói sheet2  thì hàm trên không hoạt động. plz giúp đỡ trong việc này. - dhpratik
Đối với bất kỳ ai đến đây từ tìm kiếm trên google, hãy đảm bảo bạn dán mã này vào trang tính trong vba, không phải mô-đun như tôi đã làm. nhìn vào stackoverflow.com/questions/15337008/… - hammythepig
Application.ActiveSheet.Range ("H5"). ==> target.parent.range ("H5") thậm chí còn an toàn hơn - Pierre
@WillEdiger Bất cứ khi nào bạn không chỉ định rõ ràng tham chiếu trang tính, Excel giả định ActiveSheet và bất cứ khi nào bạn không xác định rõ ràng đó là Excel bạn đang làm việc, Excel giả định Application. - Scott Marcus
Lưu ý rằng, trong mô-đun mã trang tính (là nơi Worksheet_Change sự kiện phải được đặt), không đủ tiêu chuẩn Range làm không phải mặc định là ActiveSheet nhưng thay vào đó, đề cập đến trang tính chứa mã. Do đó, mã trong câu trả lời này có hiệu quả giống như mã trong câu hỏi. (Lưu ý: Trở lại năm 2009 khi câu trả lời này được viết, nó có thể đã khác, nhưng tôi chắc chắn nó không phải.) - YowE3K


Xử lý Worksheet_Change sự kiện hoặc Workbook_SheetChange biến cố.

Trình xử lý sự kiện lấy một đối số "Target As Range", vì vậy bạn có thể kiểm tra xem phạm vi thay đổi có bao gồm ô mà bạn quan tâm hay không.


7
2018-01-03 17:36



Cảm ơn, nó hoạt động. Tôi kiểm tra phạm vi với, nói, Target.Address = Range("H5").Address. Có cách nào dễ hơn không? - namin
Một thay thế: Not (Intersect(Target, Range("H5")) Is Nothing) . Đây có phải là cách bạn sẽ làm điều đó? - namin
Nhận xét đầu tiên (Target.Address = Range("H5").Address) sẽ không hoạt động nếu ô của bạn chỉ phần của phạm vi đã thay đổi. Bình luận thứ hai vẫn gặp vấn đề được mô tả bởi Mike Rosenblum. - Ant


Tôi thích cách này, không sử dụng một ô nhưng phạm vi

    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

3
2018-01-04 11:58



Nó giống như một ô. Bạn có thể đặt một phạm vi làm một ô, một dải ô liên tục hoặc thậm chí là các ô được phân tán (tất cả được phân tách bằng dấu phẩy). - Shai Alon


Tôi đã dành rất nhiều thời gian để nghiên cứu điều này và học cách nó hoạt động như thế nào, sau khi thực sự làm rối tung các sự kiện gây ra. Vì có quá nhiều thông tin phân tán nên tôi quyết định chia sẻ những gì tôi đã tìm được để làm việc ở một nơi, từng bước như sau:

1) Mở VBA Editor, trong VBA Project (YourWorkBookName.xlsm) mở Microsoft Excel Object và chọn Sheet mà sự kiện thay đổi sẽ liên quan.

2) Chế độ xem mã mặc định là "Chung". Từ danh sách thả xuống ở giữa trên cùng, chọn "Bảng tính".

3) Private Sub Worksheet_SelectionChange đã có sẵn, nên để nó một mình. Sao chép / dán mã của Mike Rosenblum từ trên xuống và thay đổi tham chiếu .Range sang ô mà bạn đang xem để thay đổi (B3, trong trường hợp của tôi). Không đặt Macro của bạn, tuy nhiên (tôi đã xóa từ "Macro" sau "Then"):

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

hoặc từ danh sách thả xuống ở trên cùng bên trái, chọn "Thay đổi" và trong khoảng cách giữa Chi tiết phụ và Kết thúc phụ, dán If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) Trên dòng sau khi "Sau đó" tắt các sự kiện để khi bạn gọi macro của bạn, nó không kích hoạt các sự kiện và cố gắng chạy lại Worksheet_Change này trong một chu trình không bao giờ kết thúc, làm hỏng Excel và / hoặc làm hỏng mọi thứ:

Application.EnableEvents = False

5) Gọi macro của bạn

Call YourMacroName

6) Bật lại các sự kiện để thay đổi tiếp theo (và mọi / tất cả các sự kiện khác) kích hoạt:

Application.EnableEvents = True

7) Kết thúc khối If và Sub:

    End If
End Sub

Toàn bộ mã:

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

Điều này sẽ biến các sự kiện bật / tắt trong các Mô-đun tạo ra sự cố và chỉ cho phép trình kích hoạt thay đổi, tắt các sự kiện, chạy macro của bạn và bật lại các sự kiện.


2
2017-07-11 22:51





Tôi có một ô được liên kết với cơ sở dữ liệu chứng khoán trực tuyến và được cập nhật thường xuyên. Tôi muốn kích hoạt một macro bất cứ khi nào giá trị ô được cập nhật.

Tôi tin rằng điều này là tương tự như thay đổi giá trị tế bào bởi một chương trình hoặc bất kỳ cập nhật dữ liệu bên ngoài nhưng trên ví dụ bằng cách nào đó không làm việc cho tôi. Tôi nghĩ rằng vấn đề là bởi vì các sự kiện nội bộ excel không được kích hoạt, nhưng đó là đoán của tôi.

Tôi đã làm như sau,

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

0
2018-04-20 16:46



Tôi không thể làm được điều này vì lý do nào đó. Khi tôi nói với mã để chạy trong VBA nó được kéo lên một cửa sổ pop up menue và hỏi tôi nếu tôi muốn chạy vĩ mô thay vì chạy automaticaly vĩ mô? - David Van der Vieren