VBA – O que é e como utilizar a (brilhante!) Janela de Verificação Imediata

E ai está! Sim, ela! A janela de Verificação Imediata, um recurso quase tão indispensável como ar. Ok, exagerei. Mas se você é programador VBA, deve saber do que estou falando.

Muito brevemente, a Janela de Verificação Imediata é o que chamamos de REPL (Read-eval-print-loop), ou, em poucas palavras, um espaço interativo para execução de código. Se você já trabalha com Windows há algum tempo, com certeza deve conhecer o promp do DOS (aquela janela preta feia para digitar comandos):

Prompt do DOS
Prompt do DOS

Pois é, aqui é um REPL, ou um prompt, como falantes da língua inglesa gostam de chamar. Não uma tradução boa para este termo em português, que deve querer dizer algo como “pronto” ou “imediato”. De fato ele merece esse adjetivo pois é um espaço pronto para receber comandos e dar uma resposta imediata:

Comando aplicado, resposta imediata
Comando aplicado, resposta imediata

É literalmente um bate-e-pronto. Tendo dito isso, voltemos ao assunto principal. E se você está se perguntando, sim, a Janela de Verificação Imediata é um REPL, ou prompt, só que neste caso, um prompt dedicado ao VBA e com muitos benefícios!

Ao longo deste texto, mostrarei como usar o recurso e alguns exemplos. Depois disso, acredito que as capacidades da Janela de Verificação Imediata ficarão mais do que claras.

Onde está a Janela de Verificação Imediata?

Você só consegue ver/ativar/usar a Janela de Verificação Imediata a partir do VBA. No Excel/Word/PowerPoint/Access, abra o VBA (Alt+F11). Procure o menu Exibir->Janela de Verificação Imediata:

Ativando a Janela de Verificação Imediata
Ativando a Janela de Verificação Imediata

Já deverá ser possível vê-la no seu VBA:

Janela de Verificação Imediata Ativada
Janela de Verificação Imediata Ativada

E é aqui que a brincadeira começa! Já é possível disparar comandos nessa “mágica tela branca”. Mas vamos aos poucos.  Ao exemplos!

😉

Como funciona?

Basta escrever algo nele. É claro, o que a Janela de Verificação Imediata espera é um código VBA válido. Qualquer coisa que não o seja, vai gerar um erro. Por exemplo:

Um erro na Janela de Verificação Imediata
Um erro na Janela de Verificação Imediata

Nem o VBA e nem a Janela de Verificação Imediata sabem o que é “Oi”. O que dá pra fazer então?

Vamos chamar uma função conhecida, o MsgBox! Veja o exemplo abaixo:

A Janela de Verificação Imediata dando uma mãozinha
A Janela de Verificação Imediata dando uma mãozinha

Notem que ao digitar o nome da função MsgBox, a Janela de Verificação Imediata se comporta como o editor do VBA. Logo depois, é clicar em enter e ver o MsgBox funcionando:

O MsbBox funcionando na Janela de Verificação Imediata
O MsgBox funcionando na Janela de Verificação Imediata

É possível inclusive chamar suas macros, pelo nome, claro.

É o uso mais básico. Antes de começar de fato, a Janela de Verificação Imediata possui alguns macetes. Quando chamamos o MsgBox, ele tem uma ação a executar por si, que é mostrar uma caixa de diálogo. Mas, se chamar outra função, por exemplo, o calculo de uma planilha, o que acontece é o seguinte:

Chamando a função sem retorno
Chamando a função sem retorno…. e?

Nada? Pois é, o comando foi executado com sucesso e sem erros, mas não houve retorno. Quando não há retorno, é assim mesmo que acontece. Quando queremos um retorno e saber algum valor, como faço?

O código abaixo tenta obter a quantidade de planilhas contidas no arquivo atual:

ThisWorkbook.Worksheets.Count

Mas ao tentar executar na Janela de Verificação Imediata, o resultado é o seguinte:

Uso inválido da propriedade
Uso inválido da propriedade

Como então para fazer o comando funcionar? O segredo está no “?”. Sim, esse cara faz com que o retorno ou resultado da função seja colocado como texto na Janela de Verificação Imediata. Ao executar o mando agora:

Obtendo o resultado de uma função na janela de verificação imediata
Obtendo o resultado de uma função na janela de verificação imediata

Agora sim temos um prompt interativo! Tudo pode ser feito aqui, desde que seja um comando válido e em uma linha.

Obtendo informações do seu arquivo

Ok, agora a brincadeira começa. Vimos que podemos executar ações e obter dados. Alguns exemplos pode ser vistos abaixo:

O caminho do arquivo:

