Criação de formulários de usuário VBA

Formulários de usuário VBA

O Userform é uma parte muito importante da programação em VBA. Ele permite que você crie uma interface de usuário com aparência profissional para se comunicar com os usuários de seu aplicativo VBA. Ele também permite que você controle totalmente o usuário no que ele está fazendo em sua pasta de trabalho.

Você pode, é claro, usar células da planilha para aceitar parâmetros do usuário, mas o formulário do usuário produz uma experiência de usuário muito melhor.

Expandindo a altura e a largura do formulário do usuário para o tamanho da janela do Excel, você pode fazer com que seu aplicativo pareça um aplicativo normal do Windows, sem que o usuário saiba que está usando o Excel como host.

Todos os controles normais do Windows, como menus suspensos, caixas de listagem e caixas de seleção estão disponíveis para você. Você também tem uma grande variedade de métodos, eventos e propriedades para usar para aprimorar a experiência do usuário.

Um ponto importante é que, ao exibir um formulário de usuário interno ou modal, você não pode editar seu código no VBE nem acessar nenhuma funcionalidade do Excel. Somente quando o formulário for fechado o cursor aparecerá em seu código.

Formulários de usuário VBA integrados

Excel VBA como vários formulários integrados que podem ser usados ​​para se comunicar com o usuário.

Caixa de mensagem

Esta é a forma mais comumente usada no VBA. Ele simplesmente exibe uma mensagem de texto, possivelmente informando a um usuário que ele inseriu uma entrada inválida ou que um processo VBA terminou de ser executado. Em sua forma mais simples, eles exibem uma string de texto, mas você também pode adicionar um ícone, como uma pergunta ou ponto de exclamação, e dar à caixa de mensagem um título diferente.

Este é um exemplo básico. Há apenas um botão para clicar e a barra de título diz "Microsoft Excel"

O código para produzir isso é muito simples:

123 Sub TestMsgBox ()MsgBox "Este processo foi concluído"End Sub

Você pode usar diferentes parâmetros para adicionar botões, ícones e alterar a barra de título

123456789 Sub TestMsgBox ()Dim Ret como varianteRet = MsgBox ("Tem certeza?", VbYesNo Or vbQuestion, "Meu aplicativo")Se Ret = vb Sim, então'Seu processo aquiOutroSair do SubFim seEnd Sub

Este código adiciona um botão ‘Sim’ e ‘Não’ e um ícone de ponto de interrogação e define a barra de título. Observe que você pode combinar os estilos da caixa de mensagem usando o operador 'Ou'

Além disso, quando você está retornando um valor de uma caixa de mensagem, a variável de retorno deve ser definida como uma variante ou vbMsgBoxResult, e a instrução da caixa de mensagem deve usar colchetes,

Caixa de entrada

Há uma caixa de entrada muito simples embutida no VBA, embora seja bastante restritiva no que você pode fazer com ela. Se você puder, é melhor criar um formulário de usuário personalizado

12345 Sub TestInputBox ()Dim Ret As StringRet = InputBox ("Digite seu nome", "Digite o nome")MsgBox RetEnd Sub

Você também pode adicionar um valor padrão para a entrada nos parâmetros.

Obter nome de arquivo aberto

Isso permite que você utilize a caixa de diálogo de arquivo do Windows em seu código VBA. Parece muito impressionante para o usuário quando está em execução, mas é muito simples de incorporar e você obtém automaticamente todas as funcionalidades de diálogo de arquivo com ele.

O código restringe o usuário a ver apenas arquivos do Excel. Infelizmente, eles podem digitar um nome de arquivo que não seja do Excel na caixa Nome do arquivo e clicar no botão abrir; portanto, você precisará de algum código para garantir que um arquivo do Excel foi selecionado.

Use o comando ‘ChDir’ para alterar o diretório padrão para seus próprios requisitos antes de exibir a caixa de diálogo do arquivo

