Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

phatnq2002

Tích cực giảm cân...
Hội viên mới
Hôm nay mình wa phần tiếp theo về cái vụ này nhé.
:sifone:

CÁC SỰ KIỆN VÀ THỦ TỤC SỰ KIỆN THÔNG DỤNG ĐỐI VỚI CÁC CONTROL TRÊN FORM


Với một số sự kiện cùng tên với form như BeforeUpdate, AfterUpdate thì cũng tương tự, tuy nhiên có một số sự kiện đặc trưng cho các control mà khi các bạn điều khiển nó, các bạn sẽ làm được nhiều điều.

1. Các sự kiện phím:
Thông thường thì mỗi control sẽ tiếp nhận 3 trạng thái phím khi nó được focus. KeyDown, KeyUp và KeyPress.
KeyDown xảy ra khi người dùng nhấn một phím trong khi control đang focus. Nó cũng xảy ra khi bạn dùng hành động SendKeys (trong macro) hay lệnh SendKeys trong code.
KeyPress cũng vậy, nhưng có một chút khác biệt: nó xảy ra khi nhấn và nhả phím trong khi control đang focus. Và trong khi với KeyDown, bạn có thể kiểm tra được là nếu người dùng nhấn tổ hợp phím thì phím kết hợp sẽ là gì: CTRL, ALT, SHIFT một cách riêng biệt. Trong khi KeyPress thì không.
KeyUp là sự kiện xảy ra khi người dùng nhả phím ra. Nó giống như KeyDown, nghĩa là có thể kiểm tra được là nếu người dùng nhấn tổ hợp phím thì phím kết hợp sẽ là gì: CTRL, ALT, SHIFT một cách riêng biệt.
Tùy theo tình hình cụ thể, các bạn có thể điều khiển sự kiện phím thích hợp.

Với sự kiện KeyDown, bạn có thuộc tính sự kiện OnKeyDown.
Thủ tục sự kiện tương ứng là control_KeyDown. Thủ tục này có 2 tham số:
KeyCode: tiếp nhận mã phím mà người sử dụng nhấn (không tính các phím kết hợp). Bạn có thể dùng các hằng định sẵn để xác định phím mà người dùng nhấn (vbKeyA - phím A, vbkeyReturn - phím Enter, ...). Các bạn chịu khó mở cửa sổ Object Browser (lúc đang ở cửa sổ VB Editor) xem lib VBA, mục KeyCode constants để biết nhiều hơn.
Nếu bạn ngăn không tiếp nhận sự kiện nhấn phím, bạn gán tham số này bằng 0.
Shift: xác định xem phím kết hợp nào được nhấn cùng.
Nhấn SHIFT: acShiftMask
Nhấn CTRL: acCtrlMask
Nhấn ALT: acAltMask

Một ví dụ để điều khiển sự kiện KeyDown:
VD: Kiểm tra xem, có nhấn phím CTRL xuống không, nếu không thì thoát thủ tục. Nếu có thì coi có nhấn phím F3 không. Nếu có thì cho hiển thị một cái form gì đó.

Private Sub mahocsinh_KeyCode(KeyCode As Integer, Shift As Integer)
If (Shift And acCtrlMask) > 0 Then
If KeyCode = vbKeyF3 Then
DoCmd.OpenForm "frmLylichHocsinh", acNormal
End If
End If
End Sub


VD2: Còn đây là ví dụ để bắt sự kiện KeyPress nghen. Thông thường thì nếu bạn dùng Format cho text box với ký tự > thì nội dung trong text box hiển thị dạng chữ hoa hết sau khi bạn rời focus khỏi text box, nhưng thực tế thì nội dung trong textbox vẫnlà chữ thường. bây giờ bạn muốn đổi sang Hoa thật sự thì bạn sẽ nhờ đến KeyPress. Chú ý: bạn cẩn thận khi dùng font Unicode.

