Lại Menu, nhưng trên form trong VBA

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,705
Giới tính
Nam
Chào các bạn,
Đối với các bạn lập trình chuyên nghiệp thì topic này xin bỏ qua.

Như đã có lần tôi giới thiệu với các bạn một ví dụ nhỏ về việc tạo Menu trong userForm trong VBA.

Nay tình cờ tôi tìm được một file ví dụ, các bạn có thể dễ dàng nghiên cứu.

Việc tạo menu cũng áp dụng kỹ thuật Table Driver mà nhiều chuyên gia về VBA sử dụng.

Table_Driver.jpg


Đoạn code trong form chính như sau:
Mã:
Option Explicit

'// UserForm
Private Sub UserForm_Initialize()
    
    '// Get the UserForm Handle - lấy Handle của UserForm
    g_hForm = FindWindow(vbNullString, Me.Caption)
    
    '// Create our menu - Tạo Menu
    Call CreateAPIMenu
    
    '// Work around for Windows repaint
    With Me
        .Height = 200 ' 250 - 45
        .Height = 253 ' Original + 19
    End With
    
    '// Subclass The Userform - Subclass UserForm
    'Các bạn cần phải tìm hiểu kỹ thuật Subclass
    'Như đã có lần anh smbsolutions và Tuân đã có đề cập
    'http://www.giaiphapexcel.com/forum/showthread.php?t=1071&page=4

    g_lpMyWndProc = SetWindowLong(g_hForm, GWL_WNDPROC, AddressOf HookWinProc)

End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '// Clean up - Xóa Menu và trả lại handle
    DestroyMenu g_hMenu
    SetWindowLong g_hForm, GWL_WNDPROC, g_lpMyWndProc
End Sub
Private Sub UserForm_Terminate()
    '// Safety Clean up - Tương tự như ở thủ tục sự kiện QueryClose
    DestroyMenu g_hMenu
    SetWindowLong g_hForm, GWL_WNDPROC, g_lpMyWndProc
End Sub


Phần chủ yếu của kỹ thuật này nằm ở hai module
basAPIMNUbasAPIMNU_Hook

Module basAPIMNU:
Mã:
Option Explicit
Option Base 1
'---------------------------------------------------------------------------------------
' Module    : basMenuAPIMNU
' DateTime  : 05/01/05 14:33
' Author    : Ivan F Moala
' Site      : http://www.xcelfiles.com
' Purpose   : Creates Windows Menu using API's
'---------------------------------------------------------------------------------------

'// Creates a horizontal menu bar @ the top, suitable for attaching to a top-level window.
'// eg [File], [Edit] etc and usually ending in Help
'// That's the Basic Format.. with [Windows] usually 2nd to last.
Public Declare Function CreateMenu _
    Lib "user32" () _
As Long

Public Declare Function CreatePopupMenu _
    Lib "user32" () _
As Long

Public Declare Function FindWindow _
    Lib "user32" _
        Alias "FindWindowA" ( _
            ByVal lpClassName As String, _
            ByVal lpWindowName As String) _
As Long

Public Declare Function GetMenu _
    Lib "user32" ( _
    ByVal hwnd As Long) _
As Long

Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenuA" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long

Public Declare Function SetMenu _
    Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal hMenu As Long) _
As Long

Public Declare Function DestroyMenu _
    Lib "user32" ( _
        ByVal hMenu As Long) _
As Long

Public Declare Function SetWindowLong _
    Lib "user32" _
        Alias "SetWindowLongA" ( _
            ByVal hwnd As Long, _
            ByVal nIndex As Long, _
            ByVal dwNewLong As Long) _
As Long

Public Const MF_SEPARATOR As Long = &H800&
Public Const MF_POPUP = &H10
Public Const MF_STRING = &H0


Public Const IDM_MU As Long = &H7D0 '// Our Menu Item ID
'//
Public g_hPopUpMenu() As Long       '// Holds Popupmenu handles
Public g_hMenu As Long              '// Userform menu handle
Public g_hPopUpSubMenu() As Long    '// Holds Submenu handles
Public g_Rt() As Long               '// Holds return Values for testing debuging
Public g_APIMacro() As String       '// Holds Routine names associated with Menus
Public g_hForm As Long              '// Userform handle
Public g_MNUSheet As Worksheet      '// Menu Sheet

Public Sub CreateAPIMenu()
'// This sub should be executed when the Userform is Initialised.
Dim RowNum As Long, _
    SubMNU As Long, _
    TopMNUitems As Long, _
    SubMNUItem As Long, _
    TopMNU As Long, _
    Rt As Long, _
    MacroNum As Long

'// Set menusheet
Set g_MNUSheet = ThisWorkbook.Sheets("APIMNU")

With g_MNUSheet
    '// Set-up now
    TopMNUitems = .Range("A1") '// Number of Top Level
    SubMNU = .Range("B1")      '// Number of Sub Menus
    
    ReDim g_hPopUpMenu(TopMNUitems)      '//
    ReDim g_Rt(TopMNUitems)              '//
    ReDim g_hPopUpSubMenu(SubMNU)        '//
    ReDim g_APIMacro(.Range("C1").Value) '//
    
    '// Create Main Menu Area @ Top of Userform
    g_hMenu = CreateMenu()
    Rt = SetMenu(g_hForm, g_hMenu)
    
    '// Initialize variables
    RowNum = 0
    MacroNum = 1
    SubMNUItem = LBound(g_hPopUpSubMenu)
    
    For TopMNU = 1 To TopMNUitems
        RowNum = RowNum + 1
        '// AppendMenu(g_hMenu, MF_POPUP, hPopUpMenu1, "&File")
        '// Create our Top Menu
        g_hPopUpMenu(TopMNU) = CreatePopupMenu()
        '// For 1st Menu Index is (2 + RowNum) after which it is (1 + RowNum)
        If TopMNU = 1 Then
            g_Rt(TopMNU) = AppendMenu(g_hMenu, MF_POPUP, g_hPopUpMenu(TopMNU), .Cells(2 + RowNum, 2))
        Else
            g_Rt(TopMNU) = AppendMenu(g_hMenu, MF_POPUP, g_hPopUpMenu(TopMNU), .Cells(1 + RowNum, 2))
        End If
        '// Do until we get to the END of the Menu = New TOP LEVEL MENU Starts!
        Do Until .Cells(2 + RowNum, 4).Text = "END"
            Select Case .Cells(2 + RowNum, 1).Value
                Case 1
                    '// Do nothing for Testing
                Case 0
                    '// Menu Seperator/Divider ... IDM_MU + Cells(2 + RowNum, 5)
                    '// AppendMenu(hPopUpMenu1, MF_SEPARATOR, IDM_MU + num, vbNullString)
                    '// If it is within Submenu to a Submenu then....
                    If .Cells(1 + RowNum, 1) = 4 Then
                        g_Rt(TopMNU) = AppendMenu(g_hPopUpSubMenu(SubMNUItem - 1), _
                            MF_SEPARATOR, &O0, vbNullString)
                    Else
                        g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), _
                            MF_SEPARATOR, &O1, vbNullString)
                    End If
                Case 2
                    '// STD Sub
                    '// AppendMenu(hPopUpMenu1, MF_STRING, IDM_MU + num, " &New task (Run...)")
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), MF_STRING, _
                        IDM_MU + .Cells(2 + RowNum, 5), .Cells(2 + RowNum, 2))
                    '// Update our Routine to Run here
                    g_APIMacro(MacroNum) = .Cells(2 + RowNum, 3).Text
                    MacroNum = MacroNum + 1
                Case 3
                    '// A SUBMENU Caption = 3
                    g_hPopUpSubMenu(SubMNUItem) = CreatePopupMenu()
                    '// AppendMenu(g_hMenu, MF_POPUP, hPopUpSubMenu1, vbNullString)
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), MF_POPUP, _
                        g_hPopUpSubMenu(SubMNUItem), .Cells(2 + RowNum, 2))
                    SubMNUItem = SubMNUItem + 1
                 Case 4
                    '// A SUBMENUITEM = 4
                    '// AppendMenu(hPopUpSubMenu1, MF_STRING, IDM_MU + num, "SubMNU &1")
                    '// OK, lets build our sub Menu
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpSubMenu(SubMNUItem - 1), _
                        MF_STRING, IDM_MU + .Cells(2 + RowNum, 5), .Cells(2 + RowNum, 2))
                    '// Update our Routine to Run here
                    g_APIMacro(MacroNum) = .Cells(2 + RowNum, 3).Text
                    MacroNum = MacroNum + 1
                End Select
            RowNum = RowNum + 1
        Loop
    Next TopMNU
End With

End Sub

Public Sub RunAPIMNUMacro(strMacroName As String)
    On Error Resume Next
    Application.Run (strMacroName)
    If Err Then
        MsgBox "Error number:=" & Err.Number & vbCrLf & _
            "Description:=" & Err.Description & vbCrLf & _
            "Check yur macro names!", vbCritical + vbMsgBoxHelpButton, _
            "Menu Macro Error", Err.HelpFile, Err.HelpContext
    End If
    Err.Clear
End Sub

Lê Văn Duyệt
 

File đính kèm

  • MenuMaker_UFrmAPI.rar
    38.9 KB · Đọc: 2,308
Phần II,

Menu basAPIMNU_Hook:
Mã:
Option Explicit

Public Declare Function CallWindowProc _
    Lib "user32" _
        Alias "CallWindowProcA" ( _
            ByVal lpPrevWndFunc As Long, _
            ByVal hwnd As Long, _
            ByVal Msg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long) _
As Long

Private Const WM_COMMAND = &H111
Private Const WM_MENUSELECT As Long = &H11F
''
Public g_lpMyWndProc As Long
Public Const GWL_WNDPROC = (-4)

Public Function HookWinProc(ByVal hw As Long, ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long

    '// Windows will handle all messages for you.
    '// It's the WM_COMMAND that is the end result of the user selecting a menu choice.
    '// Catch the WM_COMMAND message and do something......
    '// When the user selects a menu item from your menu,
    '// the command ID selected is sent to your window in the WPARAM field.
    '// This allows you to take the correct action for the command.
    If uMsg = WM_COMMAND Then
        '// This is where we catch the Menu selection
        DoEvents
        
        '// You need to match the case with the Menu ID number
        Call RunAPIMNUMacro(g_APIMacro(wParam - IDM_MU))
    End If
    
    '// NB:Pass all messages to the native window procedure to handle other msgs
    HookWinProc = CallWindowProc(g_lpMyWndProc, hw, uMsg, wParam, lParam)
    
End Function

Chúc các bạn vui với file ví dụ của tác giả.
Hy vọng rằng GPE sẽ có nhiều chương trình được tô điểm cho menu giống ví dụ này.


Lê Văn Duyệt
 
Upvote 0
Ah Bác Duyệt! nếu muốn tạo menu con thứ 4 trở đi thì phải làm như thế nào vậy.
 
Upvote 0
To: yeudoi,
Tôi nghĩ bạn có thể trả lời cho câu hỏi mà bạn đặt ra !

Nhưng tôi tự hỏi trong các ứng dụng, việc xây dựng...tới menu con thứ 4 như bạn nói...hình như "không khoa học lắm" thì phải.

Lê Văn Duyệt
 
Upvote 0
levanduyet đã viết:
To: yeudoi,
Tôi nghĩ bạn có thể trả lời cho câu hỏi mà bạn đặt ra !

Nhưng tôi tự hỏi trong các ứng dụng, việc xây dựng...tới menu con thứ 4 như bạn nói...hình như "không khoa học lắm" thì phải.

Lê Văn Duyệt

Cảm ơn bác nhé. Hay ra phết.

Việc khoa học thì dứt khoát là khoc học rồi, bởi biết đâu sẽ cần sử dụng đến.Tuy nhiên TH này là hãn hữu.

Bác cho em hỏi đoạn code làm thay đổi con trỏ là đoạn nào vậy ?? Hay đấy. .

Thân!
 
Upvote 0
Mr Okebab đã viết:
Cảm ơn bác nhé. Hay ra phết.
Việc khoa học thì dứt khoát là khoc học rồi, bởi biết đâu sẽ cần sử dụng đến.Tuy nhiên TH này là hãn hữu.
Bác cho em hỏi đoạn code làm thay đổi con trỏ là đoạn nào vậy ?? Hay đấy. .
Thân!
Không có code gì đâu. Vào chế độ Design Mode. Click chọn Button / Chọn Properties. Chỗ MousePointer chọn số 99-fmMousePointerCustom
(Không biết phải vậy không, nếu không phải bỏ qua nhé)

Thân!
 
Upvote 0
tedaynui đã viết:
Không có code gì đâu. Vào chế độ Design Mode. Click chọn Button / Chọn Properties. Chỗ MousePointer chọn số 99-fmMousePointerCustom
(Không biết phải vậy không, nếu không phải bỏ qua nhé)

Thân!

Không phải vậy bác ạ. Hình con bướm rất đẹp.

Thân!
 
Upvote 0
Mr Okebab đã viết:
Không phải vậy bác ạ. Hình con bướm rất đẹp.

Thân!
Hi hi, xin lỗi nhé. Sau khi chọn MousePointer là Custom. Hiếu chọn MouseIcon rồi tìm đến file Cursor nào ưng ý (ví dụ hình con bướm)

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Bây giờ một vấn đề nữa đặt ra là:
Làm sao để thể hiện tiếng việt trên menu này ?
Chúng ta cùng nhau thảo luận và thử xem nha!

Lê Văn Duyệt
 
Upvote 0
tedaynui đã viết:
Hi hi, xin lỗi nhé. Sau khi chọn MousePointer là Custom. Hiếu chọn MouseIcon rồi tìm đến file Cursor nào ưng ý (ví dụ hình con bướm)

Thân!

Cũng không phải đâu bác ạ. Em chẳng tìm ra cursor nào như vậy, mà tìm đến thư mục Cursor của Win thì nó OK, nhưng không thể hiện Cursor đấy.

Mà cái đấy là cái gì sao Click right mouse vẫn không thấy gì cả ??

Thân!
 
Upvote 0
levanduyet đã viết:
Bây giờ một vấn đề nữa đặt ra là:
Làm sao để thể hiện tiếng việt trên menu này ?
Chúng ta cùng nhau thảo luận và thử xem nha!

Lê Văn Duyệt

Anh sử dụng các hàm API có đuôi là W

Ví dụ, thay khai báo

Mã:
Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenu[B]A[/B]" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long
thành

Mã:
Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenu[B]W[/B]" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long

Cách dùng các hàm dạng W giống như em đã làm trong MsgBoxUni.

(Các hàm API của WINDOWS cung cấp 2 loại: loại ANSI - không hỗ trợ unicode, loại thứ 2 là Widechar - hỗ trợ unicode. Chuỗi trong môi trường VB ngầm định làm việc theo dạng ANSI vì vậy mọi người hay khaci báo các hàm API có chữ A.)
 
Upvote 0
Mr Okebab đã viết:
Cũng không phải đâu bác ạ. Em chẳng tìm ra cursor nào như vậy, mà tìm đến thư mục Cursor của Win thì nó OK, nhưng không thể hiện Cursor đấy.

Mà cái đấy là cái gì sao Click right mouse vẫn không thấy gì cả ??

Thân!
Em làm giống như tedaynui hướng dẫn trên là OK mà.

Lê Văn Duyệt

TuanVNUNI đã viết:
Anh sử dụng các hàm API có đuôi là W
Em có thể cụ thể hơn với ví dụ file anh upload lên?

Lê Văn Duyệt
 
Upvote 0
tôi mới hoc lập trình VBA, xin mọi người hướng dẫn tôi cách để lập trình làm cho một form luôn nổi với. Cảm ơn mọi người!
 
Upvote 0
Hay thật đấy nhưng nếu chỉnh sửa form ở chế độ "ShowModal=false" này được thì quá tuyệt.
 
Upvote 0
Anh sử dụng các hàm API có đuôi là W

Ví dụ, thay khai báo

Mã:
Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenu[B]A[/B]" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long
thành

Mã:
Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenu[B]W[/B]" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long

Cách dùng các hàm dạng W giống như em đã làm trong MsgBoxUni.

(Các hàm API của WINDOWS cung cấp 2 loại: loại ANSI - không hỗ trợ unicode, loại thứ 2 là Widechar - hỗ trợ unicode. Chuỗi trong môi trường VB ngầm định làm việc theo dạng ANSI vì vậy mọi người hay khaci báo các hàm API có chữ A.)
Em đổi xong nó hiện toàn tiếng tàu thôi.
 
Upvote 0
Upvote 0
Chào các bạn,
Đối với các bạn lập trình chuyên nghiệp thì topic này xin bỏ qua.

Như đã có lần tôi giới thiệu với các bạn một ví dụ nhỏ về việc tạo Menu trong userForm trong VBA.

Nay tình cờ tôi tìm được một file ví dụ, các bạn có thể dễ dàng nghiên cứu.

Việc tạo menu cũng áp dụng kỹ thuật Table Driver mà nhiều chuyên gia về VBA sử dụng.

Table_Driver.jpg


Đoạn code trong form chính như sau:
Mã:
Option Explicit

'// UserForm
Private Sub UserForm_Initialize()
   
    '// Get the UserForm Handle - lấy Handle của UserForm
    g_hForm = FindWindow(vbNullString, Me.Caption)
   
    '// Create our menu - Tạo Menu
    Call CreateAPIMenu
   
    '// Work around for Windows repaint
    With Me
        .Height = 200 ' 250 - 45
        .Height = 253 ' Original + 19
    End With
   
    '// Subclass The Userform - Subclass UserForm
    'Các bạn cần phải tìm hiểu kỹ thuật Subclass
    'Như đã có lần anh smbsolutions và Tuân đã có đề cập
    'http://www.giaiphapexcel.com/forum/showthread.php?t=1071&page=4

    g_lpMyWndProc = SetWindowLong(g_hForm, GWL_WNDPROC, AddressOf HookWinProc)

End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '// Clean up - Xóa Menu và trả lại handle
    DestroyMenu g_hMenu
    SetWindowLong g_hForm, GWL_WNDPROC, g_lpMyWndProc
End Sub
Private Sub UserForm_Terminate()
    '// Safety Clean up - Tương tự như ở thủ tục sự kiện QueryClose
    DestroyMenu g_hMenu
    SetWindowLong g_hForm, GWL_WNDPROC, g_lpMyWndProc
End Sub


Phần chủ yếu của kỹ thuật này nằm ở hai module
basAPIMNUbasAPIMNU_Hook

Module basAPIMNU:
Mã:
Option Explicit
Option Base 1
'---------------------------------------------------------------------------------------
' Module    : basMenuAPIMNU
' DateTime  : 05/01/05 14:33
' Author    : Ivan F Moala
' Site      : http://www.xcelfiles.com
' Purpose   : Creates Windows Menu using API's
'---------------------------------------------------------------------------------------

'// Creates a horizontal menu bar @ the top, suitable for attaching to a top-level window.
'// eg [File], [Edit] etc and usually ending in Help
'// That's the Basic Format.. with [Windows] usually 2nd to last.
Public Declare Function CreateMenu _
    Lib "user32" () _
As Long

Public Declare Function CreatePopupMenu _
    Lib "user32" () _
As Long

Public Declare Function FindWindow _
    Lib "user32" _
        Alias "FindWindowA" ( _
            ByVal lpClassName As String, _
            ByVal lpWindowName As String) _
As Long

Public Declare Function GetMenu _
    Lib "user32" ( _
    ByVal hwnd As Long) _
As Long

Public Declare Function AppendMenu _
    Lib "user32" _
        Alias "AppendMenuA" ( _
            ByVal hMenu As Long, _
            ByVal wFlags As Long, _
            ByVal wIDNewItem As Long, _
            ByVal lpNewItem As String) _
As Long

Public Declare Function SetMenu _
    Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal hMenu As Long) _
