找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2210|回复: 7

[求助] 求高手纠正宏工程里面的创建菜单的自定义函数

[复制链接]
发表于 2014-1-14 13:19:58 | 显示全部楼层 |阅读模式
悬赏400D豆已解决
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:复件 请求帮助的宏工程.rar 
下载次数:6  文件大小:19.82 KB 
下载权限: 不限 以上  [免费赚D豆]


上面宏工程的代码,我的总体设想是,我每次打开一个窗体,它就会帮我创建一个按钮,这样就避免了我再去查找启动这个窗体的宏了,运行菜单就行了。所以按钮只能运行一次创建一个。
我写了一套代码,是创建多级菜单的。
我碰到的问题是:
如果初次创建,三级菜单都会被成功创建。第二次运行的时候要在上次创建的菜单中添加按钮,则失败了。我跟踪代码发现,“菜单二”就无法获得对象,也就无法创建第二个按钮。

希望有高手能帮我解决,纠正里面的创建菜单的自定义函数。
下面是宏工程中的自定义函数之一:


Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令)
        On Error Resume Next
        Dim macro As String
        macro = Chr(vbKeyEscape) + Chr(vbKeyEscape) '这是在向命令行发送命令时需要的前缀。

        Dim currMenuGroup As AcadMenuGroup
        Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

        '下面是创建菜单“工”
        Dim 菜单一 As AcadPopupMenu
        Set 菜单一 = currMenuGroup.Menus.Add(一级菜单名 & Chr(Asc("&"))) '这是说在没有时创建菜单“小多”
        Set 菜单一 = currMenuGroup.Menus(一级菜单名 & Chr(Asc("&"))) '这是说在已有菜单“小多”时就让它赋给变量“newMenu”

        Dim 菜单二 As AcadPopupMenu
        Set 菜单二 = 菜单一.AddSubMenu(菜单一.Count + 1, 二级菜单名 & Chr(Asc("&")))
        Set 菜单二 = 菜单一.Item(二级菜单名 & Chr(Asc("&")))

        Dim 菜单三 As AcadPopupMenu
        Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))
        Set 菜单三 = 菜单二.Items(三级菜单名 & Chr(Asc("&")))

        Dim subMenuItemPoint As AcadPopupMenuItem
        Set subMenuItemPoint = 菜单三.Item(按钮标题)
        subMenuItemPoint.Delete '是如果存在以程序文件简单名为名的按钮,则删除它,再创建,以免同名而内容不同的错误

        If VBA或LSP = "LSP" Then
            '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
            Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
        Else
             Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
        End If

菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)

End Function

最佳答案

查看完整内容

以上代码已经更新,主要是AddSubMenu之后的对象是AcadPopupMenu,而AcadPopupMenu的Item(i)是AcadPopupMenuItem对象,Item(i).SubMenu才是AcadPopupMenu对象。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2014-1-14 13:19:59 | 显示全部楼层
本帖最后由 efan2000 于 2014-1-21 23:01 编辑

以上代码已经更新,主要是AddSubMenu之后的对象是AcadPopupMenu,而AcadPopupMenu的Item(i)是AcadPopupMenuItem对象,Item(i).SubMenu才是AcadPopupMenu对象。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2014-1-21 17:20:01 | 显示全部楼层
本帖最后由 efan2000 于 2014-1-21 22:58 编辑

要先判断一级菜单是否已经创建。
  1.         '下面是创建菜单“工”
  2.         Dim 菜单一 As AcadPopupMenu
  3.         Dim b As Boolean
  4.         b = False
  5.         Dim i As Integer
  6.         For i = 0 To currMenuGroup.Menus.Count - 1
  7.             If currMenuGroup.Menus(i).Name = 一级菜单名 & Chr(Asc("&")) Then
  8.                 b = True
  9.                 Exit For
  10.             End If
  11.         Next
  12.         If b = False Then
  13.             Set 菜单一 = currMenuGroup.Menus.Add(一级菜单名 & Chr(Asc("&"))) '这是说在没有时创建菜单“小多”
  14.         Else
  15.             Set 菜单一 = currMenuGroup.Menus(一级菜单名 & Chr(Asc("&"))) '这是说在已有菜单“小多”时就让它赋给变量“newMenu”
  16.         End If
同理判断二、三级菜单是否已经创建,注意是子菜单。

  1.         Dim 菜单二 As AcadPopupMenu        b = False
  2.         For i = 0 To 菜单一.Count - 1
  3.             If 菜单一(i).Caption = 二级菜单名 & Chr(Asc("&")) Then
  4.                 Set 菜单二 = 菜单一(i).SubMenu
  5.                 b = True
  6.                 Exit For
  7.             End If
  8.         Next
  9.         If b = False Then
  10.             Set 菜单二 = 菜单一.AddSubMenu(菜单一.Count + 1, 二级菜单名 & Chr(Asc("&")))
  11.         End If

  12.         Dim 菜单三 As AcadPopupMenu
  13.         b = False
  14.         For i = 0 To 菜单二.Count - 1
  15.             If 菜单二(i).Caption = 三级菜单名 & Chr(Asc("&")) Then
  16.                 Set 菜单三 = 菜单二(i).SubMenu
  17.                 b = True
  18.                 Exit For
  19.             End If
  20.         Next
  21.         If b = False Then
  22.             Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))
  23.         End If



接下来,如果菜单项已经存在,就删除,然后创建。
  1.         Dim subMenuItemPoint As AcadPopupMenuItem        b = False
  2.         For i = 0 To 菜单三.Count - 1
  3.             If 菜单三(i).Caption = Chr(Asc("&")) & 按钮标题 Then
  4.                 Set subMenuItemPoint = 菜单三(i)
  5.                 subMenuItemPoint.Delete
  6.                 b = True
  7.                 Exit For
  8.             End If
  9.         Next

  10.         If VBA或LSP = "LSP" Then
  11.             '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
  12.             Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
  13.         Else
  14.              Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
  15.         End If


最后判断菜单是否已经在工具栏上了。
  1.         b = False
  2.         For i = 0 To ThisDrawing.Application.MenuBar.Count - 1
  3.             If ThisDrawing.Application.MenuBar(i).Name = 一级菜单名 & Chr(Asc("&")) Then
  4.                 b = True
  5.                 Exit For
  6.             End If
  7.         Next
  8.         If b = False Then
  9.             菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
  10.         End If

评分

参与人数 1D豆 +5 收起 理由
清风明月10 + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2014-1-21 17:22:23 | 显示全部楼层
本帖最后由 efan2000 于 2014-1-21 22:55 编辑