Observe o uso de curingas no parâmetro FileFilter. Os arquivos do Excel a serem exibidos podem ser anteriores a 2007, ter macros ou ser binários, então o filtro é ‘.xls *’.

123456 Sub TestFileDialog ()Dim MyFile As StringChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Arquivos do Excel (* .xls *), *. Xls *",, "Selecione um arquivo")MsgBox MyFileEnd Sub

Se necessário, você pode permitir que o usuário selecione vários arquivos de uma vez usando o parâmetro MultiSelect. O padrão é False (somente seleção única)

12345678 Sub TestFileDialog ()Dim MyFile As VariantChDir "C: \ temp"MyFile = Application.GetOpenFilename ("Excel Files (* .xls *), *. Xls *",, "Selecione um arquivo",, True)Para Cada f In MyFileMsgBox fPróximo fEnd Sub

O usuário mantém pressionada a tecla Shift na caixa de diálogo do arquivo para selecionar vários arquivos.

O loop For Each exibe o caminho completo e o nome de cada arquivo selecionado

Diálogos padrão do Excel

No Excel VBA, há uma coleção de caixas de diálogo que você pode usar para exibir qualquer caixa de diálogo padrão do Excel. A desvantagem é que você não pode acessar os parâmetros que o usuário escolheu ou alterar a aparência da caixa de diálogo, mas essas caixas de diálogo podem ser úteis para direcionar o usuário a uma função padrão do Excel e permitir que ele escolha parâmetros específicos dentro da caixa de diálogo.

Um bom exemplo disso é exibir a caixa de diálogo ‘Imprimir’ do VBA:

123 Sub TestPrintDialog ()Application.Dialogs (xlDialogPrint) .ShowEnd Sub

Ao abrir os colchetes na coleção Dialogs, você verá uma lista de um grande número de constantes para diálogos integrados. Vale a pena experimentar algumas dessas opções em seu código

Inserindo um Novo Formulário de Usuário

Você pode criar seus próprios formulários de usuário personalizados inserindo um formulário de usuário no Editor do Visual Basic (VBE)

Você pode fazer isso selecionando Inserir | UserForm na barra de menus do VBE.

Clique em ‘UserForm’ e um novo formulário em branco aparecerá pronto para você desenvolver em

O próprio formulário (mostrado como ‘UserForm1’) parece bem pequeno, mas você pode usar as alças ao redor dele para aumentá-lo ou torná-lo ainda menor arrastando as alças com o cursor.

Há uma janela de propriedades no canto esquerdo inferior da tela. Como o foco está diretamente no próprio formulário, ele contém todas as propriedades do formulário específico a esse formulário.

Observe que quando você começa a adicionar controles, como caixas de combinação e botões de comando, todos esses controles têm seu próprio conjunto de propriedades e podem ser muito diferentes no que você pode fazer com cada um deles.

As propriedades que você vê atualmente se aplicam apenas ao próprio formulário.

A propriedade ‘Nome’ é o nome usado para definir seu objeto de formulário dentro do código VBA. Você pode querer usar algo mais significativo para o nome do objeto, de modo que, quando estiver revisando seu código, seja óbvio qual formulário está sendo usado.

A propriedade ‘Nome’ também refletirá na janela ‘Explorador de Projetos’ no canto superior esquerdo da tela

Você vai querer alterar a barra de título de seu formulário para algo diferente de ‘UserForm1’, e você pode fazer isso digitando seu novo texto na propriedade ‘Caption’

Você pode fazer um grande número de alterações na forma como o formulário é visto pelo usuário. Você pode alterar cores, adicionar imagens, por exemplo um logotipo corporativo, mude a posição usando ‘Esquerda’ e ‘Superior’, mude o tamanho usando ‘Altura’ e ‘Largura’, mude o ponteiro do mouse e muito mais

Todas essas propriedades também podem ser alteradas programaticamente para qualquer controle que você adicionou ao seu formulário. Por exemplo, um usuário pode selecionar em um controle de caixa de listagem e você pode desativar ou ocultar outros controles com base na escolha do usuário