Private Sub hoten_KeyPress(KeyAscii As Integer)
Dim strCharacter As String
strCharacter = Chr(KeyAscii)
KeyAscii = Asc(UCase(strCharacter))
End Sub
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

2. Sự kiện Not In List:
Sự kiện này dành riêng cho control Combo Box. Sự kiện xảy ra khi người sử dụng nhập vào ô text của combo box với nội dung không khớp với dữ liệu có sẵn trong danh sách nguồn của combo box và thuộc tính Limit to List của combo box được định là Yes.

Các bạn có thể điều khiển sự kiện này để thông báo cho người sử dụng nội dung mà người đó nhập vào không đúng với quy định hay thậm chí bạn có thể cho "tự động" hay "bán tự động" add thêm dữ liệu vào bảng dữ liệu nguồn (Row Source) của combo box.

Thuộc tính sự kiện có tên là OnNotInList.
Thủ tục sự kiện có tên là comboboxname_NotInList. Thủ tục có hai tham số:
NewData: tham số lưu trữ giá trị của nội dung được nhập mới mà không khớp với danh sách hiện có của combo box.
Response: tham số chỉ định cách thức "hồi đáp" lại sự kiện này.
Có 3 "vé":
Response = acDataErrDisplay (cái này mặc định): Khi xảy ra sự kiện, Access sẽ mở ra hộp thông báo của chính nó. (Cái này thường ít ai muốn, vì nó chơi tiếng tây trong khi chương trình lại toàn là tiếng ta !!!).
Response = acDataErrContinue: Nếu định như thế này thì Access sẽ không cho hiện hộp thông báo của nó nữa. Bạn có thể chêm vào thông báo của mình.
Response = acDataErrAdded: Bạn có thể thêm vào danh sách hiện có của combo box nội dung không khớp đó như là dữ liệu thêm mới. Access sẽ chấp nhận nó và cho qua, không thông báo lỗi.

VD1: Thông báo lỗi khi dữ liệu nhập vào không khớp
Private Sub combo_NotInList(NewData As String, Response As Integer)
Response = acDataErrContinue
MsgBox "Xin vui long chon trong danh sach hien co.", vbExclamation, "Thong Bao"
End Sub


VD2: Thêm vào danh sách của combo box trong trường hợp Row Source Type của combo box là Value List.
Private Sub dvt_NotInList(NewData As String, Response As Integer)
Response = acDataErrAdded
dvt.RowSource = dvt.RowSource & ";" & NewData
End Sub


VD3: Giả sử bạn có table tblDVT chứa các đơn vị tính, và chỉ có một field là dvt (thể có nhiều hơn, nhưng field dvt là field chính). Trong một form, bạn tạo một combo box có Row Source là tblDVT. Bây giờ khi người sử dụng nhập thêm một đơn vị tính mới, lập tức nó sẽ được add ngay vào table. Cái vụ này sướng à.
Private Sub dvt_NotInList(NewData As String, Response As Integer)
Response = acDataErrAdded
CurrentDB.Execute "INSERT INTO tblDVT(dvt) VALUES('" & NewData & "')"
End Sub


Thế đấy !!! Các bạn có thể chế biến, gia giảm thêm cho nó ngon hơn. :biggrin:
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Khi lập trình trên Access, tôi thường chơi cùng với mấy cái sự kiện ở trên để làm.

Tất nhiên không phải có những sự kiện này, mà còn nhiều sự kiện khác nữa. Nếu chơi Access 2007 thì còn bao la. Hay nói gần hơn, nếu bạn dùng Access project để lập trình và connect đến một external database (thường là SQL Server) thì còn gặp phải nhiều sự kiện khác nữa.

Nhưng thôi, từ từ cháo nó cũng nhừ. Khi nào các bạn đã có thể sử dụng thoải mái mấy cái này rồi thì lúc đó tôi sẽ "xuất" thêm vài chiêu nữa. Nhưng mà nếu các bạn đã thoải mái rồi thì các bạn sẽ có đà tiến lên tự ngâm cứu. Lúc đó chắc không cần đến tôi đâu nhỉ? :sifone:

