Addins-Hỗ trợ Excel tổng hợp đây bản quyền Free và mã nguồn mở!

Liên hệ QC
Trong File chuyển Font mình đã sơ ý để chọn di chuyển chuột trên Userform thì ô mã nguồn lại nhận mã Font của ô hiện tại do vậy khi chọn tự đoán mã hoặc các Font nguồn khác thì dễ bị sai mong bạn nào đó ấn Ctrl + Q vào VBA xóa dòng đó trong Userform FrmcFontSelect cho mình rồi tải lên đây nhé. Mình hết quyền tải rồi. Cảm ơn nhìu!
 
Trong File chuyển Font mình đã sơ ý để chọn di chuyển chuột trên Userform thì ô mã nguồn lại nhận mã Font của ô hiện tại do vậy khi chọn tự đoán mã hoặc các Font nguồn khác thì dễ bị sai mong bạn nào đó ấn Ctrl + Q vào VBA xóa dòng đó trong Userform FrmcFontSelect cho mình rồi tải lên đây nhé. Mình hết quyền tải rồi. Cảm ơn nhìu!

Tôi rất thích bộ hàm Msgbox của Ngọc Lan, rất hay! Nếu các nút lệnh mà mượt mà như msgbox của application thì quá tuyệt! Còn Inputbox của VBA chắc không đổi được font tiếng Việt, chỉ có thể dùng Application.Inputbox.

Cám ơn bạn đã chia sẻ!
 
Mình cũng nghĩ nhiều cách nhưng chưa nghĩ ra ta đành dùng tạm Application.Inputbox vẫn có Font tiếng việt nhưng các nút lệnh thì chưa
mình cùng nhau phát triển nhé
 
Lần chỉnh sửa cuối:
Mình cũng nghĩ nhiều cách nhưng chưa nghĩ ra ta đành dùng tạm Application.Inputbox vẫn có Font tiếng việt nhưng các nút lệnh thì chưa
mình cùng nhau phát triển nhé

Trình độ của mình chỉ là ABC nên không dám nhận cụm từ "cùng nhau phát triển" đâu hihihi.
Trong MsgBoxW của bạn, mình thấy nó có hiện Icon trên Taskbar, vậy làm sao không cho nó hiện lên vậy bạn?

Cám ơn bạn.
 
Trình độ của mình chỉ là ABC nên không dám nhận cụm từ "cùng nhau phát triển" đâu hihihi.
Trong MsgBoxW của bạn, mình thấy nó có hiện Icon trên Taskbar, vậy làm sao không cho nó hiện lên vậy bạn?

Cám ơn bạn.

Mình cũng vậy chỉ trình độ ABC thui. Muốn cho Inputbox có các nút lệnh tiếng việt thì chắc phải nhờ các bậc tiền bối trong diễn đàn dùng lệnh Hook gì đó với Window thui cái đó mình chịu!!!!!!!!!!!!!!!!!!!!!!!
 
Tiện ích của bạn rất hay, nhưng vẫn còn lỗi
ví dụ: menu Dữ liệu/theo dõi phụ thuộc
khi kích vào thì bị lỗi không chạy được. Rất mong bạn xem và phát triển thêm cho người dùng
 
Tiện ích của bạn rất hay, nhưng vẫn còn lỗi
ví dụ: menu Dữ liệu/theo dõi phụ thuộc
khi kích vào thì bị lỗi không chạy được. Rất mong bạn xem và phát triển thêm cho người dùng

Đây là lỗi do khi ngồi muốn viết thêm những tiện ích khác em đã bị nhầm thanh nút lệnh tạo Menu mong mọi người thông cảm
Em rất cảm ơn thầy: yeudoi đã góp ý và em xin tải lại File Add-ins nầy mọi người hãy tải về và copy luôn thay thế File cũ đi. Em xin cảm ơn
P/S: mong mọi người đóng góp ý kiến để File Hỗ trợ Excel này ngày càng hoàn thiện hơn!!!!!!!!!!!!!!!!
Mình đã tải file mới ở trang đầu.
 
Lần chỉnh sửa cuối:
Đây là lỗi do khi ngồi muốn viết thêm những tiện ích khác em đã bị nhầm thanh nút lệnh tạo Menu mong mọi người thông cảm
Em rất cảm ơn thầy: yeudoi đã góp ý và em xin tải lại File Add-ins nầy mọi người hãy tải về và copy luôn thay thế File cũ đi. Em xin cảm ơn
P/S: mong mọi người đóng góp ý kiến để File Hỗ trợ Excel này ngày càng hoàn thiện hơn!!!!!!!!!!!!!!!!