Usando a caixa de ferramentas

Você notará que ao clicar no próprio formulário, uma caixa de ferramentas pop-up aparecerá. Se você clicar em qualquer outro lugar, por exemplo o painel de propriedades, ele desaparecerá, mas reaparecerá quando você clicar no formulário.

A caixa de ferramentas fornece a mecânica real do design do formulário. Isso permite que você adicione ao formulário os controles normais do Windows com os quais os usuários estão familiarizados.

Você notará que no formulário há uma rede de pontos. Este é um 'snapgrid' para que, quando você adicionar um controle ao formulário, ele alinhe automaticamente a posição com as linhas e colunas de pontos. Isso ajuda enormemente com o alinhamento de seus controles para que você não obtenha uma aparência irregular dos controles

Se você clicar em um controle e decidir não usá-lo, clicar no ícone "Seta" no canto superior esquerdo da caixa de ferramentas fará com que seu cursor volte ao normal.

Você pode adicionar controles adicionais à caixa de ferramentas usando Ferramentas | Controles adicionais no menu VBE. Há um número considerável deles disponíveis, mas dependendo de suas versões do Windows e Excel, eles nem sempre funcionam, portanto, muitas vezes é necessário fazer alguns experimentos.

Além disso, seus usuários podem não ter acesso a alguns desses controles adicionais ou estar executando versões anteriores do Windows e do Excel, o que pode causar problemas. Em grandes organizações, especialmente se forem globais, não existe um PC de construção padrão em que você possa confiar!

Adicionando um botão de saída ao seu formulário

Um botão de comando é simples de adicionar ao formulário. Isso se parece com os botões que você vê em outros formulários do Windows, geralmente como um botão ‘OK’ ou ‘Cancelar’.

Clique no ícone do botão de comando na caixa de ferramentas. Este é o segundo ícone da esquerda na linha inferior de ícones. Veja a imagem acima. Tem as letras 'ab' nele.

Você pode manter o botão do mouse pressionado e arrastar o controle para o seu formulário ou pode mover o cursor para o formulário, onde ele mudará para um cursor de 'cruz' e você pode posicionar e dimensionar o botão

Se você arrastar o controle para o formulário, obterá o tamanho padrão do botão. Mover o cursor para o formulário permite que você altere o tamanho do botão arrastando o cursor "cruzado" pelo formulário

Seu formulário agora será semelhante a este:

O botão terá o texto padrão como legenda, mas você desejará alterá-lo de acordo com seus próprios requisitos. Você pode clicar no texto dentro do botão (‘CommandButton1’) e isso permitirá que você edite a legenda diretamente.

Você também pode alterá-lo na janela de propriedades (canto inferior esquerdo da tela). Você verá uma propriedade chamada ‘Caption’ e poderá editar o valor para isso. Altere para ‘Sair’

Tal como acontece com as propriedades do formulário, a propriedade ‘Nome’ define o nome que será usado em seu código VBA. Você pode querer usar um nome que seja mais significativo e óbvio em seu código. Você pode inserir isso na propriedade ‘Nome’.

Você pode reposicionar o botão arrastando-o pelo formulário e redimensioná-lo clicando nas alças do botão (caixas quadradas brancas) e arrastando as alças para torná-lo maior ou menor

Você também pode redimensionar o botão alterando os valores de Altura e Largura na janela de propriedades

Você pode visualizar seu formulário no Excel clicando no triângulo verde na barra de ferramentas do VBE ou pressionando F5

Você pode chamar seu formulário a partir do código VBA dentro de um módulo usando o método ‘Mostrar’

123 Sub ShowForm ()UserForm1.ShowEnd Sub

Seu formulário de usuário é efetivamente um objeto global e pode ser chamado de qualquer lugar dentro de seu código

