Giúp lỗi Add ins chuyển đổi font chữ Excel 2013 (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

trungkien_gtvt

Thành viên mới
Tham gia
29/11/11
Bài viết
5
Được thích
1
Nghề nghiệp
Nhân viên quèn
Trước đây mình có dùng Add ins như đính kèm ở dưới để chuyển đổi Fonts chữ dùng trên Excel 2010 cài trên Win 7 32bit thì vẫn dùng bình thường ko có vấn đề gì cả. Hiện mình đang dùng Excel 2013 cài trên Win 7 64 bit lại có lỗi như hình dưới.
Bạn nào có cách nào khắc phục thì chỉ cho mình với. Cảm ơn nhiều! --=0
PS: nếu post sai box xin Mod chuyển box hộ với nhé!
Untitled888b3.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Trước đây mình có dùng Add ins như đính kèm ở dưới để chuyển đổi Fonts chữ dùng trên Excel 2010 cài trên Win 7 32bit thì vẫn dùng bình thường ko có vấn đề gì cả. Hiện mình đang dùng Excel 2013 cài trên Win 7 64 bit lại có lỗi như hình dưới.
Bạn nào có cách nào khắc phục thì chỉ cho mình với. Cảm ơn nhiều! --=0
PS: nếu post sai box xin Mod chuyển box hộ với nhé!

Bởi vì bên trong module "P01Font" có dùng hàm API (cụ thể làm Function MessageBox). Mà đã dùng đến API thì đương nhiên phải có động tác "này nọ" code mới chạy được trên hệ thống 64bit
Nếu bạn rành VBA, có thể tự mình sửa lấy, còn không thì liên hệ tác giả vậy!
 
Bởi vì bên trong module "P01Font" có dùng hàm API (cụ thể làm Function MessageBox). Mà đã dùng đến API thì đương nhiên phải có động tác "này nọ" code mới chạy được trên hệ thống 64bit
Nếu bạn rành VBA, có thể tự mình sửa lấy, còn không thì liên hệ tác giả vậy!
mình mù tịt, cũng chẳng biết tác giả là ai vì add ins này mình dùng cách đây mấy năm rồi chứ ko phải bây h mới dùng! :(
 
Tác giả đã bó tay, vấn đề này hình như rất nhiều người mắc phải và chưa có ai giải quyết dc! :(
Mấy File đó gần 10 năm rồi còn gì ....đồ cổ rồi ..bỏ đi viết cái khác mới phù hợp với sự phát triển của công nghệ mà xài.....--=0
 
Tác giả đã bó tay, vấn đề này hình như rất nhiều người mắc phải và chưa có ai giải quyết dc! :(

Cách sửa đơn giản nhất, khỏi suy nghĩ là: Liệng luôn Function MessageBox, dùng MsgBox thông thường (có điều sẽ không hiển thị được tiếng Việt có dấu)
Liên quan đến MsgBox tiếng Việt, có hàng đống giải pháp đơn giản mà không cần động đến API (sẽ không lo vụ tương thích với hệ thống 64)
 
có dùng API thì đem qua máy 64 bit không chạy là đúng rồi đâu cần ngạc nhiên , chạy đc mới phải ngạc nhiên . mà mở lên thấy có password rồi sao sửa
 
có dùng API thì đem qua máy 64 bit không chạy là đúng rồi đâu cần ngạc nhiên , chạy đc mới phải ngạc nhiên

Hàm API vẫn chạy được trên hệ thống 64bit chứ. Code lỗi là do tác giả đã không viết tổng quát cho cả 2 trường hợp 32 và 64
Cái chuyện sửa để code tổng quát hơn cũng không khó, chỉ vài cái #IF gì gì đó là được. Vấn đề là ta tôn trọng tác giả, ai làm người nấy tự sửa...
 
Hàm API vẫn chạy được trên hệ thống 64bit chứ. Code lỗi là do tác giả đã không viết tổng quát cho cả 2 trường hợp 32 và 64
Cái chuyện sửa để code tổng quát hơn cũng không khó, chỉ vài cái #IF gì gì đó là được. Vấn đề là ta tôn trọng tác giả, ai làm người nấy tự sửa...

thầy nói vậy em chưa hiểu . IF chạy bên trong thân hàm chứ làm sao chạy khi khai báo hàm được vậy thầy ?

Mã:
Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" _
       Alias "SetWindowsHookExA" _
      (ByVal idHook As Long, _
       ByVal lpfn As Long, _
       ByVal hmod As Long, _
       ByVal dwThreadId As Long) As Long

khai báo từ khóa PtrSafe là bắt buộc đối với máy hệ 64 bit , hệ 32 bit vẫn chấp nhận từ khóa này nhưng phải Office 2010,
Office 2007 không được , tổng quát làm sao ?

tham số thứ 2 thường là gọi Address của 1 callback nào đó thí dụ
Mã:
AddressOf keylogProc

Address của hệ 32 bit trả về kiểu Long , 64 bit trả về kiểu LongLong hoặc LongPtr , cũng như trên , office 32 bit 2007 không chấp nhận từ khóa LongLong hoặc LongPtr . ta khai báo tổng quát làm sao ?
 
Lần chỉnh sửa cuối:
sau khi xem lại trên google em thấy rằng khai báo tổng quát là có thể . và nhận xét ở #10 đã sai . xin được sửa lại để ai cần có thể tự sửa được .
để tổng quát ta có thể khai báo

Mã:
#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if

nhưng vẫn dính PtrSafe khi chạy office 2007 . các bạn có cách nào khắc phục ?
 
Lần chỉnh sửa cuối:
sau khi xem lại trên google em thấy rằng khai báo tổng quát là có thể . và nhận xét ở #10 đã sai . xin được sửa lại để ai cần có thể tự sửa được .
để tổng quát ta có thể khai báo

Mã:
#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if

nhưng vẫn dính PtrSafe khi chạy office 2007 . các bạn có cách nào khắc phục ?

Cụ thể bạn đã sửa thế nào trong addin ở topic này?
Mà cũng chỉ hỏi thế thôi chứ tôi không dùng Office 64 nên chẳng biết test thế nào
Giải pháp của tôi cho code trong Addin trên là viết lại hàm MsgBox tiếng Việt theo cách khác không dùng API, chẳng hạn:
- Dùng Macro4
- Dùng WScript.Shell
- Dùng DialogSheet
- Application.Assistant.DoAlert

vân.. vân.. và.. mây.. mây.. (chắc vẫn còn nhiều phương pháp khác nữa)
 
em đã nói là không biết password nên đâu có khui ra mà sửa được
ý em ở #11 là để tương thích 2 kiểu LongLong và Long ta check hằng số Win64
để tương thích ptrSafe ta check hằng số
VBA7

Mã:
#If VBA7 Then
    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
    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
ngồi máy 64 khai báo trong Else sẽ đc tô son
ngồi máy 32 bit 2007 khai báo trong IF sẽ đc tô son

nhưng code vẫn chạy
 
em đã nói là không biết password nên đâu có khui ra mà sửa được
ý em ở #11 là để tương thích 2 kiểu LongLong và Long ta check hằng số Win64
để tương thích ptrSafe ta check hằng số
VBA7

Mã:
#If VBA7 Then
    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
    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
ngồi máy 64 khai báo trong Else sẽ đc tô son
ngồi máy 32 bit 2007 khai báo trong IF sẽ đc tô son

nhưng code vẫn chạy

Bạn test giúp tôi code thế này xem:
Mã:
#If VBA7 Then
  Private Declare PtrSafe Function MessageBoxW Lib "user32" _
  (ByVal hwnd As LongPtr, ByVal lpText As LongPtr, ByVal lpCaption As LongPtr, ByVal wType As VbMsgBoxStyle) As VbMsgBoxResult
#Else
  Private Declare Function MessageBoxW Lib "user32" _
  (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal wType As VbMsgBoxStyle) As VbMsgBoxResult
#End If
Sub ShowUniMsg()
  Dim text As String
  text = ChrW(272) & "ây là Msgbox ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t Unicode"
  MessageBoxW Application.hwnd, StrPtr(text), StrPtr("THÔNG BÁO"), 0
End Sub
Cũng không chắc lắm!
 
Office 2013

mes2013.png

ide2013.jpg

office 2007

mes2007.png

ide2007.jpg
 
Lần chỉnh sửa cuối:
Bác nào thạo thì đóng gói giúp em luôn, chứ nhìn các bác bình luận mà mù tịt có biết gì đâu. Nếu bác nào có phương án nào chữa cháy hay thì chỉ em vơi! @$@!^%
 
Bác nào thạo thì đóng gói giúp em luôn, chứ nhìn các bác bình luận mà mù tịt có biết gì đâu. Nếu bác nào có phương án nào chữa cháy hay thì chỉ em vơi! @$@!^%

Đây, bạn tải file về thử nhé

-----------------------------


Tôi vừa thử trên Excel 2007 (đương nhiên là 32bit) và không thấy lỗi nào
Các bạn khác test giúp tôi file đính kèm này nhé
 

File đính kèm

Web KT

Bài viết mới nhất

Back
Top Bottom