V
vothanhthu
Guest
Ý tưởng về một bài API đến với Thứ xuất phát từ bài hỏi đáp của bạn Sieutocviet3, link
Lưu ý: Trong bài viết sẽ là tập hợp kiến thức của Thứ về API, do Thứ không phải là dân IT nên có thể sẽ có một số thuật ngữ IT Thứ diễn giải theo cách hiểu đơn giản nhất của một người bình thường như Thứ hiểu được, nếu có gì sai sót mong cách bạn chuyên sâu IT đọc góp ý giúp Thứ hoàn thiện hơn.
Đây sẽ là một chủ đề rất dài, nên Thứ sẽ phân nhỏ ra nhiều nội dung để mọi người có thể nắm kiến thức một cách chắn chắn nhất.
1. API là gì ?
Trước đó, Admin Tuhocvba đã có trình bày khái quát về Window API các bạn có thể tham khảo
Ở đây, Thứ muốn sơ lược lại một vài điều
Khái niệm: API là viết tắt của Application Programming Interface (giao diện lập trình ứng dụng). Nó là 1 giao tiếp phần mềm được dùng bởi các ứng dụng khác nhau.
Mọi hoạt động của Excel nói riêng và các ứng dụng khác nói chung điều phải hoạt động dựa vào cấu trúc của Hệ điều hành mà nó đang sử dụng. Thứ ví dụ, các bạn có 1 file excel và điều có sử dụng chung một câu lệnh
Nhưng các bạn thử chạy nó trên nền Win 10 và Win 8. sẽ có 2 giao diện hoàn toàn khác nhau.
Rõ ràng, bản thân Excel không tự tạo ra các giao diện Msgbox này mà sử dụng các tài nguyên có sẵn trong Window để tạo. Vì vậy, nếu chúng ta sử dụng một hàm, chương trình tương tác vào quá trình Gởi-Nhận giữa Excel và Window này, chúng ta hoàn toàn có thể tạo ra những thay đổi về giao diện Msgbox, và tương tự là với UserForm. Các hàm API sẽ giúp chúng ta tương tác vào quá trình Gởi-Nhận đó.
Về ứng dụng thì API là một cơ số đồ sộ các hàm trong các thư viện DLL trên nền Window. Để tìm hiểu về các thư viện thông dụng của các hàm API trong Window, các bạn có thể tham khảo bài viết của Admin vbano1
2. Khai báo một hàm API trong VBA
Để khai báo một hàm API,
Private Declare [PtrSafe] Function Tên_Hàm Lib "Tên_DLL" [Alias "Tên_Hàm_Thực_Sự"] (Danh_Sách_Hàm) As Kiểu_Trả_Về
[PtrSafe]: Tùy bạn đang sử dụng Office nào, thêm vào nếu bạn đang sử dụng Office 64bit.
Tên_Hàm: Tên của hàm API, là tên mà bạn sẽ gọi mỗi khi muốn sử dụng, thường sẽ là tên gốc của hàm API bỏ chữ A hoặc W phía sau nếu bạn có sử dụng thêm cấu trúc Alias
*Thế chữ A và W cuối tên hàm gốc là gì?: Trong API, hầu hết các hàm có nhận tham số kiểu String điều có 2 phiên bản: có xử lý Unicode và không xử lý Unicode. Nếu cả 2 phiên bản cùng nằm trong 1 thư viện DLL, thì để phân biệt, Microsoft thêm chữ A cho phiên bản không xử lý Unicode và W cho phiên bản có xử lý Unicode. Ví dụ cơ bản là DefWindowProcA và DefWindowProcW.
Tên_DLL: Tên của thư viện chứa tên hàm API bạn muốn gọi.
Tên_Hàm_Thực_Sự: phần nằm trong ngoặc [] chứng minh có thể có hoặc không. Nếu không có, phần Tên_Hàm bắt buộc bạn phải đặt giống tên hàm API trong Tên_DLL
Danh_Sách_Hàm: Danh sách các đối số mà hàm API yêu cầu, mỗi hàm API sẽ có các đối số riêng. Nói cho dễ hiểu, giống như hàm Vlookup là phải bắt buộc cấu trúc Vlookup(Giá trị dò, vùng dò, cột dò) vậy, nếu không là lỗi.
Kiểu_Trả_Về: là kiểu giá trị mà hàm API đó trả về
Thứ xin phép lấy lại ví dụ của Admin Tuhocvba về hàm API MessageBeep để tạo tiếng âm thanh thông báo trong Window trên VBA.
Nếu file của chúng ta là chia sẽ cho nhiều người sử dụng, bạn đâu thể biết được người dùng đang ở Office mấy?. Do đó, ta cần thêm điều kiện #If - #Else - #End if, nên nhớ là có dấu # phía trước nhé. Bình thường, hàm các bạn dùng được đặt cả trong Sub/Function nên không có gì xảy ra. Còn ở đây, bạn đang đặt điều kiện bên ngoài Sub/Function nên cần dấu # phía trước nhé.
Ở đây, con số 20 chắc chắn các bạn sẽ không hiểu nó là gì. Vậy nếu Thứ sửa Code lại như thế này thì sao.
Khi viết như vậy, các bạn sẽ hiểu con số 20 này đại diện cho một hàm mang tên MB_ICONQUESTION (Âm thanh khi thông báo đang ở dạng câu hỏi). Giống như khi chúng ta đặt giá trị cho một biến số, Microsoft cũng vậy. Mỗi một hàm, họ đặt một danh sách nhiều biến số, mỗi biến số có một giá trị. Khi muốn sử dụng, ta cần biết giá trị của biến đó là gì thì mới có thể sử dụng được. Như trong ví dụ, nếu bạn muốn sử dụng thông báo dạng MB_ICONQUESTION thì bạn phải sử dụng số 20.
Thế câu hỏi, làm sao để Thứ biết MB_ICONQUESTION là số 20?. Thứ cứ google tên hàm MessageBeep, rồi tra thôi, Hehe !
Mấy con số 0x000000 gì đó, tạm thời chúng ta đừng quan tâm tới. Chưa liên quan đến vấn đề của mình, kệ nó, quan tâm mấy con số cuối thôi Hehe !
Tới đây, chắc các bạn đã hình dung sơ sơ về API rồi nhỉ. Từ từ, Thứ sẽ đưa những thứ phức tạp thành đơn giản nhất cho các bạn ai cũng có thể hiểu được.
(Còn nữa...)
Bạn cần đăng nhập để thấy link
Trong bài viết, các bạn có hỏi Thứ về hàm DefWindowProcW, Thứ không trả lời bạn cụ thể là bởi vì đây là một hàm API, mà đã là hàm API thì sẽ có rất nhiều điều chúng ta cần phải nắm trước khi trả lời câu hỏi hàm API này dùng làm gì. Nhằm giúp cho tất cả các bạn tìm hiểu về VBA hiểu được hệ thống hàm API rốt cuộc là gì, tại sao nó lại hay và can thiệp được vào đến tận Window. Đó cũng là mục đích mà Thứ lập Topic này.Lưu ý: Trong bài viết sẽ là tập hợp kiến thức của Thứ về API, do Thứ không phải là dân IT nên có thể sẽ có một số thuật ngữ IT Thứ diễn giải theo cách hiểu đơn giản nhất của một người bình thường như Thứ hiểu được, nếu có gì sai sót mong cách bạn chuyên sâu IT đọc góp ý giúp Thứ hoàn thiện hơn.
Đây sẽ là một chủ đề rất dài, nên Thứ sẽ phân nhỏ ra nhiều nội dung để mọi người có thể nắm kiến thức một cách chắn chắn nhất.
1. API là gì ?
Trước đó, Admin Tuhocvba đã có trình bày khái quát về Window API các bạn có thể tham khảo
Bạn cần đăng nhập để thấy link
Ở đây, Thứ muốn sơ lược lại một vài điều
Khái niệm: API là viết tắt của Application Programming Interface (giao diện lập trình ứng dụng). Nó là 1 giao tiếp phần mềm được dùng bởi các ứng dụng khác nhau.
Mọi hoạt động của Excel nói riêng và các ứng dụng khác nói chung điều phải hoạt động dựa vào cấu trúc của Hệ điều hành mà nó đang sử dụng. Thứ ví dụ, các bạn có 1 file excel và điều có sử dụng chung một câu lệnh
Mã:
Msgbox "Hello TuhocVBA", vbInformation, "Thong bao"
Bạn cần đăng nhập để thấy đính kèm
Rõ ràng, bản thân Excel không tự tạo ra các giao diện Msgbox này mà sử dụng các tài nguyên có sẵn trong Window để tạo. Vì vậy, nếu chúng ta sử dụng một hàm, chương trình tương tác vào quá trình Gởi-Nhận giữa Excel và Window này, chúng ta hoàn toàn có thể tạo ra những thay đổi về giao diện Msgbox, và tương tự là với UserForm. Các hàm API sẽ giúp chúng ta tương tác vào quá trình Gởi-Nhận đó.
Về ứng dụng thì API là một cơ số đồ sộ các hàm trong các thư viện DLL trên nền Window. Để tìm hiểu về các thư viện thông dụng của các hàm API trong Window, các bạn có thể tham khảo bài viết của Admin vbano1
Bạn cần đăng nhập để thấy link
Và tài liệu chính chủ của Microsoft
Bạn cần đăng nhập để thấy link
2. Khai báo một hàm API trong VBA
Để khai báo một hàm API,
Bạn cần đăng nhập để thấy link
Admin Tuhocvba cũng đã có trình bày, và Thứ sẽ sơ lược lại. Đây là cấu trúc khai báo một hàm API thông dụng trong VBAPrivate Declare [PtrSafe] Function Tên_Hàm Lib "Tên_DLL" [Alias "Tên_Hàm_Thực_Sự"] (Danh_Sách_Hàm) As Kiểu_Trả_Về
[PtrSafe]: Tùy bạn đang sử dụng Office nào, thêm vào nếu bạn đang sử dụng Office 64bit.
Tên_Hàm: Tên của hàm API, là tên mà bạn sẽ gọi mỗi khi muốn sử dụng, thường sẽ là tên gốc của hàm API bỏ chữ A hoặc W phía sau nếu bạn có sử dụng thêm cấu trúc Alias
*Thế chữ A và W cuối tên hàm gốc là gì?: Trong API, hầu hết các hàm có nhận tham số kiểu String điều có 2 phiên bản: có xử lý Unicode và không xử lý Unicode. Nếu cả 2 phiên bản cùng nằm trong 1 thư viện DLL, thì để phân biệt, Microsoft thêm chữ A cho phiên bản không xử lý Unicode và W cho phiên bản có xử lý Unicode. Ví dụ cơ bản là DefWindowProcA và DefWindowProcW.
Tên_DLL: Tên của thư viện chứa tên hàm API bạn muốn gọi.
Tên_Hàm_Thực_Sự: phần nằm trong ngoặc [] chứng minh có thể có hoặc không. Nếu không có, phần Tên_Hàm bắt buộc bạn phải đặt giống tên hàm API trong Tên_DLL
Danh_Sách_Hàm: Danh sách các đối số mà hàm API yêu cầu, mỗi hàm API sẽ có các đối số riêng. Nói cho dễ hiểu, giống như hàm Vlookup là phải bắt buộc cấu trúc Vlookup(Giá trị dò, vùng dò, cột dò) vậy, nếu không là lỗi.
Kiểu_Trả_Về: là kiểu giá trị mà hàm API đó trả về
Thứ xin phép lấy lại ví dụ của Admin Tuhocvba về hàm API MessageBeep để tạo tiếng âm thanh thông báo trong Window trên VBA.
Mã:
#If Win64 then 'Nếu là Office 64bit thì
Private Declare PtrSafe Function MessageBeep Lib "user32" (ByVal sType As Integer) As Integer
#Else 'Ngược lại (ý hiểu là Office 32bit)
Private Declare Function MessageBeep Lib "user32" (ByVal sType As Integer) As Integer
#End if
Sub Sound_Test()
MessageBeep (20) 'Gọi hàm MessageBeep với định dạng âm thanh số 20
End Sub
Ở đây, con số 20 chắc chắn các bạn sẽ không hiểu nó là gì. Vậy nếu Thứ sửa Code lại như thế này thì sao.
Mã:
Const MB_ICONQUESTION As Long = 20
Sub Sound_Test()
MessageBeep (MB_ICONQUESTION)
End Sub
Thế câu hỏi, làm sao để Thứ biết MB_ICONQUESTION là số 20?. Thứ cứ google tên hàm MessageBeep, rồi tra thôi, Hehe !
Value | Meaning |
---|---|
0xFFFFFFFF | A simple beep. If the sound card is not available, the sound is generated using the speaker. |
MB_ICONASTERISK 0x00000040L | See MB_ICONINFORMATION. |
MB_ICONEXCLAMATION 0x00000030L | See MB_ICONWARNING. |
MB_ICONERROR 0x00000010L | The sound specified as the Windows Critical Stop sound. |
MB_ICONHAND 0x00000010L | See MB_ICONERROR. |
MB_ICONINFORMATION 0x00000040L | The sound specified as the Windows Asterisk sound. |
MB_ICONQUESTION 0x00000020L | The sound specified as the Windows Question sound. |
MB_ICONSTOP 0x00000010L | See MB_ICONERROR. |
MB_ICONWARNING 0x00000030L | The sound specified as the Windows Exclamation sound. |
MB_OK 0x00000000L | The sound specified as the Windows Default Beep sound. |
Mấy con số 0x000000 gì đó, tạm thời chúng ta đừng quan tâm tới. Chưa liên quan đến vấn đề của mình, kệ nó, quan tâm mấy con số cuối thôi Hehe !
(Còn nữa...)
Sửa lần cuối bởi điều hành viên: