Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Làm sao chạy được code cả trong access 32 bit và access 64 bit
#1
Có chút việc nhờ các PRO:
Tôi có module dưới đây, đang chạy trong access 32bit. Nay muốn chạy được cả trong 32bit và 64bit thì phải làm thế nào.
Cám ơn nhiều


Mã:
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
Public Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult

'BStrMsg, BStrTitle : La chuoi Unicode
    Dim BStrMsg, BStrTitle
    'Hàm StrConv Chuyen chuoi ve ma Unicode
    BStrMsg = StrConv(PromptUni, vbUnicode)
    BStrTitle = StrConv(TitleUni, vbUnicode)
    
    MsgBoxUni = MessageBoxW(GetActiveWindow, BStrMsg, BStrTitle, Buttons)
End Function
Chữ ký của haquocquan Guest, you are welcome!
ღღღღღTài sản của haquocquan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#2
(12-09-17, 05:18 PM)haquocquan Đã viết: Có chút việc nhờ các PRO:
Tôi có module dưới đây, đang chạy trong access 32bit. Nay muốn chạy được cả trong 32bit và 64bit thì phải làm thế nào.
Cám ơn nhiều


Mã:
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
Public Function MsgBoxUni(ByVal PromptUni As Variant, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal TitleUni As Variant = vbNullString) As VbMsgBoxResult

'BStrMsg, BStrTitle : La chuoi Unicode
    Dim BStrMsg, BStrTitle
    'Hàm StrConv Chuyen chuoi ve ma Unicode
    BStrMsg = StrConv(PromptUni, vbUnicode)
    BStrTitle = StrConv(TitleUni, vbUnicode)
    
    MsgBoxUni = MessageBoxW(GetActiveWindow, BStrMsg, BStrTitle, Buttons)
End Function

Anh sửa lại như sau:
Mã PHP:
#If VBA7 Then
    Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
    Private 
Declare PtrSafe Function MessageBoxW Lib "user32" (ByVal hwnd As LongByVal lpText As StringByVal lpCaption As StringByVal wType As Long) As LongPtr
#Else
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Private 
Declare Function MessageBoxW Lib "user32" (ByVal hwnd As LongByVal lpText As StringByVal lpCaption As StringByVal wType As Long) As Long
#End If

Public Function MsgBoxUni(ByVal PromptUni As VariantOptional ByVal Buttons As VbMsgBoxStyle vbOKOnlyOptional ByVal TitleUni As Variant vbNullString) As VbMsgBoxResult

'BStrMsg, BStrTitle : La chuoi Unicode
    Dim BStrMsg, BStrTitle
    '
Hàm StrConv Chuyen chuoi ve ma Unicode
    BStrMsg 
StrConv(PromptUnivbUnicode)
    BStrTitle StrConv(TitleUnivbUnicode)
    
    MsgBoxUni 
MessageBoxW(GetActiveWindowBStrMsgBStrTitleButtons)
End Function 

Giải thích:
Lỗi liên quan đến dùng hàm do dùng hàm API, cụ thể là các giá trị truyền vào và đọc hiểu số bit của hệ thông không thống nhất.
Vì dụ:
+ Nếu ta viết trên Office 32 bit(Chỉ chạy trên 32bit):
Mã PHP:
Declare Function GetActiveWindow Lib "user32" () As Long 

+ Nếu ta viết trên Office 64 bit( Chạy trên 64bit nhưng vẫn sử dụng một giá trị trả về 32-bit):
Mã PHP:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long 

+ Nếu ta viết trên Office 64 bit( Chạy trên 64bit và sử dụng một giá trị trả về 64-bit):
Mã PHP:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr 


Lưu ý:
* Từ khóa PtrSafe khẳng định rằng tuyên bố Khai báo là an toàn để chạy trong các phiên bản 64-bit của Office.
* Long (Khi dùng trên 32bit)
* LongPtr(Khi dùng trên 64bit)

Từ ví dụ này ta có một cú pháp chung cho 332 và 64bit:
Cách 1: Hệ điều hành và office đều là 64bit
Mã PHP:
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

- VBA7 là Version 7 tương ứng office 2010

Cách 2: Hê điều hành và Office không cùng số bit
Mã PHP:
#if Vba7 then 
'  Code is running in the new VBA7 editor 
    #if Win64 then 
    ' 
 Code is running in 64-bit version of Microsoft Office 
    
#else 
    '  Code is running in 32-bit version of Microsoft Office 
    #end if 
#else 
Code is running in VBA version 6 or earlier 
#end if 

Chi tiết về sự thay đổi kiểu giá trị sau từ khóa As (Long(32bit) và LongPtr(64bit))thì xem Link này; https://msdn.microsoft.com/VBA/Language-...s-overview

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.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn ongke0711 , tranthanhan1962 , haquocquan , lehongduc , cpucloi , Minh Tiên , Che_Guevara


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Hướng Dẫn Tư vấn import data(đuôi csv) vào file access nguồn subasatran 4 285 01-09-17, 03:20 PM
Bài mới nhất: subasatran
  [Hỏi] VBA Access: điều khiển lệnh Excel, Access khác vodainhan 10 762 19-07-17, 12:13 PM
Bài mới nhất: vodainhan
  [Hỏi] Nối dữ liệu từ nhiều file Access?? btnnhut 12 518 17-07-17, 08:44 AM
Bài mới nhất: tranthanhan1962
  [Hỏi] Truyền dữ liệu giữa 2 file Access ?? btnnhut 3 168 03-07-17, 01:14 PM
Bài mới nhất: tranthanhan1962
  Sử dụng Class Module và Kết nối dữ liệu SQL SERVER trong Access VBA lehongduc 61 21,477 18-06-17, 08:49 AM
Bài mới nhất: lehongduc

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