?ThisWorkbook.FullName

O nome da planilha atual:

?ActiveSheet.Name

O valor da célula atual:

?ActiveCell.Value

Abaixo os comandos executados e seus resultados:

Comandos executados na janela de verificação imediata
Comandos executados na janela de verificação imediata

Dica: você pode a qualquer momento limpar o conteúdo da janela para limpá-la

Executar ações

Já vimos que é possível obter informações facilmente. Mas não é só isso que podemos fazer. É possível executar ações como atribuir valores a células, formatar, etc. Tudo o que está disponível no VBA está disponível aqui também! Vejamos o código abaixo:

Adicionando uma planilha pela janela de verificação imediata
Adicionando uma planilha pela janela de verificação imediata

Primeiro, contou-se a quantidade de planilhas no arquivo, que no caso, era 1. Depois, utilizou-se a função Add da propriedade Worksheets para adicionar uma nova planilha. Em seguida, contou-se novamente para ter certeza do resultado.

Qualquer outra coisa poderia ser feita aqui. Agora, um brincadeira rápida. Experimente o comando:

Application.Visible = False

Tente descobrir o que aconteceu com a janela do Excel. 😉

Executando Macros

Era mais do que esperado. Chamar uma macro da Janela de Verificação Imediata é tão simples quanto digitar seu nome:

Macro1

E é só! Como uma macro gravada não pede parâmetros, nada mais precisa ser mencionado. Caso houvesse, o resultado seria o da janela abaixo:

Chamando uma macro na Janela de Verificação Imediata
Chamando uma macro na Janela de Verificação Imediata

Os argumentos da macro pode ser vistos na própria chamada. Agora, a macro executada:

Macro executada a partir da Janela de Verificação Imediata
Macro executada a partir da Janela de Verificação Imediata

O Debug.Print

Esse eu uso, e muito! A Janela de Verificação Imediata não é só um lugar para entrada de dados. Também serve para saída. Você pode escrever nela utilizando a função Debug.Print. Fecha o exemplo o código abaixo:

Sub NomesDasPlanilhas()
    For Each plan In ThisWorkbook.Worksheets
        Debug.Print plan.Name
    Next plan
End Sub

E o código executado fica da seguinte forma:

Usando o Debug.Print
Usando o Debug.Print

O For Each passa por todas as planilhas do arquivo e escreve o nome de cada uma delas na Janela de Verificação Imediata. É um lugar muito mais limpo para fazer checagem de dados, sem precisar de MsgBox ou sujar alguma planilha com dados.

Você pode escrever qualquer coisa na Janela de Verificação Imediata, desde que seja texto, claro.

Usando na Depuração

Costuma depurar seu código VBA? Ótimo! A Janela Verificação Imediata também está lá para lhe ajudar. Vamos o usar o código anterior para brincar um pouco. Vou aplicar um ponto de interrupção na linha do Debug.Print para ver como a Janela Verificação Imediata pode ajudar:

Aplicando o breakpoint
Aplicando o breakpoint

Chamei a função DigaOi com o ponto de interrupção marcado. Quanto o código pára nesse ponto, já possível fazer algumas verificações, como o valor das variáveis, e mudá-las inclusive:

Alterando o valor em Debug na Janela de Verificação Imediata
Alterando o valor em Debug na Janela de Verificação Imediata

For fim, deixo a macro terminar o trabalho:

A macro terminando de executar com o valor alterado
A macro terminando de executar com o valor alterado

Conclusão

Bem, se você chegou até aqui, espero, espero que os exemplos colocados tenha sido o suficiente para demonstrar para do poder da Janela de Verificação Imediata. É uma ferramenta quase indispensável para que começa a se aprofundar nos aplicativos em VBA.

Claro, se tiver algo que tenha esquecido de mencionar, é só colocar nos comentários.

Bom proveito!

VBA – Obtendo os valores dos filtros aplicados numa planilha

AutoFiltro

Mais uma pra lista dos canivetes suíços. O autofiltro é um mecanismo tão conhecido e utilizado que poucos notam um defeito (pelo menos em minha opinião é um defeito).

Supondo que você tenha uma tabela com 20 colunas. Você filtra uma coluna, duas, três…. quando chega no resultado que quer, já nem lembra mais quais os filtros selecionou. O que é normalmente feito é, limpa-se os filtros e começa tudo de novo.

Foi um cliente (sempre eles, mas eu gosto!) que gerou a necessidade. Portanto, foi preciso uma forma de extrair quais os filtros estavam sendo aplicados na planilha naquele momento. Uma garimpada na internet e lá veio uma resposta.

Adaptei o código abaixo para atender às necessidades da maioria e corrigir alguns erros. Mantive o nome da função original para garantir a autoria do código

Public Function GetAutoFilterCriteria() As String
On Error GoTo trataerro
    Dim oAF As AutoFilter
    Dim oFlt As Filter
    Dim sField As String
    Dim sCrit1 As String
    Dim sCrit2 As String
    Dim sMsg As String
    Dim i As Integer
 
    ' Verifica se há filtros ativados na planilha
    If Not ActiveSheet.AutoFilterMode And Not ActiveSheet.ListObjects(1).ShowAutoFilter Then
        sMsg = "O auto filtro não está ativado"
        GoTo trataerro
    Else
        If ActiveSheet.AutoFilterMode Then
            ' obtém o objeto de filtro da planilha
                Set oAF = ActiveSheet.AutoFilter
        Else
            ' obtém o objeto de filtro da planilha
            Set oAF = ActiveSheet.ListObjects(1).AutoFilter
        End If
    End If
 
    ' itera em todos os filtros aplicados na planilha
    For i = 1 To oAF.Filters.Count
        ' obtém no nome da coluna
        sField = oAF.Range.Cells(1, i).Value
 
        ' obtém o objeto filtro da coluna
        Set oFlt = oAF.Filters(i)
 
        ' Está ativo?
        If oFlt.On Then
 
            ' Obtém o primeiro critério de filtro (tem que haver ao menos um)
            If IsArray(oFlt.Criteria1) Then
                Dim x As Integer
                sMsg = sMsg & vbCrLf & sField
                For x = 1 To UBound(oFlt.Criteria1)
                    sMsg = sMsg & "'" & oFlt.Criteria1(x) & "'"
                Next x
            Else
                sMsg = sMsg & vbCrLf & sField & "'" & oFlt.Criteria1 & "'"
            End If
 
            ' Verifica se há operador aplicado. Caso positivo, analisa o critério seguinte
            Select Case oFlt.Operator
                Case xlAnd
                    sMsg = sMsg & " E " & sField & "'" & oFlt.Criteria2 & "'"
                Case xlOr
                    sMsg = sMsg & " Ou " & sField & "'" & oFlt.Criteria2 & "'"
                Case xlBottom10Items
                    sMsg = sMsg & " (últimos 10 itens)"
                Case xlBottom10Percent
                    sMsg = sMsg & " (últimos 10%)"
                Case xlTop10Items
                    sMsg = sMsg & " (primeiros 10 itens)"
                Case xlTop10Percent
                    sMsg = sMsg & " (primeiros 10%)"
            End Select
        End If
 
    Next i
 
    If sMsg = "" Then
        ' Mensagem vazia, signifca que não há filtros aplicados
        sMsg = "Não há filtros ativados"
        Else
        ' Do contrário, monta a mensagem
        sMsg = "Filtros aplicados: " & Left(sMsg, Len(sMsg) - 1)
    End If
 
trataerro:
    If Err.Description <> "" Then
        Debug.Print Err.Description
        GetAutoFilterCriteria = "Não foi possível analisar os filtros"
    Else
        ' Display the message
        GetAutoFilterCriteria = sMsg
    End If
End Function

A função não é infalível, mas funcionou muito bem nos casos em que testei. A planilha abaixo mostra a função em trabalhando:

AutoFiltro Trabalhando

AutoFilterMode.zip
VBA – Obtendo os valores dos filtros aplicados numa planilha(20.19 KiB

Link da macro original: http://www.vbaexpress.com/forum/archive/index.php/t-7564.html

Vídeo – Como reiniciar o menu iniciar no Windows 10

Salve pessoal! O problem descrito no vídeo aconteceu comigo recentemente. Achei uma solução viável e compartilho ela com vocês agora!

Espero que gostem!

Aproveite para se inscrever no canal e receber as atualizações e novos vídeos!

https://www.youtube.com/user/Tomamais/

Link da dica original:
http://www.howtogeek.com/198815/use-this-secret-trick-to-close-and-restart-explorer.exe-in-windows/

Vídeo – Formulário de Cadastro Automático com o Code VBA Builder


Encontrei esse recurso hoje, mesmo tendo usado o Code VBA tem muito tempo! É praticamente um construtor automático de formulários. Sei que não é 100%, mas só pelo código criado, contando com validação e tipos de controle, é mais de meio caminho andado. Vale muito a pena conhecer o recurso, até porque, é gratuito!

Site oficial do Code VBA
http://codevba.com/

Tutorial oficial do Userform Builder
http://codevba.com/help/userformbuilder.htm#.Vqey3VMrLdQ