Tag Archives: Macros

VBA – Agendando a execução de macros com a função OnTime

Introdução

Uma necessidade muito comum em aplicativos é utilizar critérios de tempo para execução de algumas rotinas. Esta é uma tarefa trivial em várias linguagens, mas poucos pensam em utilizá-la no VBA por achar muito complexo, tendo que envolver chamadas de API e outros recursos mais avançados da linguagem

Porém, o VBA do Microsoft Excel disponibiliza um método que facilita esse tipo de trabalho, o método OnTime().

O que é

O método OnTime programa um procedimento para ser executado em um momento especificado no futuro (seja em uma determinada hora do dia ou após uma quantidade específica de tempo decorrido).

A estrutura de chamada à função OnTime se faz da seguinte forma:

Application.OnTime([EarliestTime], [Procedure], [LatestTime], [Schedule])

Argumentos da função:

EarliestTime

Variant necessário. Especifica quando você deseja que esse procedimento seja executado.

Procedure

String necessário. O nome do procedimento a ser executado.

LatestTime

Variant opcional. Especifica até quando o procedimento pode ser executado. Por exemplo, se LatestTime estiver definido como EarliestTime + 30 e o Microsoft Excel não estiver em modo Pronto, Copiar, Recortar ou Localizar em EarliestTime devido a um outro procedimento estar sendo executado, o Microsoft Excel esperará 30 segundos para que o primeiro procedimento termine. Se o Microsoft Excel não estiver em modo Pronto dentro de 30 segundos, o procedimento não será executado. Se esse argumento for omitido, o Microsoft Excel esperará até que o procedimento possa ser executado.

Schedule

Variant opcional. True para programar um novo procedimento OnTime. False para limpar um procedimento definido anteriormente. O valor padrão é True.

Exemplo

Para informar ao VBA um valor de data válido para execução do método OnTime, usa-se a propriedade Now do VBA juntamente com a função TimeValue( . Somando as duas, é possível programar o procedimento para ser executado quando uma quantidade de tempo específica (contando a partir de agora) tiver decorrido.

Caso seja necessário informar uma hora específica, por exemplo, 3 da tarde (ou 15:00), usa-se TimeValue(time) onde time é um valor de hora informado através de uma String.

Veja os exemplos de código abaixo:

Public Sub ExecutaOnTime()
MsgBox "Opa! Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(Now +
TimeValue("00:00:10"), "ExecutaOnTime")
End Sub

Execute a função TesteOnTime, deixando o cursor do mouse sobre ele (linha 5 a 6) e clicando em F5. Se tudo der certo, em 10 segundos você deverá ver esta mensagem:

Pronto! Conforme configuramos o OnTime para executar 10 segundos após a hora atual (linha 6) pois, Now retorna a data e hora atual e TimeValue(“00:00:10”) representa para o VBA 10 segundos, após executar a função TesteOnTime, ela programa a função ExecutaOnTime (linha 1) para ser executada neste tempo.

Para efeitos de teste, configure outros valores de tempo, mas tome o cuidado que sejam pequenos pois, se configurar para executar daqui a 24 horas (“24:00:00”), vai ter que esperar um bom tempo.

Para fazer outro teste interessante do OnTime, mude o código para ficar desta forma:

Public Sub ExecutaOnTime()
MsgBox "Opa!
Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(TimeValue("13:00:00"),
"ExecutaOnTime")
End Sub

Da forma que está, o código irá configurar a função ExecutaOnTime (linha 1) para ser executada às na próxima 13:00 do computador em que está sendo executada. Como este é apenas um exemplo, configure uma hora que estiver mais próxima para não esperar muito.

É possível também cancelar a execução de uma macro agendada com o OnTime. O exemplo de código abaixo cancela a definição de OnTime do exemplo anterior, ou seja, caso a execução da função ExecutaOnTime estiver agendada, executar a função CancelaOnTime fará com que esta programação seja cancelada. isso é feito passando o valor False para o parâmetro Schedule (linha 10):

Public Sub</span> ExecutaOnTime()
MsgBox "Opa! Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(TimeValue("13:00:00"),
"ExecutaOnTime")
End Sub
Public Sub</span> CancelaOnTime()
Call Application.OnTime(EarliestTime:=TimeValue("13:00:00"),
Procedure:="ExecutaOnTime", Schedule:=False)
End Sub

Conclusão

Com este recurso em mãos, é possível atender a algumas necessidades que no contexto do Excel pareciam inviáveis. Um exemplo típico é uma tela de apresentação ou SplashScreen como é conhecida que apresenta o programa e fecha em alguns segundos. Este é um bom teste para experimentar o uso do OnTime. Fica aí um desafio.

VBA – Auto executando macros ao abrir arquivos do Office

É uma necessidade básica para quem está começando a programar em VBA.

Depois da criação das primeiras macros e formulários, é preciso alguma forma de executá-los sem precisar ir direto ao VBA ou simplesmente acionando o menu de macros.

Os caminhos mais tradicionais são:

  • Associar a execução de uma macro a um botão de comando ou outro componente qualquer
  • Colocar a execução de determinada macro na abertura do arquivo

Vamos tratar aqui da segundo item.

Usando o Auto_Open

Existe uma forma geral de executar esta tarefa no VBA, idenpendente de qual seja o aplicativo hospedeiro. Basta dar ao nome da macro, ou seja, o cabeçalho da função como Auto_Open.

Suponha a macro abaixo:

1
2
3
Public Sub MostraMensagem()
    MsgBox "Seja bem vindo"
End Sub

Clicar em F5 para testar o código. O resultado deve ser uma caixa de mensagem com a mensagem “Seja bem vindo”. Para mostrar esta macro na abrir um arquivo, bastaria que esta fosse renomeada para Auto_Open ao invés do nome original. Para não estragar o código, poderíamos criar uma macro de nome Auto_Open que chama a nossa macro, por exemplo:

1
2
3
Public Sub Auto_Open()
    Call MostraMensagem
End Sub

O único requisito para o funcionamento desta macro é que ela não tenha parâmetros, podendo ser um Function ou Sub e ser chamada após esta execução.

Mapeando o evento de abertura do arquivo

Este é outro método também largamente utilizado. Praticamente todos os aplicativos dotados do VBA possuem um evento que representa a abertura de um arquivo. Abaixo segue alguns exemplos do Microsoft Office:

Aplicativo Evento
Excel Workbook_Open
Word Document_Open

Alguns aplicativos são excessão, como o PowerPoint que suporta somente eventos em nível de Aplicativo, assunto não abordado aqui.

Como exemplo, usarei o Excel para mapear o evento Workbook_Open.

  • Abra o Excel
  • Acione o VBA em Ferramentas->Macro->VBA ou simplesmente Alt+F11
  • Na janela de projeto, procure o item EstaPasta_de_trabalho
  • Clique duas vezes para abrir a tela de código
  • Na caixa de listagem à esquerda superior da tela de código, selecione o item Workbook
  • Caso nada aconteça, selecio a caixa de listagem à direto superior da tela de código e selecione o item Opem
  • Isso fará com que o evento Workbook_Open seja criado automaticamente

O código gerado é parecido com este:

1
2
Public Sub Workbook_Open()
End Sub

Qualquer código colocado dentro deste procedimento será executado na abertura da pasta de trabalho.

Conclusão

Como no VBA não existe um contexto de aplicativo, onde existe um método principal de início de execução, estas rotinas auxiliam bastante quando profissionalizamos programas feitos nesta linguagem.

Bom proveito!

Excel VBA – Delete duplicate rows

The macro below deletes rows with repeated values based on selected column. It’s almost the same as filter default option in Microsoft Excel, but using VBA Code. Copy and Paste the code in a new VBA Module. Fill a worksheet with some sample data, of course, with repeated values. Now, type Alt+F8 to activate and run the macro to see the result.

Public Sub ExcluirLinhasDuplicadas()
 
    Dim Col As Integer
    Dim r As Long
    Dim C As Range
    Dim N As Long
    Dim V As Variant
    Dim Rng As Range
 
    On Error GoTo EndMacro
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
 
    Col = ActiveCell.Column
 
    If Selection.Rows.Count > 1 Then
        Set Rng = Selection
    Else
        Set Rng = ActiveSheet.UsedRange.Rows
    End If
 
    N = 0
    For r = Rng.Rows.Count To 1 Step -1
        V = Rng.Cells(r, 1).Value
        If Application.WorksheetFunction.CountIf(Rng.Columns(1), V) > 1 Then
            Rng.Rows(r).EntireRow.Delete
            N = N + 1
        End If
    Next r
 
EndMacro:
 
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
 
End Sub

Source:http://vbamacros.blogspot.com/

VBA – Criando Macros Simples e Úteis

O Microsoft Excel possibilita a automação de tarefas através de macros. Isso não é novidade.

Quando o assunto é automatizar tarefas repetitivas ou um conjunto de tarefas, as macros resolvem o problema. Por isso, é sempre bom ter em mãos algumas macros prontas que geralmente facilitam nosso trabalho em diversas situações. Neste artigo, a idéia é demonstrar algumas que tentam resolver algumas dessas situações.

Zoom-In, Zoom-Out automatizado.

No Excel 2003, trocar o zoom da planilha nem sempre é a tarefa mais cômoda de se fazer. O único atalho disponível depende do mouse com o botão de scroll com a tecla Ctrl pressionada. Criaremos então duas macros. Uma que incrementa o zoom em 10% e outra que o diminui na mesma quantidade. Vamos aproveitar inclusive uma outra macro para configurar o zoom para seu valor padrão que é 100%.

Veja o código abaixo:

Public Sub ZoomIn()
    Dim maisZoom As Long
    maisZoom = ActiveWindow.Zoom
    maisZoom = maisZoom + 10
 
    If maisZoom &lt;= 400 Then         ActiveWindow.Zoom = maisZoom     End If End Sub Public Sub ZoomOut()     Dim menosZoom As Long     menosZoom = ActiveWindow.Zoom     menosZoom = menosZoom - 10     If menosZoom &gt;= 10 Then
        ActiveWindow.Zoom = menosZoom
    End If
End Sub
 
Public Sub ZoomPadrao()
    ActiveWindow.Zoom = 100
End Sub

Observação: Adicionalmente nas macros ZoomIn e ZoomOut, foram adicionadas verificações no valor que é atribuido à propriedade ActivateWindow.Zoom que reflete o Zoom da planilha, já que esse valor não pode ser menor que 10 ou maior que 400. Atribuir qualquer valor que estrapole estes limites geraria um erro na execução da Macro.

Para efetuar um teste idôneo, retorne ao Microsoft Excel e execute estas macros, clicando em Ferramentas->Macro->Macros ou clicando o atalho Alt+F8. A seguinte tela surgirá:

Selecione a macro ZooIn e clique no botão executar. Veja que o zoom da planilha foi aumentado em 10%. Execute-a novamente para confirmar o resultado.

Tente executar o mesmo procedimento, só que agora selecionando a macro ZoomOut.

Para terminar, termine executando a macro ZoomPadrao e verfique se o Zoom da planilha é colocado par ao valor 100%.
Com certeza toda essa operação ficaria mais fácil se não fosse necessário percorrer tantos passos, ou seja, abrir a caixa de diálogo de Macros, selecionar a Macro e logo em seguida clicar no botão executar. Felizmente, o Excel permite que você associe teclas de atallho para acelerar a execução de suas Macros. Para associar uma Macro a uma atalho, abra a caixa de diálogo de Macros (Alt+F8), selecione a Macro ZoomIn e logo em seguida clique no botão Opções para que a seguinte janela seja mostrada.

Essa tela permite que seja inserida uma combinação de teclas, obrigatóriamente iniciada pela tecla Ctrl para ser associada a execução de suas macros. Isso significa que com apenas uma combinação de teclas será possível invocar a execução de uma determinada Macro. Para efetuarmos um teste, nesta tela, com o cursor do mouse sobre a caixa de texto logo após o “Ctrl+” mantenha a tecla Shift pressionada e sem soltá-la, pressione a tecla M. O resultado deve ser parecido com a figura abaixo:

É aconselhável utilizar atalhos que sejam diferentes daquela já existentes no Excel como Ctrl+P ou Ctrl+A. pois estes serão substituídos por estes novos.

Foi adicionada também uma descrição para fazer referência ao funcionamento da Macro ZoomIn. Clique em OK para voltar à caixa de diálogo de Macros nela, clique no botão fechar.

Com a janela do Microsoft Excel ativa, pressione o atalho Ctrl+Shift+M (para facilitar, mantenha pressionada as teclas Ctrl e Shift e aperte a tecla M sem soltar as duas anteriores) e confira o funcionamento da Macro. Para efetuar o mesmo procedimento para as outras Macros, adicione os atalhos Ctrl+Shift+N para a Macro ZoomOut Ctrl+Shift+P para a Macro ZoomPadrao.

O video para download disponível nesta página apresenta claramente a execução das macros através deste atalho.

Conclusão

Esta é apenas uma amostra do que pode ser feito para tornar algumas tarefas bem úteis bem fáceis de serem acessadas. Alguns exemplos comuns são uma macro para Salvar e Fechar automaticamente uma planilha, ou para importar dados de um arquivo, entre outras.

Com estes recursos em mãos, a criatividade é o limite.

Tomás Vásquez

http://www.tomasvasquez.com.br

Public Sub ZoomIn()
Dim maisZoom As Long
maisZoom = ActiveWindow.Zoom
maisZoom = maisZoom + 10

If maisZoom <= 400 Then
ActiveWindow.Zoom = maisZoom
End If
End Sub


Public Sub ZoomOut()
Dim menosZoom As Long
menosZoom = ActiveWindow.Zoom
menosZoom = menosZoom – 10

If menosZoom >= 10 Then
ActiveWindow.Zoom = menosZoom
End If
End Sub


Public Sub ZoomPadrao()
ActiveWindow.Zoom = 100
End Sub