Вы можете создать класс, который "зацепит" нажатие кнопки. Затем вы можете создать и уничтожить класс в событиях Активация и Деактивация рабочей книги. Там три шага:
1) Создайте модуль класса с именем «cCustomViewButton». В модуле класса вставьте этот код:
Private WithEvents cmdCustomView As Office.CommandBarButton
Private Sub Class_Initialize() '950 is the relevant control ID
Set cmdCustomView = Application.CommandBars.FindControl(ID:=950)
End Sub
Private Sub cmdCustomView_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
CancelDefault = True
msgbox "you'll have to insert your own custom view picker here"
End Sub
2) В обычном модуле объявите открытую переменную, которая является экземпляром класса, который вы создали. Вы можете вставить это в любой из ваших обычных модулей. Это должно быть наверху перед любой процедурой:
Public clsCustomViewButton As cCustomViewButton
3) Наконец, вам нужен код, который создает и уничтожает класс. Вы помещаете это в класс ThisWorkbook. Мне нравится использовать события «Активировать и деактивировать книгу»:
Private Sub Workbook_Activate()
Set clsCustomViewButton = New cCustomViewButton
End Sub
Private Sub Workbook_Deactivate()
Set clsCustomViewButton = Nothing
End Sub
Теперь просто деактивируйте, а затем активируйте рабочую книгу. Когда вы нажимаете кнопку «Вид»> «Пользовательские представления ...» (или используете сочетания клавиш, которые щелкают по ней), запускается событие щелчка.
К сожалению, вы увидите, что я заменил часть кода, в которой мы определяем текущее настраиваемое представление, и заменил его на окно сообщения о том, что вам нужно создать собственную форму выбора настраиваемого представления. Первоначально я только что открыл встроенное диалоговое окно «Настраиваемые представления», но, увы, кажется, что нет способа определить текущее настраиваемое представление, поэтому вам придется предложить им варианты, а затем продолжить, основываясь на том, какой из них они выбрали.
РЕДАКТИРОВАТЬ:
Если вы продолжаете создавать свой собственный инструмент выбора вида, вот несколько основных примеров кода:
Sub ListCustomViews()
Dim wb As Excel.Workbook
Dim cvCustomView As Excel.CustomView
Set wb = ThisWorkbook
For Each cvCustomView In ThisWorkbook.CustomViews
Debug.Print cvCustomView.Name
Next cvCustomView
End Sub
Sub RenameCustomView()
Dim NewName As String
With ThisWorkbook.CustomViews("Old Name")
.Show
NewName = "new Name " & .Name
.Delete
End With
ThisWorkbook.CustomViews.Add (NewName)
End Sub
РЕДАКТИРОВАТЬ:
Я только заметил, что ваш вопрос был обновлен. Полное раскрытие: я никогда не использую пользовательские представления, поэтому не осознавал, что существует два типа элементов управления пользовательских представлений - msoControlButton в меню «Вид» и msoControlComboBox, которые вас интересуют. Просто чтобы прояснить ситуацию, любой из этих элементов управления может отображаться как на панели инструментов, например «Форматирование», так и в раскрывающемся меню, например в меню «Вид».
К счастью, комбинированный список позволяет вам делать то, что вы хотите. Я изменил свой оригинальный код clsCustomViewButton, который теперь перехватывает оба типа элементов управления. Что касается типа кнопки, он просто отсылает пользователей к типу комбинированного списка. Для типа комбинированного списка появляется сообщение с выбранным типом.
Private WithEvents cmdCustomView As Office.CommandBarButton
Private WithEvents cboCustomView As Office.CommandBarComboBox
Private Sub Class_Initialize() '950 is the relevant control ID
Set cboCustomView = Application.CommandBars.FindControl(Type:=msoControlComboBox, ID:=950)
Set cmdCustomView = Application.CommandBars.FindControl(Type:=msoControlButton, ID:=950)
End Sub
Private Sub cmdCustomView_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
CancelDefault = True
MsgBox "please use the Custom View dialog on the Formatting Commandbar"
End Sub
Private Sub cboCustomView_Change(ByVal Ctrl As Office.CommandBarComboBox)
MsgBox Ctrl.Text
End Sub
Возможно, вы захотите подтвердить, что элемент управления выпадающим типом где-то существует, и добавить его, если его нет.
Чтобы получить больше идей в этой области, прочитайте страницы 232 и далее в Professional Excel Development - книге, которая вам понравится!
Абсолютно моя последняя редакция:
Если вам действительно не нужно перехватывать событие изменения выпадающего списка и вы просто хотите иметь возможность определить текущий выбранный вид, и при условии, что где-то в меню Excel есть хотя бы один выпадающий список / выпадающий список пользовательских представлений, эта строка будет делать это одна :
приложение.CommandBars.FindControl(тип:= msoControlComboBox, Id:= 950).text
Уф!