...TẠM THỜI "KẾT" Ở ĐÂY....
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Bạn có bài nào viết về Excel không, ở đây bạn đang viết ở Access

TC.
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Bạn có bài nào viết về Excel không, ở đây bạn đang viết ở Access

TC.


Bạn cần biết gì về Excel? Lập trình hay sử dụng thông thường?
Mà người ta thường nói, biết nhiều thứ wá không có "prồ". :smilielol5:

Nói vậy thôi, nếu trong phạm vi hiểu biết của tôi thì tôi sẵn lòng.
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Bạn cần biết gì về Excel? Lập trình hay sử dụng thông thường?
Mà người ta thường nói, biết nhiều thứ wá không có "prồ". :smilielol5:
Nói vậy thôi, nếu trong phạm vi hiểu biết của tôi thì tôi sẵn lòng.

Bạn có bộ sưu tầm các code ứng dụng trong excel không?.
Ví dụ: Code xoá dòng trống, code lấy dữ liệu từ file đóng, .....
Nếu có bạn cho mình xin nhen.

Thân
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Bạn có bộ sưu tầm các code ứng dụng trong excel không?.
Ví dụ: Code xoá dòng trống, code lấy dữ liệu từ file đóng, .....
Nếu có bạn cho mình xin nhen.

Thân

1. Để xóa một dòng trống:
Không hiểu xóa của bạn là delete cả dòng hay clear dữ liệu của dòng. Vậy nên, tôi chơi luôn hai trường hợp:
Delete nguyên dòng (hoặc nhiều dòng cũng vậy):
Rows("sothutudongdau:sothutudongcuoi").Select
Selection.Delete Shift:=xlUp ' Xóa xong đôn các dòng dưới lên
Clear nguyên dòng (hoặc nhiều dòng cũng vậy):
Rows("sothutudongdau:sothutudongcuoi").Select
Selection.Clear
2. Lấy dữ liệu từ file đóng:
Thực sự thì bạn phải mở file đó ra, rồi làm gì đó, xong đóng lại, chứ workbook nó không có thuộc tính Visible. Bạn có thể mở nó ra với thuộc tính chỉ đọc. Khi mở nó ra xong, bạn cho nó ra sau workbook hiện hành liền thì người ta không thấy.
Dim wb As New Workbook
Set wb = Workbooks.Open("tên file", , True)
ThisWorkbook.Activate

Mẹo: Bạn có thể "học tập" cách chế macro của chính Excel bằng cách bạn sử dụng Tools - Macro - Record New Macro để thực hiện một hành động nào đó. Excel sẽ ghi ra thành một macro đặt trong một module của workbook. Bạn có thể tham khảo chúng và đưa vào cho code của mình. Tôi cũng làm vậy mà. :-O16:
 
Ðề: Sự kiện (event) và các thủ tục sự kiện (event procedure) - Phần 3

Cảm ơn anh Phat, đọc những bài viết của anh trên diễn đàn em thấy anh rất am hiểu về tin học, nhất là những nội dung về lập trình. Em mới tham gia diễn đàn, chưa bao giờ sử dụng Access cả, vì em chỉ áp dụng EXCEL trong công việc của mình. Những kiến thức về excel cũng còn hạn chế lắm, nhất ứng dụng các công thức và lviết code trong VBA để ứng dụng. Vì vậy em cũng mong anh tiếp tục viết những bài về những nội dung anh đã viết, hơn nữa cũng mong anh viết những bài hướng dẫn về VBA bắt đầu từ trình độ i tờ cho công đồng trên diễn đàn này. Em tin rằng có nhiều người trên diễn đàn cũng có mong muốn như em.

Chúc anh luôn mạnh khoẻ và có những bài viết hay để hướng dẫn mọi người áp dụng tin học trong công tác kế toán và những công việc khác.

Chân thành cảm ơn anh
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top