Điều kiện Compile (32bit và 64bit)

Euler

Administrator
Thành viên BQT
Chương trình để thực thi thì máy tính phải compile cái code mà các bạn gõ thành mã máy tính hiểu được.
Tuy nhiên điều kiện compile có khác biệt. Ở bài viết này, mình muốn giới thiệu với các bạn điều đó.
Chúng ta có cú pháp như sau để định nghĩa cái gì cần compile và cái gì không cần compile.
#If...Then...#Else ...
Đoạn này thường khai báo ở đầu một Module bất kỳ trong file excel có chứa macro. Và ta thường thấy những người sử dụng các hàm API (hàm trong thư viện windown chứ không phải hàm vốn có của VBA) thường phải khai báo cái này. Bởi vì nếu không khai báo, khi đem ra các máy tính có cấu hình khác nhau, sẽ có máy tính không hiểu được code của người đó đang làm gì, dù ở trên máy tính người ấy thì chạy tốt.

#If...Then...#Else ...Có thể sử dụng bên trong hay bên ngoài thủ tục bất kỳ. Tuy nhiên như trên đã nói, người code thường sử dụng nó ở ngay trên đầu Module bất kỳ, tức là bên ngoài thủ tục.
Khi chúng ta cần khai báo Decrare, hay định nghĩa hằng số cho Module, hay định nghĩa một tham số,... chúng sẽ có tá dụng trên toàn bộ chương trình bất kể là nằm trong hay ngoài thủ tục.
Tùy thuộc vào 32bit hay 64bit mà xử lý logic có khả năng bị biến đổi.

Mục đích cho việc sử dụng cấu trúc #If...Then...#Else ... như đã nói, thường được sử dụng để khai báo các hàm API nhưng chúng bị phân biệt đối với Excel32bit và Excel64bit.
Cụ thể là:
Excel 32bit: Excel 2007 trở về trước thì là Excel 32 bit.
Excel 2010 trở lại đây thì có cả hai, bao gồm Excel 32bit và Excel 64bit. (Thật là rắc rối các bạn nhỉ).

Ví dụ với 32bit thì ta phải khai báo như thế này:
Mã:
 Declare Function GetActiveWindow Lib "user32" () As Long
Với 64bit thì phải khai báo như thế này:
Mã:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Các bạn có nhìn thấy chữ PtrSafe không? Đấy, nhiều khi mình copy code trên internet về nhưng trên máy tính mình nó báo đỏ lòe và không chạy được, và mình phải tự thêm PtrSafe vào trước chữ Function. Sẽ chuyên nghiệp hơn, nếu người code mà code cho cả hai tình huống, cả 32bit và 64bit, như thế thì người dùng khỏi phải sửa bằng tay như mình, phải không các bạn?

Cái anh 64bit, anh ấy có thêm kiểu biến là LongPtr. Kiểu LongPtr thì lại tùy vào từng phiên bản Office mà chúng có cách hiểu khác nhau. Anh 32bit thì anh ấy hiểu là Long. Còn anh 64bit thì anh ấy hiểu là LongLong.
Kiểu LongLong là chỉ dùng được cho 64bit các bạn nhé. Nên khi khai báo biến mà không biết cái này, code đưa cho anh máy tính 32bit là anh ấy không hiểu gì đâu.

Ptrsafe là thông báo cho Declare của anh 64bit biết là thực thi cái này là an toàn, không có vấn đề gì đâu. (Hôm nào mình sẽ tìm hiểu về Declare và sẽ có bài viết sau, tạm thời các bạn hiểu đến đây nhé.)

Tóm lại là, người code sẽ phải can thiệp cả hai tình huống để cho anh 32bit và 64bit đều dùng được. Như vậy khai báo cần thiết là:
#If Vba7 Then
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
#Else
Declare Function GetActiveWindow Lib "user32" () As Long
#End If
Và khi compile thì vẫn bị báo đỏ như thế này:
Bạn cần đăng nhập để thấy đính kèm

Không sao cả, không có vấn đề gì hết, nó đang hoạt động đúng. Nếu nó báo đỏ nốt ở phần Else thì mới là vấn đề, tức là trong cả hai trường hợp thì máy tính đều không hiểu.
Code trên có nghĩa là, nếu là 64bit thì Compile dòng lệnh này:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Nếu là 32bit thì Compile dòng lệnh này:
Declare Function GetActiveWindow Lib "user32" () As Long
Tôi thấy một số người code viết thế này:
#If VBA7 And Win64 Then
Thật ra là VBA7 thì đang dùng 64bit. Cho nên viết như vậy thật ra là không cần thiết.
Hằng sốThuyết minh
Vba6Môi trường là Visual Basic for Applications Version 6.0 , nếu tương thích là True, ngoài ra là False
Vba7Môi trường là Visual Basic for Applications Version 7.0 , nếu tương thích là True, ngoài ra là False
Win16Môi trường là16 bit , nếu tương thích là True, ngoài ra là False
Win32Môi trường là 32bit, , nếu tương thích là True, ngoài ra là False
Win64Môi trường là 64 bit, , nếu tương thích là True, ngoài ra là False
MacMôi trường là Macintosh thì là True ngoài ra là False
Đối với mình, thì mình chỉ quan tâm 64bit và 32bit là đủ dùng rồi. Thậm chí nếu code cho đồng nghiệp thì chỉ quan tâm 64bit thôi, vì toàn bộ đồng nghiệp đều sử dụng cấu hình máy cũng như các phiên bản office tương tự nhau, điều này vô cùng thuận lợi cho người code.
Còn trên môi trường internet thì mình phải can thiệp thêm 32bit, các bạn dùng Mac hay cái gì khác, thì tự các bạn phải thay đổi code của người ta nếu muốn dùng ^_^
Bài viết được lược dịch từ:
 
Top