Sự kiện trong VBA

  • Thread starter thanhphong
  • Ngày gửi
T

thanhphong

Guest
Lời mở đầu
Topic này tôi sẽ giới thiệu phương pháp sử dụng sự kiện bằng macro VBA Excel.
Sự kiện nghĩa là một đoạn code sẽ được thực thi khi một thao tác nào đó xảy ra làm biến đổi cái gì đó.

Sự kiện là gì
Chẳng hạn khi bạn click vào một nút bấm, đó là sự kiện.
Khi bạn mở một file excel, đó là một sự kiện.
Khi bạn nhập dữ liệu lên một sheet, đó cũng là sự kiện.
Ứng với mỗi sự kiện đó, chúng ta sẽ viết code để nó thực thi một công việc nào đó.

Nhận biết sự kiện
Trong VBE (nơi viết code VBA), từ Project, các bạn click đúp lên sheet mà các bạn muốn viết sự kiện, hoặc click vào ThisWorkbook.
Bạn cần đăng nhập để thấy đính kèm


Ở cửa sổ bên trái (General) bạn click chọn Worksheet .
Bạn cần đăng nhập để thấy đính kèm

Ở cửa sổ bên phải (Declarations ) là nơi chúng ta lựa chọn sự kiện.
Bạn cần đăng nhập để thấy đính kèm

Một thủ tục sẽ được tạo ra. Đây là thủ tục sẽ thực thi khi sự kiện này phát sinh. Chúng ta sẽ viết code vào bên trong thủ tục này.
Bạn cần đăng nhập để thấy đính kèm

Trong thủ tục chứa đối số (ở ví dụ trên các bạn thấy đối số là Target ).
Khi một cái gì đó thay đổi thì đối số này sẽ chứa thông tin ứng với sự thay đổi đó.
Mã:
'Target cua su kien Change la Cells bi thay doi thong tin
Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Font.Color = RGB(255, 0, 0) ' Gia tri cua cell thay doi, cells se duoc to mau do
End Sub
Nếu chúng ta dùng ActiveX Control, thì việc tạo sự kiện cho nó cũng tươgn tự như với sheet ở trên.
Bạn cần đăng nhập để thấy đính kèm

Còn nữa. Đề nghị các bạn không comment vào topic này cho tới khi có thông báo đã dịch xong.
Tham khảo và dịch từ :
 
B

bvtvba

Guest
Sự kiện với sheet :
Tên sự kiệnÝ nghĩa
ActivateKhi sheet được active (sẵn sàng cho trạng thái nhập dữ liệu)
BeforeDeleteTrước khi sheet được xóa
BeforeDoubleClickKhi click đúp vào cells, ngay trước khi thao tác click đúp được tiến hành
BeforeRightClickKhi click chuột phải vào cells, ngay trước khi thao tác click chuột phải được tiến hành
CalculateSau khi được tính toán lại trên sheet (cells tham chiếu được thay đổi)
ChangeKhi cells thay đổi (chẳng hạn như khi nhập giá trị)
DeactivateKhi sheet không còn ở trạng thái kích hoạt
FollowHyperlinkKhi click vào đường link có trên sheet
LensGalleryRenderCompleteKhi các biểu tượng thư viện dòng dẫn đầu (động và tĩnh) được hiển thị (THVBA: Tôi chưa hiểu mục này)
PivotTableAfterValueChangeSau khi một ô hoặc dải ô trong bảng tổng hợp đã được chỉnh sửa hoặc tính toán lại
PivotTableBeforeAllocateChangesTrước khi các thay đổi được áp dụng cho bảng tổng hợp
PivotTableBeforeCommitChangesTrước khi các thay đổi đối với nguồn dữ liệu OLAP của bảng tổng hợp được áp dụng
PivotTableBeforeDiscardChangesTrước khi các thay đổi đối với bảng tổng hợp bị hủy
PivotTableChangeSyncSau khi bảng tổng hợp đã thay đổi
PivotTableUpdateKhi bảng tổng hợp được cập nhật
SelectionChangeKhi lựa chọn ô thay đổi
TableUpdateSau khi bảng truy vấn được kết nối với mô hình dữ liệu được cập nhật trong trang tính
 