Bạn là là một trong số ít người tôi thấy cách làm bài bản và có tính chuyên nghiệp. Từ cách viết code format code rất sảng, cách comment đầu các module. Với kỹ thuật lập trình của bạn, lắp ghép với ý tưởng để xây dựng ứng dụng, nếu có time chắc bạn sẽ làm được ứng dụng hoàn chỉnh!

Tôi đánh giá cao nữa là phần bạn trích nguồn tác giả khi sử dụng một số hàm (mặc dù nguồn đó chưa đúng lắm). Nếu mọi người đều biết tôn trọng nguồn cũng như bản quyền tác giả thì chúng ta sẽ còn được thấy và được dùng nhiều chương trình hay và các kiến thức tuyệt vời nữa của chính người Việt.
 
Cảm ơn thầy từ khi tiếp xúc với bảng tính Excel diệu kì em cảm thấy rất đam mê và cũng muốn tìm tòi khám phá cho thỏa mãn đam mê (với mục đích chính sao cho mỗi nguời chúng ta khi sử dụng bảng tính thì sẽ rút ngắn được những thao tác phức tạp, tiết kiệm thời gian hơn)
Cảm ơn thầy!!!!!!!!!!
 
Lần chỉnh sửa cuối:
Cảm ơn thầy từ khi tiếp xúc với bảng tính Excel diệu kì em cảm thấy rất đam mê và cũng muốn tìm tòi khám phá cho thỏa mãn đam mê (với mục đích chính sao cho mỗi nguời chúng ta khi sử dụng bảng tính thì sẽ rút ngắn được những thao tác phức tạp, tiết kiệm thời gian hơn)
Cảm ơn thầy!!!!!!!!!!


Mình xin hỏi lại Ngọc Lan nhé, làm sao để khi msgbox hiện lên thì không hiện ICON trên TASKBAR vậy?
 

File đính kèm

  • Picture1.png
    Picture1.png
    13.7 KB · Đọc: 384
Mình xin hỏi lại Ngọc Lan nhé, làm sao để khi msgbox hiện lên thì không hiện ICON trên TASKBAR vậy?
Cái này mình cũng chịu Vì việc Hook vào Window cùng với các hàm API mình không rõ cái MSgboxW này cũng là do mình sưu tầm và thay thế một chút thui mà tiện đây mình có tải Hàm Msgboxw tiếng việt của anh Nguyễn trung tín bạn nào có thời gian ngồi ngâm cứu mấy cái icon cho mọi người nhé!
 

File đính kèm

  • tCoolMessageBox_src.rar
    86.2 KB · Đọc: 139
Cái này mình cũng chịu Vì việc Hook vào Window cùng với các hàm API mình không rõ cái MSgboxW này cũng là do mình sưu tầm và thay thế một chút thui mà tiện đây mình có tải Hàm Msgboxw tiếng việt của anh Nguyễn trung tín bạn nào có thời gian ngồi ngâm cứu mấy cái icon cho mọi người nhé!

Hàm MsgBoxW của bạn và Nguyễn Trung Tín có 2 vấn đề:

1. Thay thế chữ trên Button.
Ở đây các bạn dùng phương pháp FindWindow() thông qua label của các nút. Nếu Windows của bạn chạy với ngôn ngữ English thì sẽ tìm được còn với ngôn ngữ khác thì hàm FindWindow() sẽ không tìm thấy, vì label của các button không còn là "Ok", "Yes",...
-->Giải pháp là phải tìm theo ID của Button.

2. Biến hFont không được giải phóng ==> Lỗi nghiêm trọng!
Biến hFont nhận handle của font chữ tạo bởi hàm CreateFont(), khi đó Windows sẽ quản lý handle này trong Resource. Nhưng khi không dùng đến các bạn không có lệnh nào giải phóng nó, điều này dấn đến bộ nhớ của Windows bị chiếm dụng. Mà trong một ứng dụng hàm MsgBoxW sẽ được dùng rất nhiều lần, mỗi lần bật lên là một lần chiếm dụng bộ nhớ, đến lúc nào đó Windows chạy sẽ chậm và treo!
-->Giải pháp dùng hàm DestroyObject() để giải phóng hFont khi không còn dùng đến.

Còn vấn đề về Add-in, bạn không nên đặt chữ lên Application.Caption, ví Excel được dùng để chạy nhiều Add-in khác cũng như các pm khác nữa.
 
Lần chỉnh sửa cuối:
Mình xin hỏi lại Ngọc Lan nhé, làm sao để khi msgbox hiện lên thì không hiện ICON trên TASKBAR vậy?

Code cũ là:

