Page 1 of 1

เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Tue Nov 20, 2018 10:12 pm
by akekorn
สวัสดีครับ คุณคนควน และเพื่อนสมาชิกทุกท่าน
วันนี้ผมพบปัญหาแปลก ๆ คือผมได้เขียน เมนูบาร์ ขึ้นใช้เอง excel ที่ผมใช้ในที่ทำงานเป็น 2016 แต่เกิด error คือ หากผมเปิด file นี้อย่างเดียว ปุ่ม process cognos จะไม่
เป็นอะไร ทำงานได้ปกติ แต่พอผมเปิด file ใหม่ขึ้นมา ปุ่ม process cognos จะเพิ่มขึ้นเรื่อยๆหากผมสลับไปมาระหว่าง file นี้ และ file ใหม่
แต่พอมาลองเปิดที่บ้านซึ่ีงเป็น excel 2010 กลับไม่พบปํญหาดังกล่าว และใช้งานได้ปกติ
ผมจึงอย่ากรบกวน เพื่อนสมาชิกทุกท่านช่วยอนุเคราะห์ ปัญหาที่ผมเจอมาด้วยครับ
ขอบคุณมากครับ
เอก

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Tue Nov 20, 2018 11:04 pm
by snasui
:D เปลี่ยนจาก Activate, Deactivate มาเป็น Open และ BeforeClose แทนตามด้านล่างครับ

Code: Select all

Private Sub Workbook_Open()
 'On Error Resume Next
    Call COGNOSoolbar
    Call COGNOSButton
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  '  On Error Resume Next
    Application.CommandBars("Analyst_Toolbar").Delete
End Sub

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Wed Nov 21, 2018 9:15 am
by akekorn
ขอบคุณครับผม

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 9:10 pm
by OOjaoQQ
ขออนุญาติผู้มีความรู้ ช่วยแนะนำ ถ้าผมจะเพิ่ม level ต่อไป จะต้องเขียน code อย่างไรครับ พยายามแกะแล้ว แต่ไม่เข้าใจ code ครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 9:59 pm
by snasui
:D ไม่ทราบว่าเพิ่ม Level อะไร ตรงไหน อย่างไรครับ

คำอธิบายภาษาอังกฤษในไฟล์แนบเป็นการแนะนำให้เพิ่มเมนูไปที่ Quick Access Toolbar ไม่ทราบติดปัญหาตรงไหนครับ :?:

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 10:29 pm
by OOjaoQQ
111.jpg
ตามนี้ครับอาจารย์

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 10:39 pm
by OOjaoQQ
เท่าที่ผมแกะได้คือ select case case2 if next level = 3 then

Code: Select all

Sub WBCreatePopUp()
'   NOTE: There is no error handling in this subroutine

    Dim MenuSheet As Worksheet
    Dim MenuItem As Object
    Dim SubMenuItem As CommandBarButton
    Dim Row As Integer
    Dim MenuLevel, NextLevel, MacroName, Caption, Divider, FaceId

    ''''''''''''''''''''''''''''''''''''''''''''''''''''
    '   Location for menu data
    Set MenuSheet = ThisWorkbook.Sheets("MenuSheet")
    ''''''''''''''''''''''''''''''''''''''''''''''''''''

    '   Make sure the menus aren't duplicated
    Call WBRemovePopUp

    '   Initialize the row counter
    Row = 5

    '   Add the menu, menu items and submenu items using
    '   data stored on MenuSheet

    ' First we create a PopUp menu with the name of the value in B2
    With Application.CommandBars.Add(ThisWorkbook.Sheets("MenuSheet"). _
                                     Range("B2").Value, msoBarPopup, False, True)

        Do Until IsEmpty(MenuSheet.Cells(Row, 1))
            With MenuSheet
                MenuLevel = .Cells(Row, 1)
                Caption = .Cells(Row, 2)
                MacroName = .Cells(Row, 3)
                Divider = .Cells(Row, 4)
                FaceId = .Cells(Row, 5)
                NextLevel = .Cells(Row + 1, 1)
            End With

            Select Case MenuLevel
            Case 2    ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = .Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = .Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = ThisWorkbook.Name & "!" & MacroName
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True

            Case 3    ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = ThisWorkbook.Name & "!" & MacroName
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
            End Select
            Row = Row + 1
        Loop
    End With
End Sub

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 11:02 pm
by snasui
:D Code นั้นอ้างถึงชีต (MenuSheet) ที่มีการเขียน Level ของเมนูเอาไว้ ช่วยแนบไฟล์ต้นทางมาด้วยครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Fri Nov 23, 2018 11:09 pm
by OOjaoQQ
ไฟลน์นี้ครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sat Nov 24, 2018 11:05 am
by snasui
:D ตัวอย่าง Code ครับ

Code: Select all

Sub WBCreatePopUp()
'   NOTE: There is no error handling in this subroutine

    Dim MenuSheet As Worksheet
    Dim MenuItem As Object
    Dim SubMenuItem As CommandBarButton
    Dim MenuItem2 As Object
    Dim SubMenuItem2 As CommandBarButton
    Dim Row As Integer
    Dim MenuLevel, NextLevel, MacroName, Caption, Divider, FaceId

    ''''''''''''''''''''''''''''''''''''''''''''''''''''
    '   Location for menu data
    Set MenuSheet = ThisWorkbook.Sheets("MenuSheet")
    ''''''''''''''''''''''''''''''''''''''''''''''''''''

    '   Make sure the menus aren't duplicated
    Call WBRemovePopUp

    '   Initialize the row counter
    Row = 5

    '   Add the menu, menu items and submenu items using
    '   data stored on MenuSheet

    ' First we create a PopUp menu with the name of the value in B2
    With Application.CommandBars.Add(ThisWorkbook.Sheets("MenuSheet"). _
                                     Range("B2").Value, msoBarPopup, False, True)

        Do Until IsEmpty(MenuSheet.Cells(Row, 1))
            With MenuSheet
                MenuLevel = .Cells(Row, 1)
                Caption = .Cells(Row, 2)
                MacroName = .Cells(Row, 3)
                Divider = .Cells(Row, 4)
                FaceId = .Cells(Row, 5)
                NextLevel = .Cells(Row + 1, 1)
            End With
            Select Case MenuLevel
            Case 2    ' A Menu Item
                If NextLevel = 3 Then
                    Set MenuItem = .Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem = .Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = ThisWorkbook.Name & "!" & MacroName
                End If
                MenuItem.Caption = Caption
                If FaceId <> "" Then MenuItem.FaceId = FaceId
                If Divider Then MenuItem.BeginGroup = True

            Case 3   ' A SubMenu Item
                Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
                SubMenuItem.Caption = Caption
                SubMenuItem.OnAction = ThisWorkbook.Name & "!" & MacroName
                If FaceId <> "" Then SubMenuItem.FaceId = FaceId
                If Divider Then SubMenuItem.BeginGroup = True
            
            Case 4    ' A Menu2 Item
                If NextLevel = 5 Then
                    Set MenuItem2 = MenuItem.Controls.Add(Type:=msoControlPopup)
                Else
                    Set MenuItem2 = MenuItem.Controls.Add(Type:=msoControlButton)
                    MenuItem.OnAction = ThisWorkbook.Name & "!" & MacroName
                End If
                MenuItem2.Caption = Caption
                If FaceId <> "" Then MenuItem2.FaceId = FaceId
                If Divider Then MenuItem2.BeginGroup = True
            Case 5   ' A SubMenu2 Item
                Set SubMenuItem2 = MenuItem2.Controls.Add(Type:=msoControlButton)
                SubMenuItem2.Caption = Caption
                SubMenuItem2.OnAction = ThisWorkbook.Name & "!" & MacroName
                If FaceId <> "" Then SubMenuItem2.FaceId = FaceId
                If Divider Then SubMenuItem2.BeginGroup = True
            End Select
            Row = Row + 1
        Loop
    End With
End Sub
และต้องปรับข้อมูลเป็นลักษณะตามด้านล่างครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sat Nov 24, 2018 12:05 pm
by OOjaoQQ
Level 4 ยังอยู่ใน Level 3 ครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sat Nov 24, 2018 12:08 pm
by snasui
:D นั่นไม่ใช่เลข Running ครับ มันคือ FaceID ถ้าไม่ต้องการให้มีก็ลบทิ้งไปครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sat Nov 24, 2018 12:17 pm
by OOjaoQQ
อาจารย์ตอบเร็วมาก กำลังแก้ไขโพสต์ครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sat Nov 24, 2018 12:22 pm
by snasui
:D ถามใหม่ได้เลย แต่ต้องปรับ Code มาเองเสมอครับ

ก่อนหน้านี้ผมอนุโลมตอบไปก่อน ครั้งถัด ๆ มาต้องแก้เอง ติดแล้วค่อยถามกันครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sun Nov 25, 2018 8:52 pm
by OOjaoQQ
มาขอความรู้อาจารย์ครับ code เดิม กับ code ที่อาจารย์ปรับแก้ให้ เมื่อนำไปใส่ แมโคร เช่น แมโคร เรียก userform แล้ว เกิดมีอาการช้าของ excel จนถึง error นั้น เกิดจาก code ตัวไหนครับ
ปัจจุบัน ผมใช้ code ตามลิงค์ที่แนบครับ
https://docs.microsoft.com/en-us/previo ... office.14)

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sun Nov 25, 2018 9:02 pm
by snasui
:D ไม่สามารถตอบได้จนกว่าจะเห็นว่าเรียกใช้อย่างไร สำหรับ Code ที่นำมาถามและตาม Link ของ Microsoft เท่าที่ดูเร็ว ๆ คือ Code ของ Ron เองทั้งสองที่ครับ

Re: เขียน เมนู บน toolbar เกิด error ใน excel 2016 แต่เปิดใน excel 2010 ไม่เกิด error

Posted: Sun Nov 25, 2018 9:59 pm
by OOjaoQQ
ขอบคุณอาจารย์ที่ให้แนวทางครับตอนนี้จะสร้างกี่ level ก็ได้แล้วครับ
2222.jpg