Ở bài trên các bạn đã được giới thiệu các sự kiện của Worksheet.
Sau đây tôi sẽ giới thiệu các sự kiện của Workbook.
Tên sự kiệnÝ nghĩa
ActivateWorkbook được kích hoạt
AddinInstallPhát sinh sau khi Addin được cài đặt
AddinUninstallPhát sinh sau khi Addin được hủy bỏ
AfterSavePhát sinh sau khi workbook được save
AfterXmlExportPhát sinh sau khi lưu dữ liệu XML vào workbook của Microsoft Office Excel. Hoặc sau khi xuất dữ liệu (Export).
AfterXmlImportSau khi dữ liệu XML được làm mới, hoặc khi nạp dữ liệu XML vào workbook.
BeforeCloseTrước khi đóng workbook. Hoặc khi workbook có sự thay đổi và người dùng lưu sự thay đổi này thì sự kiện sẽ phát sinh ngay trước khi điều này xảy ra.
BeforePrintSự kiện phát sinh trước khi thực hiện lệnh in.
BeforeSaveSự kiện phát sinh ngay trước khi workbook được lưu.
BeforeXmlExportPhát sinh trước khi lưu dữ liệu XML vào workbook của Microsoft Office Excel. Hoặc sau khi xuất dữ liệu (Export).
BeforeXmlImportTrước khi dữ liệu XML được làm mới, hoặc khi nạp dữ liệu XML vào workbook.
DeactivateWorkbook hủy kích hoạt
ModelChangeXảy ra sau khi mô hình dữ liệu Excel đã thay đổi.
NewChartPhát sinh khi có đồ thị biểu đồ mới được tạo ra trên workbook.
NewSheetPhát sinh khi có sheet mới được tạo ra.
OpenKhi workbook được mở ra.
PivotTableCloseConnectionBáo cáo PivotTable xảy ra sau khi bạn đóng kết nối với nguồn dữ liệu đó.
PivotTableOpenConnectionBáo cáo PivotTable xảy ra sau khi thiết lập kết nối với nguồn dữ liệu đó.
RowsetCompleteSự kiện xảy ra khi người dùng gọi hành động tập hợp hàng trên bảng tổng hợp OLAP hoặc xem tập hợp bản ghi chi tiết.
SheetActivateXảy ra khi trang tính hoạt động.
SheetBeforeDeleteXảy ra trước khi trang tính bị xóa.
SheetBeforeDoubleClickXảy ra khi một trang tính được nhấp đúp, trước khi quá trình nhấp đúp mặc định diễn ra.
SheetBeforeRightClickXảy ra khi một trang tính được nhấp chuột phải, trước khi quá trình nhấp chuột phải mặc định diễn ra.
SheetCalculateXảy ra sau khi trang tính đã được tính toán lại hoặc sau khi dữ liệu sửa đổi đã được vẽ trên biểu đồ.
SheetChangeXảy ra khi một ô trang tính được sửa đổi bởi người dùng hoặc một liên kết bên ngoài.
SheetDeactivateXảy ra khi trang tính không hoạt động.
SheetFollowHyperlinkXảy ra khi người dùng click vào đường link liên kết trên workbook.
SheetLensGalleryRenderCompleteXảy ra sau khi các biểu tượng thư viện dòng dẫn đầu trang tính (động và tĩnh) đã được hiển thị.
SheetPivotTableAfterValueChangeXảy ra sau khi một ô hoặc dải ô trong bảng tổng hợp đã được chỉnh sửa hoặc tính toán lại.
SheetPivotTableBeforeAllocateChangesXảy ra trước khi các thay đổi được áp dụng cho PivotTable.
SheetPivotTableBeforeCommitChangesXảy ra trước khi các thay đổi đối với nguồn dữ liệu PivotTable OLAP được áp dụng.
SheetPivotTableBeforeDiscardChangesXảy ra trước khi các thay đổi đối với PivotTable bị loại bỏ.
SheetPivotTableChangeSyncXảy ra sau khi bảng tổng hợp đã thay đổi.
SheetPivotTableUpdateXảy ra sau khi trang báo cáo PivotTable đã được cập nhật.
SheetSelectionChangeXảy ra khi vùng chọn thay đổi trong trang tính. Nó không xảy ra khi vùng chọn ở dạng biểu đồ.
SheetTableUpdateXảy ra sau khi bảng chỗ ngồi đã được cập nhật.
SyncXảy ra khi bản sao cục bộ của trang tính có trong không gian làm việc tài liệu được đồng bộ hóa với bản sao trên máy chủ.
WindowActivateXảy ra khi cửa sổ sổ làm việc hoạt động.
WindowDeactivateXảy ra khi cửa sổ sổ làm việc không hoạt động.
WindowResizeXảy ra khi cửa sổ làm việc của workbook được thay đổi kích thước.
 
Vô hiệu hóa sự kiện
Để vô hiệu hóa sự kiện ta sử dụng Application.EnableEvents = False
Mã:
Application.EnableEvents = False

'Tại đây không phát sinh sự kiện

Application.EnableEvents = True
Sau khi xử lý xong, ta kích hoạt lại bắt sự kiện bằng lệnh Application.EnableEvents = True
Làm phát sinh sự kiện
Bạn không thể tạo ra các sự kiện liên quan tới sheet hay nút bấm (button). Những sự kiện này phát sinh tự động bởi thao tác Excel hay bằng VBA.
Khi bạn muốn tạo ra một sự kiện, hãy tạo ra một hàm để thực hiện xử lý đó, và gọi hàm đó ra.
Mã:
Sub Main_thucthi()
    Call SelectionChangeCore(Range("A1")) 'Gọi hàm xử lý sự kiện
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call SelectionChangeCore(Target) 'Gọi hàm xử lý sự kiện
End Sub

Private Sub SelectionChangeCore(ByVal Target As Range)
    ' Xử lý sự kiện ở đây
End Sub
Nếu là sự kiện được tạo bởi class ta đều có thể kích hoạt nó.
 

Davicnguyen

Yêu THVBA
Vô hiệu hóa sự kiện
Để vô hiệu hóa sự kiện ta sử dụng Application.EnableEvents = False
Mã:
Application.EnableEvents = False

'Tại đây không phát sinh sự kiện

Application.EnableEvents = True
Sau khi xử lý xong, ta kích hoạt lại bắt sự kiện bằng lệnh Application.EnableEvents = True
Làm phát sinh sự kiện
Bạn không thể tạo ra các sự kiện liên quan tới sheet hay nút bấm (button). Những sự kiện này phát sinh tự động bởi thao tác Excel hay bằng VBA.
Khi bạn muốn tạo ra một sự kiện, hãy tạo ra một hàm để thực hiện xử lý đó, và gọi hàm đó ra.
Mã:
Sub Main_thucthi()
    Call SelectionChangeCore(Range("A1")) 'Gọi hàm xử lý sự kiện
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call SelectionChangeCore(Target) 'Gọi hàm xử lý sự kiện
End Sub

Private Sub SelectionChangeCore(ByVal Target As Range)
    ' Xử lý sự kiện ở đây
End Sub
Nếu là sự kiện được tạo bởi class ta đều có thể kích hoạt nó.

E có ô A1 có dữ liệu là 20 và ô A2 có công thức lấy dữ liệu từ ô A1 khi e sửa dữ liệu ô A1 thì ô A1 được tô màu còn ô A2 thì không. Vậy làm thế nào để tô màu cả ô có công thức lấy dữ liệu từ ô đó ạ
 

Thvba84

Yêu THVBA
E có ô A1 có dữ liệu là 20 và ô A2 có công thức lấy dữ liệu từ ô A1 khi e sửa dữ liệu ô A1 thì ô A1 được tô màu còn ô A2 thì không. Vậy làm thế nào để tô màu cả ô có công thức lấy dữ liệu từ ô đó ạ
Code để tìm công thức liên quan đến cell, nếu có liên kết thì bôi màu, không thì thôi.
 
Top