Atualmente, o botão de comando não faz nada porque não há código VBA por trás dele. Você tem que escrever isso sozinho! Tudo o que pode acontecer no momento é você clicar em ‘Fechar’ X no canto superior direito do formulário.

Para adicionar o código VBA, clique duas vezes no botão no formulário

Isso o levará para a janela de código VBA normal e mostrará o evento padrão de clique.

Você usa o método ‘Ocultar’ para fechar o formulário e também pode adicionar qualquer outro código, como uma caixa de mensagem para confirmar ao usuário o que aconteceu.

Observe que a janela de código possui dois menus suspensos na parte superior. O primeiro permite que você selecione seus controles de formulário, e o segundo mostra todos os eventos que estão disponíveis para você adicionar código. O mais óbvio para um botão é o evento ‘Click’, mas existem outros como ‘Double Click’ ou ‘Mouse Move’

Quando você executa seu formulário agora, o botão realmente faz algo. O formulário desaparece e uma caixa de mensagem é exibida confirmando que o formulário está fechado

Você pode, é claro, ampliar o código de saída. Você pode desejar exibir outro formulário ou tomar medidas em relação aos parâmetros que o usuário inseriu em seu formulário

Adicionando um controle de rótulo a um formulário

Os controles de rótulo são para avisar o usuário sobre que tipo de dados eles precisam inserir para um controle no formulário, por exemplo, caixa de texto, lista suspensa, etc. Um rótulo não tem bordas por padrão, mas elas podem ser adicionadas por meio da janela de propriedades, se necessário.

Como um controle, eles são lidos apenas para o usuário e são simplesmente uma forma de inserir texto no formulário, seja um título em negrito ou uma instrução sobre o que inserir ou escolher.

Para adicionar um rótulo, clique no ícone ‘A’ na caixa de ferramentas (linha superior, segunda da esquerda) e clique duas vezes nele ou mova o cursor para o formulário e selecione a posição e o tamanho.

Usando a propriedade 'Caption' na janela de propriedades ou clicando no controle de rótulo, você pode inserir o texto para o controle de rótulo.

Observe que o texto será quebrado de acordo com o tamanho do controle de rótulo e, se a string de texto for muito longa, ela não aparecerá completamente no formulário, portanto, você precisa ter cuidado com o tamanho do controle de rótulo.

Usando a janela de propriedades, você pode alterar a aparência do controle do rótulo, com diferentes cores, fontes, estilo de fundo, por exemplo, se sobrepõe uma imagem e você quer que seja transparente

Nenhum código precisa ser criado para um controle de rótulo. O objetivo principal é adicionar texto ao formulário para que o usuário possa ver como todos os outros controles funcionam

Adicionando um controle de texto ao formulário

Um controle de texto é usado para permitir que o usuário insira texto, por exemplo, inserir um nome ou comentários

O controle de texto é adicionado a partir da caixa de ferramentas clicando no ícone de controle de texto (linha superior, terceira a partir da esquerda) e clicando duas vezes ou arrastando o controle para a posição em seu formulário.

O controle de texto é frequentemente confundido com o controle de rótulo, mas o controle de texto é aquele para entrada do usuário

O texto ‘Digite seu nome’ é um controle de rótulo, conforme descrito anteriormente, e agora temos uma caixa de texto em branco pronta para o usuário digitar algo em

Usando a janela de propriedades, você pode alterar as cores, fontes, efeitos especiais ou usar caracteres de senha para sua caixa de texto. Uma enorme flexibilidade está disponível

Uma propriedade muito importante para uma caixa de texto é a propriedade ‘MultiLine’. Se você deseja que o usuário insira uma grande quantidade de texto no controle de texto, por exemplo, comentários, a propriedade ‘MultiLine’ deve ser definida como True.

É o padrão False, o que significa que não importa o tamanho da caixa de texto, o texto inserido permanecerá em uma linha contínua e rolará para fora da caixa de texto. Não se enrolará dentro da caixa.