Mã:
Public Function MsgBoxW(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, _
                        Optional hWnd As Long = &H0) As VbMsgBoxResult
       Dim sTam1 As String, sTam2 As String

       sTam1 = UNC(strText)
       sTam2 = UNC(strTitle)

       hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, Application.Hinstance, GetCurrentThreadId())
       MsgBoxW = MessageBoxW(0, StrPtr(sTam1), StrPtr(sTam2), iButtons Or MB_TASKMODAL)
End Function

Sửa lại, thêm Application.hWnd vào đối số đầu tiên của hàm MessageBoxW

Mã:
Public Function MsgBoxW(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, _
                        Optional hWnd As Long = &H0) As VbMsgBoxResult
       Dim sTam1 As String, sTam2 As String

       sTam1 = UNC(strText)
       sTam2 = UNC(strTitle)

       hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, Application.Hinstance, GetCurrentThreadId())
       MsgBoxW = MessageBoxW([COLOR="#FF0000"]Application.hWnd[/COLOR], StrPtr(sTam1), StrPtr(sTam2), iButtons Or MB_TASKMODAL)
End Function
 
Hàm MsgBoxW của bạn và Nguyễn Trung Tín có 2 vấn đề:

1. Thay thế chữ trên Button.
Ở đây các bạn dùng phương pháp FindWindow() thông qua label của các nút. Nếu Windows của bạn chạy với ngôn ngữ English thì sẽ tìm được còn với ngôn ngữ khác thì hàm FindWindow() sẽ không tìm thấy, vì label của các button không còn là "Ok", "Yes",...
-->Giải pháp là phải tìm theo ID của Button.

2. Biến hFont không được giải phóng ==> Lỗi nghiêm trọng!
Biến hFont nhận handle của font chữ tạo bởi hàm CreateFont(), khi đó Windows sẽ quản lý handle này trong Resource. Nhưng khi không dùng đến các bạn không có lệnh nào giải phóng nó, điều này dấn đến bộ nhớ của Windows bị chiếm dụng. Mà trong một ứng dụng hàm MsgBoxW sẽ được dùng rất nhiều lần, mỗi lần bật lên là một lần chiếm dụng bộ nhớ, đến lúc nào đó Windows chạy sẽ chậm và treo!
-->Giải pháp dùng hàm DestroyObject() để giải phóng hFont khi không còn dùng đến.

Còn vấn đề về Add-in, bạn không nên đặt chữ lên Application.Caption, ví Excel được dùng để chạy nhiều Add-in khác cũng như các pm khác nữa.

Cám ơn anh Tuân đã hướng dẫn, chỉ dạy, vậy theo Anh, cái hàm dưới đây phải sửa như thế nào để nó tìm theo ID và gán DestroyObject() như thế nào để giải phóng bộ nhớ ạ?
PHP:
Option Explicit
Public hDlgHook As Long

Private Const FONT_FACE = "Verdana"

Public Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
Private Const WM_SETFONT = &H30
Private Const MB_TASKMODAL = &H2000&

Public Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal h As Long, ByVal W As Long, ByVal e As Long, _
                                                                    ByVal o As Long, ByVal W As Long, ByVal i As Long, ByVal u As Long, ByVal s As Long, ByVal c As Long, _
                                                                    ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal ParenthWnd As Long, _
                                                                         ByVal ChildhWnd As Long, ByVal ClassName As String, ByVal Caption As String) As Long

Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, _
                                                                                 ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long

Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, _
                                                     ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                                                                       ByVal wParam As Long, lParam As Any) As Long

Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Public Declare Function SetWindowTextW Lib "user32" (ByVal hWnd As Long, ByVal lpString As Long) As Long

Public Declare Function MessageBoxW Lib "user32.dll" (ByVal hWnd As Long, ByVal lpText As Long, _
                                                      ByVal lpCaption As Long, ByVal uType As Long) As Long
PHP:
Private Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
       Dim hStatic1 As Long, hStatic2 As Long, hButton As Long, hFont As Long
       HookProc = CallNextHookEx(hDlgHook, nCode, wParam, lParam)
       If nCode = HCBT_ACTIVATE Then
              hFont = CreateFont(15, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, FONT_FACE)

              hStatic1 = FindWindowEx(wParam, 0&, "Static", vbNullString)
              hStatic2 = FindWindowEx(wParam, hStatic1, "Static", vbNullString)
              If hStatic2 = 0 Then hStatic2 = hStatic1
              SendMessage hStatic2, WM_SETFONT, hFont, ByVal 1&

              hButton = FindWindowEx(wParam, 0&, "Button", "OK")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&§ång ý"))

              hButton = FindWindowEx(wParam, 0&, "Button", "&Yes")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Cã"))

              hButton = FindWindowEx(wParam, 0&, "Button", "&No")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Kh«ng"))

              hButton = FindWindowEx(wParam, 0&, "Button", "Cancel")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Hñy bá"))

              hButton = FindWindowEx(wParam, 0&, "Button", "&Retry")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Thö l¹i"))

              hButton = FindWindowEx(wParam, 0&, "Button", "&Ignore")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Lê ®i"))

              hButton = FindWindowEx(wParam, 0&, "Button", "&Abort")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("&Xua61t ra *.txt"))

              hButton = FindWindowEx(wParam, 0&, "Button", "Help")
              SendMessage hButton, WM_SETFONT, hFont, 0
              SetWindowTextW hButton, StrPtr(UNC("Gióp ®ì"))

              UnhookWindowsHookEx hDlgHook
       End If