完整代码如下:
  1. Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令)        'On Error Resume Next
  2.         Dim macro As String
  3.         macro = Chr(vbKeyEscape) + Chr(vbKeyEscape) '这是在向命令行发送命令时需要的前缀。

  4.         Dim currMenuGroup As AcadMenuGroup
  5.         Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  6.         '下面是创建菜单“工”
  7.         Dim 菜单一 As AcadPopupMenu
  8.         Dim b As Boolean
  9.         b = False
  10.         Dim i As Integer
  11.         For i = 0 To currMenuGroup.Menus.Count - 1
  12.             If currMenuGroup.Menus(i).Name = 一级菜单名 & Chr(Asc("&")) Then
  13.                 b = True
  14.                 Exit For
  15.             End If
  16.         Next
  17.         If b = False Then
  18.             Set 菜单一 = currMenuGroup.Menus.Add(一级菜单名 & Chr(Asc("&"))) '这是说在没有时创建菜单“小多”
  19.         Else
  20.             Set 菜单一 = currMenuGroup.Menus(一级菜单名 & Chr(Asc("&"))) '这是说在已有菜单“小多”时就让它赋给变量“newMenu”
  21.         End If

  22.         Dim 菜单二 As AcadPopupMenu
  23.         b = False
  24.         For i = 0 To 菜单一.Count - 1
  25.             If 菜单一(i).Caption = 二级菜单名 & Chr(Asc("&")) Then
  26.                 Set 菜单二 = 菜单一(i).SubMenu
  27.                 b = True
  28.                 Exit For
  29.             End If
  30.         Next
  31.         If b = False Then
  32.             Set 菜单二 = 菜单一.AddSubMenu(菜单一.Count + 1, 二级菜单名 & Chr(Asc("&")))
  33.         End If

  34.         Dim 菜单三 As AcadPopupMenu
  35.         b = False
  36.         For i = 0 To 菜单二.Count - 1
  37.             If 菜单二(i).Caption = 三级菜单名 & Chr(Asc("&")) Then
  38.                 Set 菜单三 = 菜单二(i).SubMenu
  39.                 b = True
  40.                 Exit For
  41.             End If
  42.         Next
  43.         If b = False Then
  44.             Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))
  45.         End If

  46.         Dim subMenuItemPoint As AcadPopupMenuItem
  47.         b = False
  48.         For i = 0 To 菜单三.Count - 1
  49.             If 菜单三(i).Caption = Chr(Asc("&")) & 按钮标题 Then
  50.                 Set subMenuItemPoint = 菜单三.SubMenu(i)
  51.                 subMenuItemPoint.Delete
  52.                 b = True
  53.                 Exit For
  54.             End If
  55.         Next

  56.         If VBA或LSP = "LSP" Then
  57.             '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
  58.             Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
  59.         Else
  60.              Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
  61.         End If

  62.         b = False
  63.         For i = 0 To ThisDrawing.Application.MenuBar.Count - 1
  64.             If ThisDrawing.Application.MenuBar(i).Name = 一级菜单名 & Chr(Asc("&")) Then
  65.                 b = True
  66.                 Exit For
  67.             End If
  68.         Next
  69.         If b = False Then
  70.             菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
  71.         End If
  72. End Function


学编程当中,尽量少使用On Error Resume Next,它会屏蔽错误,难以发现问题所在。

点评

Set subMenuItemPoint = 菜单三.SubMenu(i) 上面这一句有错,“subMenuItemPoint”不能获得对象,也就无法删除。所以标题A(其命令为B)一旦创建,则第二次并不能将它改为命令为C,它的命令永远是B。望老师调试改正  详情 回复 发表于 2014-1-22 14:48
调试后,里面有点BUG,我改了,再贴实际运行的代码在此。 Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令) 'On Error Resume Next Dim macro As Stri  详情 回复 发表于 2014-1-22 08:23
老师,运行到这一句“Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))”时出错,显示“运行时错误438 对象不支持该属性及方法”。 在我那个宏工程上调试即可以看到效果   发表于 2014-1-21 19:16

评分

参与人数 1D豆 +5 收起 理由
清风明月10 + 5 热心帮忙奖!望送佛送到西天,彻底解决!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2014-1-22 08:23:18 | 显示全部楼层

调试后,里面有点BUG,我改了,再贴实际运行的代码在此。

Function 创建三级菜单按钮(一级菜单名, 二级菜单名, 三级菜单名, VBA或LSP, 按钮标题, 命令)        'On Error Resume Next
        Dim macro As String
        macro = Chr(vbKeyEscape) + Chr(vbKeyEscape) '这是在向命令行发送命令时需要的前缀。

        Dim currMenuGroup As AcadMenuGroup
        Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

        '下面是创建菜单“工”
        Dim 菜单一 As AcadPopupMenu
        Dim b As Boolean
        b = False
        Dim i As Integer
        For i = 0 To currMenuGroup.Menus.Count - 1
            If currMenuGroup.Menus(i).Name = 一级菜单名 & Chr(Asc("&")) Then
                b = True
                Exit For
            End If
        Next
        If b = False Then
            Set 菜单一 = currMenuGroup.Menus.Add(一级菜单名 & Chr(Asc("&"))) '这是说在没有时创建菜单“小多”
        Else
            Set 菜单一 = currMenuGroup.Menus(一级菜单名 & Chr(Asc("&"))) '这是说在已有菜单“小多”时就让它赋给变量“newMenu”
        End If

        Dim 菜单二 As AcadPopupMenu
        b = False
        For i = 0 To 菜单一.Count - 1
            If 菜单一(i).Caption = 二级菜单名 & Chr(Asc("&")) Then
                Set 菜单二 = 菜单一(i).SubMenu
                b = True
                Exit For
            End If
        Next
        If b = False Then
            Set 菜单二 = 菜单一.AddSubMenu(菜单一.Count + 1, 二级菜单名 & Chr(Asc("&")))
        End If

        Dim 菜单三 As AcadPopupMenu
        b = False
        For i = 0 To 菜单二.Count - 1
            If 菜单二(i).Caption = 三级菜单名 & Chr(Asc("&")) Then
            Set 菜单三 = 菜单二(i).SubMenu
                b = True
                 Exit For
            End If
        Next
        If b = False Then
            Set 菜单三 = 菜单二.AddSubMenu(菜单二.Count + 1, 三级菜单名 & Chr(Asc("&")))
        End If

        Dim subMenuItemPoint As AcadPopupMenuItem
        b = False
        For i = 0 To 菜单三.Count - 1
            If 菜单三(i).Caption = Chr(Asc("&")) & 按钮标题 Then
                Set subMenuItemPoint = 菜单三.SubMenu(i)
                subMenuItemPoint.Delete
                b = True
                Exit For
            End If
        Next

        If VBA或LSP = "LSP" Then
            '创建程序文件简单名为名的按钮,单击按钮时发出"-VBARUN XIANSHISHIYIANDAIMAYONGCHUANGTI "命令
            Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & 命令 & " ")
        Else
             Set subMenuItemPoint = 菜单三.AddMenuItem(菜单三.Count + 1, Chr(Asc("&")) & 按钮标题, macro & "-VBARUN " & 命令 & " ")
        End If

        b = False
        For i = 0 To ThisDrawing.Application.MenuBar.Count - 1
            If ThisDrawing.Application.MenuBar(i).Name = 一级菜单名 & Chr(Asc("&")) Then
                b = True
                Exit For
            End If
        Next
        If b = False Then
            菜单一.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
        End If
End Function


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

 楼主| 发表于 2014-1-22 14:48:46 | 显示全部楼层
本帖最后由 清风明月10 于 2014-1-22 14:52 编辑

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调试用的宏工程.zip 
下载次数:0  文件大小:33.54 KB 
下载权限: 不限 以上  [免费赚D豆]

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调试用的宏工程.zip 
下载次数:0  文件大小:33.54 KB 
下载权限: 不限 以上  [免费赚D豆]

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调试用的宏工程.zip 
下载次数:0  文件大小:33.54 KB 
下载权限: 不限 以上  [免费赚D豆]

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调试用的宏工程.zip 
下载次数:0  文件大小:33.54 KB 
下载权限: 不限 以上  [免费赚D豆]


Set subMenuItemPoint = 菜单三.SubMenu(i)
上面这一句有错,“subMenuItemPoint”不能获得对象,也就无法删除。所以标题A(其命令为B)一旦创建,则第二次并不能将它改为命令为C,它的命令永远是B。望老师调试改正。
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调度用的宏工程.zip 
下载次数:0  文件大小:33.54 KB 
下载权限: 不限 以上  [免费赚D豆]




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2014-1-22 17:22:02 | 显示全部楼层
在菜单“工具”-“选项”里,打开选项对话框,将错误捕获,发生错误则中断,就知道在哪里错误了,调试也方便。
QQ截图20140122171703.png
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:调度用的宏工程.zip 
下载次数:0  文件大小:33.78 KB 
下载权限: 不限 以上  [免费赚D豆]



评分

参与人数 1D豆 +5 收起 理由
清风明月10 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-28 09:27 , Processed in 0.224204 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表