As Long

Public Declare Function DestroyMenu _
    Lib "user32" ( _
        ByVal hMenu As Long) _
As Long

Public Declare Function SetWindowLong _
    Lib "user32" _
        Alias "SetWindowLongA" ( _
            ByVal hwnd As Long, _
            ByVal nIndex As Long, _
            ByVal dwNewLong As Long) _
As Long

Public Const MF_SEPARATOR As Long = &H800&
Public Const MF_POPUP = &H10
Public Const MF_STRING = &H0


Public Const IDM_MU As Long = &H7D0 '// Our Menu Item ID
'//
Public g_hPopUpMenu() As Long       '// Holds Popupmenu handles
Public g_hMenu As Long              '// Userform menu handle
Public g_hPopUpSubMenu() As Long    '// Holds Submenu handles
Public g_Rt() As Long               '// Holds return Values for testing debuging
Public g_APIMacro() As String       '// Holds Routine names associated with Menus
Public g_hForm As Long              '// Userform handle
Public g_MNUSheet As Worksheet      '// Menu Sheet

Public Sub CreateAPIMenu()
'// This sub should be executed when the Userform is Initialised.
Dim RowNum As Long, _
    SubMNU As Long, _
    TopMNUitems As Long, _
    SubMNUItem As Long, _
    TopMNU As Long, _
    Rt As Long, _
    MacroNum As Long

'// Set menusheet
Set g_MNUSheet = ThisWorkbook.Sheets("APIMNU")

With g_MNUSheet
    '// Set-up now
    TopMNUitems = .Range("A1") '// Number of Top Level
    SubMNU = .Range("B1")      '// Number of Sub Menus
   
    ReDim g_hPopUpMenu(TopMNUitems)      '//
    ReDim g_Rt(TopMNUitems)              '//
    ReDim g_hPopUpSubMenu(SubMNU)        '//
    ReDim g_APIMacro(.Range("C1").Value) '//
   
    '// Create Main Menu Area @ Top of Userform
    g_hMenu = CreateMenu()
    Rt = SetMenu(g_hForm, g_hMenu)
   
    '// Initialize variables
    RowNum = 0
    MacroNum = 1
    SubMNUItem = LBound(g_hPopUpSubMenu)
   
    For TopMNU = 1 To TopMNUitems
        RowNum = RowNum + 1
        '// AppendMenu(g_hMenu, MF_POPUP, hPopUpMenu1, "&File")
        '// Create our Top Menu
        g_hPopUpMenu(TopMNU) = CreatePopupMenu()
        '// For 1st Menu Index is (2 + RowNum) after which it is (1 + RowNum)
        If TopMNU = 1 Then
            g_Rt(TopMNU) = AppendMenu(g_hMenu, MF_POPUP, g_hPopUpMenu(TopMNU), .Cells(2 + RowNum, 2))
        Else
            g_Rt(TopMNU) = AppendMenu(g_hMenu, MF_POPUP, g_hPopUpMenu(TopMNU), .Cells(1 + RowNum, 2))
        End If
        '// Do until we get to the END of the Menu = New TOP LEVEL MENU Starts!
        Do Until .Cells(2 + RowNum, 4).Text = "END"
            Select Case .Cells(2 + RowNum, 1).Value
                Case 1
                    '// Do nothing for Testing
                Case 0
                    '// Menu Seperator/Divider ... IDM_MU + Cells(2 + RowNum, 5)
                    '// AppendMenu(hPopUpMenu1, MF_SEPARATOR, IDM_MU + num, vbNullString)
                    '// If it is within Submenu to a Submenu then....
                    If .Cells(1 + RowNum, 1) = 4 Then
                        g_Rt(TopMNU) = AppendMenu(g_hPopUpSubMenu(SubMNUItem - 1), _
                            MF_SEPARATOR, &O0, vbNullString)
                    Else
                        g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), _
                            MF_SEPARATOR, &O1, vbNullString)
                    End If
                Case 2
                    '// STD Sub
                    '// AppendMenu(hPopUpMenu1, MF_STRING, IDM_MU + num, " &New task (Run...)")
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), MF_STRING, _
                        IDM_MU + .Cells(2 + RowNum, 5), .Cells(2 + RowNum, 2))
                    '// Update our Routine to Run here
                    g_APIMacro(MacroNum) = .Cells(2 + RowNum, 3).Text
                    MacroNum = MacroNum + 1
                Case 3
                    '// A SUBMENU Caption = 3
                    g_hPopUpSubMenu(SubMNUItem) = CreatePopupMenu()
                    '// AppendMenu(g_hMenu, MF_POPUP, hPopUpSubMenu1, vbNullString)
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpMenu(TopMNU), MF_POPUP, _
                        g_hPopUpSubMenu(SubMNUItem), .Cells(2 + RowNum, 2))
                    SubMNUItem = SubMNUItem + 1
                 Case 4
                    '// A SUBMENUITEM = 4
                    '// AppendMenu(hPopUpSubMenu1, MF_STRING, IDM_MU + num, "SubMNU &1")
                    '// OK, lets build our sub Menu
                    g_Rt(TopMNU) = AppendMenu(g_hPopUpSubMenu(SubMNUItem - 1), _
                        MF_STRING, IDM_MU + .Cells(2 + RowNum, 5), .Cells(2 + RowNum, 2))
                    '// Update our Routine to Run here
                    g_APIMacro(MacroNum) = .Cells(2 + RowNum, 3).Text
                    MacroNum = MacroNum + 1
                End Select
            RowNum = RowNum + 1
        Loop
    Next TopMNU
End With

End Sub

Public Sub RunAPIMNUMacro(strMacroName As String)
    On Error Resume Next
    Application.Run (strMacroName)
    If Err Then
        MsgBox "Error number:=" & Err.Number & vbCrLf & _
            "Description:=" & Err.Description & vbCrLf & _
            "Check yur macro names!", vbCritical + vbMsgBoxHelpButton, _
            "Menu Macro Error", Err.HelpFile, Err.HelpContext
    End If
    Err.Clear
End Sub

Lê Văn Duyệt
Lỗi trên win 64-bit, làm sao để dùng được cả win 32 bit và 64 bit ạ?
 
Upvote 0
Web KT

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

Back
Top Bottom