End Function

PHP:
Public Function MsgBoxW(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, _
                        Optional hWnd As Long = &H0) As VbMsgBoxResult
       Dim sTam1 As String, sTam2 As String

       sTam1 = UNC(strText)
       sTam2 = UNC(strTitle)

       hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, Application.Hinstance, GetCurrentThreadId())
       MsgBoxW = MessageBoxW(Application.hWnd, StrPtr(sTam1), StrPtr(sTam2), iButtons Or MB_TASKMODAL)
End Function

Cám ơn Anh Tuân rất nhiều!
 
Trong hàm HookProc có đoạn khai báo hFont As Long, hãy xóa nó và khai báo lại trên đầu module với 2 dòng khai báo dưới đây:
Mã:
Public Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long
Public hFont As Long [COLOR="#008000"]'Lưu giá trị handle của font đã tạo[/COLOR]
Hàm MsgBoxW bổ sung lệnh DeleteObject để giải phóng hFont
Mã:
Public Function MsgBoxW(strText As String, Optional iButtons As VbMsgBoxStyle = vbOKOnly, Optional strTitle As String, _
                        Optional hWnd As Long = &H0) As VbMsgBoxResult
       Dim sTam1 As String, sTam2 As String

       sTam1 = UNC(strText)
       sTam2 = UNC(strTitle)

       hDlgHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, Application.Hinstance, GetCurrentThreadId())
       MsgBoxW = MessageBoxW(Application.hWnd, StrPtr(sTam1), StrPtr(sTam2), iButtons Or MB_TASKMODAL)
[COLOR="#FF0000"]       DeleteObject hFont[/COLOR]
End Function


Còn vấn đề tìm handle của Button bởi ID của nó tác giả hãy nghiên cứu tìm cách xem.
 
Bạn ngọc lan cho mình hỏi. Làm sao để khi chuyển Add-in đi chỗ khác thì vẫn tiếp tục dùng được, hiện tại chương trình đang báo lỗi và không cho sử dụng, do lúc mới tải về chạy thử mình để vị trí khác. Không lẽ chỉ do chạy lần đầu là mãi mãi không chuyển được file đi hay sao?. Cảm ơn bạn!
 

File đính kèm

  • Picture1.png
    Picture1.png
    6.8 KB · Đọc: 405
Chắc đó chỉ là những giá trị của các nút của Button thui bạn ạ. Chắc phen nầy mình phải học các hàm API của Win thôi chứ ý thầy tuân chắc là muốn bọn mình tự nghiên cứu phát triển không được ỷ lại đó mà. Mình cùng cố gắng nhé!!!!!!!!!!!!
 
Bạn ngọc lan cho mình hỏi. Làm sao để khi chuyển Add-in đi chỗ khác thì vẫn tiếp tục dùng được, hiện tại chương trình đang báo lỗi và không cho sử dụng, do lúc mới tải về chạy thử mình để vị trí khác. Không lẽ chỉ do chạy lần đầu là mãi mãi không chuyển được file đi hay sao?. Cảm ơn bạn!
Bạn ptlong04x1 xin chờ chút nhé chắc đến chiều mình cập nhật bản mới sẽ bỏ các thao tác đăng ký và cho phép người dùng sử dụng nhưng dưới mật khẩu phân quyền của người cài đặt sử dụng nó. Mà khi viết đề tài này mình đã ghi rõ muốn mọi người cùng nhau phát triển để tiện dụng nhất khi sử dụng Excel mà!!!!!!!!!!!!!!! hãy nghiên cứu và phát triển lên đi bạn
 
Mình đã sửa lại rồi đây bạn nào Test thử cho mình ý kiến nhé!
Chỉ cần Copy toàn bộ Folder vào bộ Add-ins gốc thui nhớ xóa File cũ nhé!!!!!!!!!!!!!!!!!!!!
Mình đã gửi file mới tại đầu trang. Mọi người hãy vào đó và tải nhé
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom