Lưu ý: Tôi đã giới thiệu mọi người đến liên kết này khá thường xuyên vì vậy tôi sẽ làm cho bài đăng này là một điểm dừng cho Worksheet_Change
. Mỗi khi bây giờ và sau đó, khi tôi nhận được thời gian, tôi sẽ thêm nội dung mới cho điều này để mọi người có thể hưởng lợi cho nó.
tôi luôn khuyên này khi sử dụng Worksheet_Change
Bạn không cần tên sheet. Điều này được hiểu rằng mã sẽ được chạy trên trang tính hiện tại UNLESS bạn đang cố gắng sử dụng trang tính khác làm tài liệu tham khảo. Có phải "testpage" tên Activesheet hoặc là một trang tính khác?
Bất cứ khi nào bạn đang làm việc với sự kiện Worksheet_Change
. Luôn chuyển đổi các sự kiện Off
nếu bạn đang ghi dữ liệu vào ô. Điều này là bắt buộc để mã không đi vào vòng lặp vô tận có thể
Bất cứ khi nào bạn tắt sự kiện, hãy sử dụng xử lý lỗi nếu bạn gặp lỗi, mã sẽ không chạy vào lần tiếp theo.
Hãy thử điều này
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
Range("A1:A8").Formula = "=B1+C1"
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
vài thứ khác mà bạn có thể muốn biết khi làm việc với sự kiện này.
Nếu bạn muốn đảm bảo rằng mã không chạy khi hơn một tế bào bị thay đổi sau đó thêm một kiểm tra nhỏ
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2003
If Target.Cells.Count > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
Các CountLarge
đã được giới thiệu trong Excel 2007 trở đi vì Target.Cells.Count
lợi nhuận một giá trị Integer
mà lỗi trong Excel 2007 bởi vì tăng hàng/cột. Target.Cells.CountLarge
trả về giá trị Long
.
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2007
If Target.Cells.CountLarge > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
Để làm việc với tất cả các tế bào đã được thay đổi sử dụng mã này
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aCell As Range
For Each aCell In Target.Cells
With aCell
'~~> Do Something
End With
Next
End Sub
Để phát hiện sự thay đổi trong một tế bào đặc biệt, sử dụng Intersect
. Ví dụ, nếu một sự thay đổi xảy ra trong tế bào A1
, sau đó mã dưới đây sẽ cháy
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "Cell A1 was changed"
'~~> Your code here
End If
End Sub
Để phát hiện sự thay đổi trong một tập hợp các phạm vi, sử dụng Intersect
một lần nữa. Ví dụ: nếu thay đổi xảy ra trong phạm vi A1:A10
, thì mã bên dưới sẽ kích hoạt
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
MsgBox "Cell in A1:A10 range was changed"
'~~> Your code here
End If
End Sub
Mã trong lớp không bị "treo" ở đó, mà đúng hơn là trong mã gọi. "Testpage" có tồn tại không? –
Có tồn tại, lỗi dường như chỉ xảy ra khi tôi chạy mã trong Worksheet_Change – derek
Phạm vi ("A1: A8") trong trang "testpage" có sạch khi bạn viết công thức không? Không có bảng tổng hợp hay bất cứ thứ gì như thế đã có? Ngoài ra, chỉ cần tò mò, tại sao bạn sẽ cần phải viết cùng một công thức trong cùng một vị trí sau mỗi thay đổi trong một bảng tính? –