Невозможно показать или скрыть мою надстройку VSTO Excel - PullRequest
4 голосов
/ 29 февраля 2020

У меня есть лента с именем 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. Строка выполнена, но вкладка не скрывается. У меня замораживание мозга! Это правильный способ делать то, что я хочу?

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Как упоминал Малик, это зависит от ControlIdType ленты

enter image description here

Если вы измените его на 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
2 голосов
/ 01 марта 2020

Следующий эквивалентный код в c# работает, если ControlIdType ленты установлен на Custom, однако он не работает, если он установлен на 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;
        }
    }

Редактировать: Как правильно показано в ответе Сиддхарта Раута, это не ошибка: чтобы скрыть вкладку с конфигурацией Office, нам нужно скрыть все группы.

...