Não há pop-up quando você clica com o botão direito na caixa de texto quando ela está em execução, mas CTRL + V funcionará para Colar e CTRL + C funcionará para Recortar, caso o usuário queira recortar e colar texto de e para outro formulários

Novamente, você deve escrever seu próprio código para lidar com o texto que o usuário digitou. Você pode querer transferi-lo para uma célula em uma planilha

Você pode adicionar este código ao evento ‘Change’ da caixa de texto

123 Private Sub TextBox1_Change ()Sheets ("Sheet1"). Range ("A1"). Value = TextBox1.ValueEnd Sub

Você também pode querer inserir algum código de validação para verificar se o usuário não está inserindo lixo, o que terá efeitos desastrosos em seu aplicativo

O evento de mudança não é bom para isso porque é chamado sempre que o usuário digita um novo caractere. O usuário pode começar a digitar uma string de texto e descobrir instantaneamente que quebrou suas regras de validação antes de completar um texto válido.

Você usa o evento ‘Sair’. Isso é acionado quando o usuário move o foco para outro controle no formulário, o que significa que o usuário não está mais inserindo dados.

123456 Private Sub TextBox1_Exit (ByVal Cancel As MSForms.ReturnBoolean)If IsNull (TextBox1.Value) Or Len (TextBox1.Value) <4 ThenMsgBox "Nome é inválido", vbCriticalTextBox1.SetFocusFim seEnd Sub

Quando o usuário clica em outro controle no formulário, este código testa um valor nulo na caixa de texto ou menos de 4 caracteres. Se o teste for verdadeiro, uma caixa de mensagem com um ícone crítico aparecerá para informar ao usuário que o nome é inválido e o foco será movido de volta para a caixa de texto ofensiva para o usuário corrigir.

Observe que mesmo se o usuário clicar no botão Sair, o evento de saída da caixa de texto será executado primeiro, então isso evita que o usuário saia sem corrigir a entrada

Inicializar e ativar eventos em um formulário

Quando o VBA primeiro cria e constrói um formulário, ele aciona um evento "Inicializar". No entanto, como o formulário também é exibido neste ponto, ele também aciona um evento ‘Ativar’. A partir de então, toda vez que o formulário aparece usando o método ‘Mostrar’ ou aparece como parte de uma hierarquia de formulários, então o evento ‘Ativar’ é acionado, mas não o evento ‘Inicializar’

O evento ‘Initialize’ acontece apenas uma vez, mas o evento ‘Activate’ pode acontecer muitas vezes

Em seu formulário, você pode configurar os valores padrão da planilha nos controles de entrada, por exemplo caixas de texto, para que apareçam na primeira utilização do formulário, mas o usuário pode sobrescrever os padrões e esses novos valores permanecerão no lugar enquanto o código estiver em execução

12345678 Sub UserForm_Initialize privado ()TextBox1.Value = Sheets ("Sheet1"). Range ("A1"). ValueSe TextBox1.Value = ”” EntãoTextBox1.Visible = FalseOutroTextBox1.Visible = TrueFim seEnd Sub

Você pode encontrar o evento ‘Initialize’ no segundo menu suspenso na janela de código e o nome do formulário de usuário no primeiro menu suspenso.

Este código usará o valor na célula A1 em ‘Planilha1’ como o valor padrão na caixa de texto criada anteriormente neste artigo. Quando o formulário aparecer pela primeira vez, o valor padrão aparecerá. O usuário pode sobrescrever o valor padrão e este será mantido. Se CellA1 estiver em branco a caixa de texto ficará oculta do contrário ficarávisível

O valor padrão também pode ser codificado:

1 TextBox1.Value = “John Smith”

Você também pode querer ter certeza de que os valores que o usuário inseriu reaparecem sempre que o usuário acionar aquele formulário dentro daquela sessão do Excel em particular. O código VBA pode facilmente escrever os valores de volta nas células da pasta de trabalho usando o evento ‘Exit’ em um controle e reinstaurá-los usando o evento ‘Activate’ no formulário

