Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel+;VBA:单击自选图形上方时更改右键单击菜单_Vba_Excel - Fatal编程技术网

Excel+;VBA:单击自选图形上方时更改右键单击菜单

Excel+;VBA:单击自选图形上方时更改右键单击菜单,vba,excel,Vba,Excel,我正在做一个小Excel+vba应用程序,我被卡住了。我知道使用 Application.CommandBars("Cell").Controls.* 我可以更改右键单击菜单,只显示特定单元格的特定选项(当然还有其他代码) 但是,当我在autoshape上方单击鼠标右键时,有没有办法更改菜单 我一直在用类似的东西 (...) 'checking autoshape position sh_le = sh.Left sh_to = sh.Top sh_ri = sh.Left + sh.Wid

我正在做一个小Excel+vba应用程序,我被卡住了。我知道使用

Application.CommandBars("Cell").Controls.* 
我可以更改右键单击菜单,只显示特定单元格的特定选项(当然还有其他代码)

但是,当我在autoshape上方单击鼠标右键时,有没有办法更改菜单

我一直在用类似的东西

(...)
'checking autoshape position
sh_le = sh.Left
sh_to = sh.Top
sh_ri = sh.Left + sh.Width
sh_do = sh.Top + sh.Height

'checking clicked cell position
cc_le = cel.Left
cc_to = cel.Top
cc_ri = cel.Left + cel.Width
cc_do = cel.Top + cel.Height

If (sh_le <= cc_le) And (sh_to <= cc_to) And (sh_ri >= cc_ri) And (sh_do >= cc_do) Then  
 'build custom menu
end if
(…)
'检查自选图形位置
sh_le=sh.左
sh_to=sh.顶部
sh_ri=sh左+sh宽
sh_do=sh顶部+sh高度
'检查单击的单元格位置
cc_le=左侧单元格
cc_to=单元顶部
cc_ri=单元格左+单元格宽
cc_do=天花板顶部+天花板高度
如果(sh_le=cc_do),则
'生成自定义菜单
如果结束

它看起来不错(至少我这么认为):-但当我在形状上方单击时,右键单击之前的
工作表没有启动。还有其他办法吗?如果您能提供任何信息,我将不胜感激。

有一个未记录的特性,这意味着在您关闭并重新打开文件之前,此事件可能不会触发


试试看。

有一个未记录的特性,这意味着在您关闭文件并重新打开它之前,此事件可能不会触发


试试看。

我是这样实现的。 如代码OnAction=“openOrder”中所示,其中openOrder是执行此任务的公共模块

您可以将命令栏(“单元格”)控件更改为命令栏(“形状”)。控件

Private Sub Workbook_Deactivate()
    On Error Resume Next
    Application.CommandBars("Cell").Controls("View order").Delete
    On Error GoTo 0
End Sub

        Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

        Dim cBut As CommandBarButton

        On Error Resume Next

        If IneedCustomMenu=TRUE Then
            On Error Resume Next
            Set cBut = Application.CommandBars("Cell").Controls.Add(Temporary:=True)
                With cBut
                   .Caption = "View order"
                   .Style = msoButtonCaption
                   .OnAction = "openOrder"
                End With
            On Error GoTo 0
        Else
               On Error Resume Next
               With Application
                        .CommandBars(Cell).Controls("View order").Delete
               End With
        End If
       End Sub

我已经用这种方式实现了。 如代码OnAction=“openOrder”中所示,其中openOrder是执行此任务的公共模块

您可以将命令栏(“单元格”)控件更改为命令栏(“形状”)。控件

Private Sub Workbook_Deactivate()
    On Error Resume Next
    Application.CommandBars("Cell").Controls("View order").Delete
    On Error GoTo 0
End Sub

        Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

        Dim cBut As CommandBarButton

        On Error Resume Next

        If IneedCustomMenu=TRUE Then
            On Error Resume Next
            Set cBut = Application.CommandBars("Cell").Controls.Add(Temporary:=True)
                With cBut
                   .Caption = "View order"
                   .Style = msoButtonCaption
                   .OnAction = "openOrder"
                End With
            On Error GoTo 0
        Else
               On Error Resume Next
               With Application
                        .CommandBars(Cell).Controls("View order").Delete
               End With
        End If
       End Sub