A visualização personalizada do Excel selecionada pode ser determinada

1

Eu sei que posso mostrar uma exibição personalizada no excel com o vba. O que preciso fazer é determinar qual visualização personalizada foi selecionada por um usuário para alterar um cabeçalho de coluna com base nessa seleção.

Eles estão usando isso para gerar planilhas de preços para os clientes, muitos dos quais compartilham os mesmos parâmetros, mas todos têm nomes diferentes.

Existe uma maneira de determinar a exibição personalizada selecionada? Excel 2003

Mudei o título para essa pergunta, pois ela pergunta mais diretamente o que estou tentando realizar

Não preciso interceptar o evento de uma seleção do CustomView. Só preciso saber qual CustomView foi selecionado. Você pode determinar a contagem e muitas outras coisas, mas aparentemente não o que está mostrando na lista suspensa do controle CommandBar CustomView

    
por datatoo 29.09.2011 / 20:26

1 resposta

1

Você pode criar uma classe que "conecte" o clique do botão. Em seguida, você pode instanciar e destruir a classe nos eventos Ativar e Desativar Pasta de Trabalho. Existem três etapas:

1) Crie um módulo de classe chamado "cCustomViewButton". No módulo de classe, cole este código:

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) Em um módulo regular, declare uma variável pública que seja uma instância da classe que você criou. Você pode colar isso em qualquer um dos seus módulos regulares. Ele precisa estar no topo antes de qualquer rotina:

Public clsCustomViewButton As cCustomViewButton

3) Finalmente, você precisa do código que instancia e destrói a classe. Você coloca na classe ThisWorkbook. Eu gosto de usar os eventos Ativar pasta de trabalho e Desativar:

Private Sub Workbook_Activate()
Set clsCustomViewButton = New cCustomViewButton
End Sub

Private Sub Workbook_Deactivate()
Set clsCustomViewButton = Nothing
End Sub

Agora, desative e ative a pasta de trabalho. Quando você clicar no botão Exibir > Visualizações personalizadas ... (ou usar os atalhos de teclado que clicam nele), o evento de clique será executado.

Infelizmente, você verá que substituí a parte do código na qual determinamos a visualização personalizada atual e a substituímos por uma caixa de mensagem dizendo que você precisa criar seu próprio formulário de seletor de exibição personalizado. Originalmente, acabei de exibir a caixa de diálogo Visualizações personalizadas, mas parece que não há como determinar a exibição personalizada atual, portanto, você terá que oferecer as opções e, em seguida, continuar com base em qual escolher.

EDITAR:

Se você criar seu próprio seletor de visualizações personalizado, veja alguns exemplos básicos de código:

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

EDITAR:

Acabei de notar que sua pergunta foi atualizada. Divulgação Completa: Eu nunca uso Custom Views, então não havia percebido que havia dois tipos de controles Custom Views - o msoControlButton no menu View e o msoControlComboBox que você está interessado. Apenas para ficar claro, qualquer um desses controles pode aparecer tanto em uma barra de ferramentas, como Formatting , ou em um menu suspenso, como o menu Exibir.

Felizmente, a caixa de combinação permite que você faça o que quiser. Eu modifiquei meu código clsCustomViewButton original, que agora conecta ambos os tipos de controles. Para o tipo de botão, ele apenas encaminha os usuários para o tipo de caixa de combinação. Para o tipo combobox, aparece uma msgbox com o tipo selecionado.

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

Você provavelmente desejará confirmar se o controle de tipo suspenso existe em algum lugar e adicioná-lo, se não existir.

Para mais ideias ao longo desta linha, leia páginas 232 em diante no Professional Excel Development , um livro que você gostaria!

Absolutamente meu EDIT final:

Se você realmente não precisar interceptar o evento de mudança suspenso e quiser determinar a visualização selecionada atual, e supondo que haja pelo menos um menu suspenso / caixa de combinação do Custom View em algum lugar dos menus do Excel, esta linha somente vai fazer isso:

application.CommandBars.FindControl (tipo: = msoControlComboBox, Id: = 950) .text

Ufa!

    
por 30.09.2011 / 07:03