【问题标题】:Unable to Show or Hide my VSTO Excel Add-In无法显示或隐藏我的 VSTO Excel 加载项
【发布时间】:2020-02-29 05:42:21
【问题描述】:

我有一条丝带,名为Ribbon 1

我希望我的功能区仅在工作簿打开时显示。如果只有 excel 应用程序正在运行并且没有打开工作簿,那么我想隐藏我的功能区选项卡。我该怎么做?

这是我尝试过的,但它没有隐藏功能区

Public Class ThisAddIn
    Private Sub Application_WorkbookOpen(ByVal doc As Excel.Workbook) Handles Application.WorkbookOpen
        If Application.Workbooks.Count > 0 Then
            If Globals.Ribbons.Ribbon1.Tab1.Visible = False Then Globals.Ribbons.Ribbon1.Tab1.Visible = True
        End If
    End Sub

    Private Sub Application_WorkbookBeforeClose(ByVal doc As Excel.Workbook, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeClose
        If Application.Workbooks.Count = 1 Then
            If Globals.Ribbons.Ribbon1.Tab1.Visible = True Then Globals.Ribbons.Ribbon1.Tab1.Visible = False
        End If
    End Sub
End Class

我没有收到任何错误。它根本没有隐藏它。我在If Globals.Ribbons.Ribbon1.Tab1.Visible = True Then Globals.Ribbons.Ribbon1.Tab1.Visible = False 上设置了一个断点。该行已执行,但选项卡没有隐藏。我的大脑冻结了!这是做我想做的事情的正确方法吗?

【问题讨论】:

  • 你可以试试:Globals.Ribbons.Ribbon.Ribbon1.Visible = false 吗?
  • 你的公平性测试应该是==而不是=
  • 两者都不起作用。 'Ribbon' 不是 'ThisRibbonCollection' 的成员,而且 vb.net 中的 == 也会出错。 == 是 C#。是的,我确实将这个问题标记为 C#,因为在 vb.net 和 c# 中尝试此问题的基本逻辑是相同的。 :)
  • 对不起,我不知道它在 vb.net 中有所不同。我在第一条评论中提出的代码适用于 C# VSTO。
  • @Malick,在 c# 中,== 用于比较,= 用于分配。在 vb.net 中,= 用于比较和赋值。编译器足够聪明,可以区分两者。但最终 c# 和 vb.net 都编译为相同的 MSIL。所以我很确定代码在 c# 中也不起作用。但是这个世界上总是有意想不到的事情发生,所以我会在 c# 中尝试一下,让你知道。

标签: c# excel vb.net vsto add-in


【解决方案1】:

如果功能区的ControlIdType 设置为Custom,则c# 中的以下等效代码有效,但是如果将其设置为Office,则它不起作用(我假设您就是这种情况.. )。因此,在我看来,您在 VSTO 运行时中发现了一个错误/限制:只有在选项卡是自定义的(即,如果它位于新的独立选项卡上)时,才能更改可见性。

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeClose += Application_WorkbookBeforeClose;
        this.Application.WorkbookOpen += Application_WorkbookOpen;
    }

    private void Application_WorkbookOpen(Excel.Workbook Wb)
    {
        if (this.Application.Workbooks.Count > 0) {
            if (Globals.Ribbons.Ribbon1.tab1.Visible == false) Globals.Ribbons.Ribbon1.tab1.Visible = true;
        }

    }

    private void Application_WorkbookBeforeClose(Excel.Workbook Wb, ref bool Cancel)
    {
        if (this.Application.Workbooks.Count == 1)
        {
            if (Globals.Ribbons.Ribbon1.tab1.Visible == true) Globals.Ribbons.Ribbon1.tab1.Visible = false;
        }
    }

编辑:正如 Siddharth Rout 的回答中正确显示的那样,这不是错误:要隐藏具有 Office 配置的选项卡,我们需要隐藏所有组。

【讨论】:

  • 很好解释:)
【解决方案2】:

正如 Malick 所说,这取决于功能区的ControlIdType

如果您将其更改为Custom,您在问题中发布的原始代码应该可以工作。

对于Office,您必须隐藏所有组。隐藏所有组后,选项卡将自动隐藏。

Public Class ThisAddIn
    '~~> Workbook Open
    Private Sub Application_WorkbookOpen(ByVal doc As Excel.Workbook) Handles Application.WorkbookOpen
        If Application.Workbooks.Count > 0 Then
            For Each ribbonGroup In Globals.Ribbons.Ribbon1.Tab1.Groups
                ribbonGroup.Visible = True
            Next
        End If
    End Sub

    '~~> This is if the user presses CTRL + N for a new workbook
    Private Sub Application_WorkbookActivate(ByVal doc As Excel.Workbook) Handles Application.WorkbookActivate
        If Application.Workbooks.Count > 0 Then
            For Each ribbonGroup In Globals.Ribbons.Ribbon1.Tab1.Groups
                ribbonGroup.Visible = True
            Next
        End If
    End Sub

    '~~> Before Close
    Private Sub Application_WorkbookBeforeClose(ByVal doc As Excel.Workbook, ByRef Cancel As Boolean) Handles Application.WorkbookBeforeClose
        If Application.Workbooks.Count = 1 Then
            If Globals.Ribbons.Ribbon1.Tab1.Visible = True Then
                For Each ribbonGroup In Globals.Ribbons.Ribbon1.Tab1.Groups
                    ribbonGroup.Visible = False
                Next
            End If
        End If
    End Sub
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2011-04-04
    相关资源
    最近更新 更多