123 Private Sub TextBox1_Exit (ByVal Cancelar como MSForms.ReturnBoolean)Folhas ("Folha1"). Intervalo ("A10"). Valor = TextBox1.ValueEnd Sub
123 Subutilizador PrivadoForm_Activate ()TextBox1.Value = Folhas ("Folha1"). Intervalo ("A10"). ValorEnd Sub

Este código tornará os valores do usuário persistentes e também garantirá que eles sejam salvos com o resto da pasta de trabalho

Salvar sua inscrição e formulários

Quando você salva sua pasta de trabalho do Excel contendo seus formulários, todos os formulários e seus códigos VBA também são salvos. No entanto, quaisquer valores que os formulários mantenham enquanto são exibidos serão perdidos.

É importante escrever o código de forma que, quando o usuário sair da pasta de trabalho ou do formulário, os valores sejam gravados de volta nas células da pasta de trabalho e, portanto, sejam preservados.

Formulários modais e não modais

O próprio formulário tem uma propriedade ‘Mostrar modal’. Isso é definido por padrão como True, mas pode ser alterado para False (não modal)

Se um formulário for modal, significa que nenhuma funcionalidade do Excel pode ser acessada enquanto o formulário está sendo exibido. Isso inclui seu código na janela VBE. Você pode visualizar o código, mas o cursor e o teclado estão desabilitados.

Em um formulário não modal, você pode acessar todas as funcionalidades do Excel, incluindo a janela VBE, enquanto o formulário está sendo exibido.

Isso é importante do ponto de vista do controle do comportamento do usuário

Fechando um Formulário

Por melhor que você escreva seu código para forçar o usuário a seguir um determinado caminho, ele pode facilmente contorná-lo clicando em ‘Fechar’ X no canto superior direito do formulário

Você pode evitar que isso aconteça modificando o evento ‘QueryClose’ do formulário

1234 Private Sub UserForm_QueryClose (Cancelar como inteiro, CloseMode como inteiro)Cancelar = VerdadeiroMsgBox "Esta ação está desabilitada"End Sub

O evento ‘QueryClose’ é acionado quando o usuário clica em ‘Fechar’ X do formulário. Este código cancela a ação, então o usuário é forçado a usar o botão ‘Sair’ e o código que você tem por trás dele.

Habilitando e desabilitando controles

Todos os controles em seu formulário têm uma propriedade chamada ‘Enabled’ que é definida como True ou False. Se for False, o controle ficará esmaecido. Pode ser visto, mas não pode ser usado.

Há também uma propriedade chamada ‘Visível’ que novamente é definida como Verdadeiro ou Falso.

Você pode escrever código para tornar um determinado controle inutilizável ou para torná-lo totalmente invisível para o usuário. Usando uma declaração 'If', você pode escolher as circunstâncias em que precisa fazer isso

Por exemplo, você pode desativar o botão ‘Sair’ inicialmente, até que o usuário insira um valor no TextBox1 (nome)

123 Sub UserForm_Initialize privado ()CommandButton1.Enabled = FalseEnd Sub
1234567 Private Sub TextBox1_Change ()Se Len (TextBox1.Value)> 0 ThenCommandButton1.Enabled = TrueOutroCommandButton1.Enabled = FalseFim seEnd Sub

Este código usa o evento 'Inicializar' do formulário para desabilitar o botão de saída (Botão de comando 1) quando o formulário aparece pela primeira vez e então usa o evento 'Alterar' no TextBox1 (nome) para habilitar o botão Sair se algo foi digitado ou desabilitar se a caixa estiver em branco.

O evento ‘Change’ é acionado sempre que um novo caractere é digitado ou excluído da caixa de texto. Se o usuário tentar inserir texto para ativar o botão e, em seguida, excluir todo o texto, o botão será desativado instantaneamente

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave