John tự hỏi liệu có cách nào trong VBA để xác định ô cuối cùng đã được người dùng thay đổi hay không. Anh ấy không muốn biết liệu ô có bị thay đổi bởi macro hay không, mà cụ thể là bởi một người dùng.

Câu trả lời là có – đại loại. Bạn có thể sử dụng sự kiện Worksheet_Change để viết một trình xử lý sẽ ghi lại khi bất kỳ ô cụ thể nào trong trang tính bị thay đổi. Một macro thực hiện điều này có thể khá đơn giản, chẳng hạn như macro:

Private Sub Worksheet_Change(ByVal Target As Range)

Application.StatusBar = Target.Address End Sub

Macro chỉ cần đặt địa chỉ của thay đổi cuối cùng vào thanh trạng thái. Bạn có thể sửa đổi macro để nó duy trì địa chỉ trong một biến toàn cục (được khai báo bên ngoài trình xử lý sự kiện) theo cách này:

Dim sAddr As String

Private Sub Worksheet_Change(ByVal Target As Range)

sAddr = Target.Address(False, False)

End Sub

Sau đó, bạn có thể sử dụng macro thông thường để truy xuất địa chỉ được lưu trữ trong biến sAddr và làm bất cứ điều gì bạn muốn với nó.

Để đảm bảo rằng trình xử lý sự kiện không ghi lại bất kỳ thay đổi nào được thực hiện bởi macro, cách duy nhất để làm điều này là tắt xử lý sự kiện trước khi thực hiện bất kỳ lệnh macro nào sẽ sửa đổi trang tính. Ví dụ: thay đổi thuộc tính EnableEvents sau đây có thể được sử dụng trước và sau một lệnh thay đổi nội dung của ô A1:

Application.EnableEvents = False Range("A1") = "Hello"

Application.EnableEvents = True

Khi tắt xử lý sự kiện, trình xử lý sự kiện Worksheet_Change sẽ không được kích hoạt và địa chỉ “thay đổi lần cuối” sẽ không được cập nhật. Kết quả là bạn chỉ theo dõi những thay đổi được thực hiện bởi người dùng, không phải những thay đổi được thực hiện bởi macro.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (3819) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: