tranthanhan1962 > 16-11-19, 11:22 AM
#If VBA7 Then
Code VBA 64 bit
#Else
Code VBA 32 bit
#End If
tracanhtam > 16-11-19, 11:40 AM
(16-11-19, 11:22 AM)tranthanhan1962 Đã viết: Nhiều anh em đang gặp rắt rối trong vấn đề viết ứng dụng access xử dụng cho cả 32 và 64 bit. Access 32 và 64 bit có một số điểm không tương thích nên khi chạy sẽ bị lỗi nếu khác phiên bản. Thông thường là sẽ gặp lỗi ở code VBA.
Bản 32 bit
Function
Sub
...
Bản 64 bit
PtrSafe Function
PtrSafe Sub
...
Vì vậy nhiều bạn sẽ phải xử lý 2 CSDL để chạy cho 2 phiên bản access tùy theo cài đặt. Đoạn code sau đây sẽ hỗ trợ mã VBA chay cho cả 2 phiên bản 32 và 64 mà không phải tách riêng.
Trên phiên bản 32 bit, đoạn code 64 bit chuyển thành màu đỏ báo lỗi và ngược lại. Nhưng không hề gì và sẽ chạy bình thưởng đúng theo code của phiên bảnMã PHP:#If VBA7 Then
Code VBA 64 bit
#Else
Code VBA 32 bit
#End If
tranthanhan1962 > 16-11-19, 12:26 PM
(16-11-19, 11:40 AM)tracanhtam Đã viết: Nhờ bạn hướng dẫn rõ hơn dùm, xin cám ơnHì hì vầy là quá rõ rồi còn gì. Code là của các bạn tùy theo trường hợp mà.
Option Compare Database
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult
Dim BStrMsg, BStrTitle
'Hàm StrConv Chuyen chuoi ve ma Unicode'
BStrMsg = StrConv(PromptUni, vbUnicode)
BStrTitle = StrConv(TitleUni, vbUnicode)
Option Compare Database
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long
Private Declare PtrSafe Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult
Dim BStrMsg, BStrTitle
'Hàm StrConv Chuyen chuoi ve ma Unicode'
BStrMsg = StrConv(PromptUni, vbUnicode)
BStrTitle = StrConv(TitleUni, vbUnicode)
Option Compare Database
#If VBA7 Then '64 bit
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long
Private Declare PtrSafe Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#Else '32 bit
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function MessageBoxW Lib "user32" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
#End If
Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult
Dim BStrMsg, BStrTitle
'Hàm StrConv Chuyen chuoi ve ma Unicode'
BStrMsg = StrConv(PromptUni, vbUnicode)
BStrTitle = StrConv(TitleUni, vbUnicode)
ongke0711 > 17-11-19, 09:01 AM
(16-11-19, 11:40 AM)tracanhtam Đã viết: Nhờ bạn hướng dẫn rõ hơn dùm, xin cám ơn
Trích dẫn:Kết Luận: Câu thần chú chung khi sử dụng câu lệnh Khai báo trong VBA
Hầu như không cần phải thay đổi mã VBA khi sử dụng ở 64 bit hoặc 32 bit, trừ khi bạn sử dụng câu lệnh Khai báo để gọi API Windows bằng loại dữ liệu 32 bit như long, cho con trỏ và núm điều khiển. Trong hầu hết trường hợp, việc thêm PtrSafe vào Khai báo và thay thế long bằng LongPtr sẽ giúp cho câu lệnh Khai báo tương thích với cả 32 lẫn 64 bit. Tuy nhiên, cách này có thể không khả thi trong một số trường hợp hiếm gặp, khi không có API 64 bit nào để Khai báo. Để biết thêm thông tin về những thay đổi về VBA cần được thực hiện để giúp VBA chạy trên Office 64 bit, xem mục Tổng quan về Visual Basic for Applications 64 bit.
#If VBA7 Then
Public Declare PtrSafe Function LoadCursor Lib "user32" Alias "LoadCursorA" (ByVal hInstance As LongPtr, ByVal lpCursorName As String) As LongPtr
#End If
#If VBA7 Then
Public Declare PtrSafe Function GetProcessWorkingSetSize Lib "kernel32" Alias "GetProcessWorkingSetSize" (ByVal hProcess As LongPtr, lpMinimumWorkingSetSize As LongPtr, lpMaximumWorkingSetSize As LongPtr) As Long
#Else
#End If
Minh Tiên > 17-11-19, 07:32 PM
(17-11-19, 09:01 AM)ongke0711 Đã viết: ...Ví dụ trên là As Long hay As LongPtr vậy bạn ?
Mã PHP:#If VBA7 Then
[code]Public Declare PtrSafe Function GetProcessWorkingSetSize Lib "kernel32" Alias "GetProcessWorkingSetSize" (ByVal hProcess As LongPtr, lpMinimumWorkingSetSize As LongPtr, lpMaximumWorkingSetSize As LongPtr) As Long[/code]
#Else
#End If
Public Declare PtrSafe Function GetProcessWorkingSetSize Lib "kernel32" Alias "GetProcessWorkingSetSize" (ByVal hProcess As LongPtr, lpMinimumWorkingSetSize As LongPtr, lpMaximumWorkingSetSize As LongPtr) As LongPtr
Public Declare PtrSafe Function GetProcessWorkingSetSize Lib "kernel32" Alias "GetProcessWorkingSetSize" (ByVal hProcess As LongPtr, lpMinimumWorkingSetSize As LongPtr, lpMaximumWorkingSetSize As LongPtr) As Long
Public Declare PtrSafe Function GetProcessWorkingSetSize Lib "kernel32" Alias "GetProcessWorkingSetSize" (ByVal hProcess As Long, lpMinimumWorkingSetSize As Long, lpMaximumWorkingSetSize As Long) As LongPtr
ongke0711 > 17-11-19, 07:46 PM