Arquivo da categoria: VBA

Dicas, modelos, exemplos da ferramenta que faz a grande diferença a suíte Microsoft Office

Controle de Horas no Excel

O Modelo Controle de Horas é um modelo para ser utilizado juntamente com o MS-Excel XP ou 2003. Este produto foi desenvolvido utilizando-se o MS-Visual Basic for Applications (VBA), a linguagem de programação do MS-Excel, com a finalidade de facilitar o controle das horas trabalhadas, de uma maneira rápida e simples.

Para instalar este download:

  • Convém imprimir esta página para usar como referência quando você estiver off-line.
  • Faça o download dos arquivos, clicando em Fazer download na parte esquerda desta página.
  • Crie as sequintes pastas:
    c:\Modelos Excel\Controle de Horas\
  • Clique duas vezes no arquivo controlehoras.zip no disco rígido para descompactar o arquivo nessa pasta.

Instruções de uso:

  1. Inicie o MS-Excel
  2. Abra o arquivo Modelo Controle de Horas.xlt

Detalhes

Autor
Mondial Informática

Funciona com
MS-Excel XP / 2003

Nome do arquivo
controlehoras.zip

Tamanho do arquivo
352 kbytes

Última atualização
12 de outubro de 2003

Suporte a idiomas
Português (Brasil)

Fazer Download

Os cuidados em utilizar a instrução GoTo

Sabemos que instrução GoTo do VBA proporciona uma forma de desviar o fluxo execução de uma função para qualquer linha dentro desta.

Apesar de considerar um recurso útil, as boas práticas de programação condenam o uso deste tipo de instrução. É estranho existir a motivação para a não utilização de um recurso, sendo que por algum motivo ele existe, porém, os argumentos para o caso do GoTo são justificáveis.

Vamos assumir que precisássemos construir um algoritmo (entenda algoritmo como uma sequência de passos definidos para executar uma determinada tarefa) para resolver um problema. A sequência correta de passos para construção deste, seguiria uma estrutura sequêncial bem definida, capaz de ser representada por um fluxograma, por exemplo:




O fato de poder ser representada por um fluxograma, significa que não existe ambiguidade em sua estrutura. Todos os passos para execução das tarefas e tomadas de decisão estão bem definidas, detalhadas e cobrem todas as possibilidades dentro de seu contexto.

Dentro do VBA, as instruções de controle de fluxo como If…Then…Else, While…Wend, For…Next e outras, seguem uma estrutura bem definidas, tendo começo, meio e fim bem localizados em suas definições e utilização. Em todas estas, todos os desvios são previstos e controlados pelo programador. Todos os testes são explícitos baseadas nas condições colocadas. Não há ambiguidade em seu funcionamento.

Neste ponto, a própria definição do GoTo nos leva a pensar:

“É um desvio incondicional para uma linha especificada dentro de uma função VBA.”

A palavra incondicional foi evidenciada propositalmente. Um desvio incondicional de código significa que, sem qualquer critério, condição ou mesmo teste, a instrução GoTo efetua o devio da execução do código para outra linha.

Supondo que a instrução GoTo seja utilizada em uma parte do código em que uma variável estiver com um valor inválido, um valor não esperado ou mesmo não tenha nenhum valor configurado, isso trará problemas para a execução do código, podendo gerar erros. Pior ainda, o código pode até não gerar um erro, mas pode executar suas funções com valores indesejados, levando a resultados desastrosos. Não há teste ou condição que avalie este desvio de execução.

O programador pode em alguns casos fazer as verificações necessárias para evitar algumas inconsitências, porém, a lógica de seu algoritmo será completamente quebrada por conta da não condicionalidade do desvio do GoTo. A situação é mais complicada quando o GoTo devia o fluxo de execução para uma linha anterior a qual ele é invocado.

Um teste simples para verificar o “estrago” que o uso indiscriminado do GoTo é tentar construir um fluxograma simples de sua função com sua sequência de execução.

A única excessão do bom uso do GoTo é para o tratamento de erros utilizando a estrutura On Error GoTo, como pode ser visto neste link.

Recomendações

Como o VBA oferece estruturas de controle de fluxo bem definidas e organizadas, tanto voltadas a lógica simples de teste como também de repetição de coleções (For…Each), é aconselhável sempre utilizar estas estruturas na construção de códigos. Raras serão as excessões em que o uso do GoTo torna-se indispensável. Caso esta situação ocorra, utilize-o com critério, certificando que em nenhuma situação o desvio causado pode afetar o funcionamento de seu algoritmo.

A idéia não é impedir ou condenar o uso do GoTo, até porque, se não fosse útil ele sequer existiria. O principal objetivo deste texto é alertar para os cuidados que devem ser tomados com o uso desta instrução, de forma a manter o controle de seu aplicativo e facilitar, ou até mesmo possibilitar futuras manutenções.

Impedir Copiar / Colar no Excel com VBA

Não é raro ver essa necessidade em fóruns de Excel que frequento. Por isso, coloco abaixo uma possível solução.

O código abaixo impede via VBA que o usuário utilize a funcionalidades Copiar e Colar no Microsoft Excel. De quebra, ainda desabilita os botões copiar, e recortar das barras de ferramenta padrão do Excel.

Especificamente, o código trata os principal evento de navegação entre células, desativando o contexto CutCopyMode, o que faz com que a marcação do copiar e consequentemente a opção de colar do usuário. Para não atrapalhar o funcionamento de outras planilhas, o código trata também os eventos Workbook_Activate e Workbook_Deactivate, reativando o contexto e os botões das operações em questão.

Todo o código deve ser colocado no módulo EstaPasta_de_Trabalho no VBA (ThisWorkbook em inglês).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Private Sub Workbook_Activate()
Dim oCtrl As Office.CommandBarControl
 
'Desabilita todos os comandos de Recortar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=21)
            oCtrl.Enabled = False
     Next oCtrl
 
'Desabilita todos os comandos de Copiar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = False
     Next oCtrl
 
        Application.CellDragAndDrop = False
 
End Sub
 
Private Sub Workbook_Deactivate()
Dim oCtrl As Office.CommandBarControl
 
'Habilita todos os comandos de Recortar
 
     For Each oCtrl In Application.CommandBars.FindControls(ID:=21)
            oCtrl.Enabled = True
     Next oCtrl
 
'Desabilita todos os comandos de Copiar
     For Each oCtrl In Application.CommandBars.FindControls(ID:=19)
            oCtrl.Enabled = True
     Next oCtrl
 
        Application.CellDragAndDrop = True
 
End Sub
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    With Application
        .CellDragAndDrop = False
        .CutCopyMode = False 'limpa a área de transferência
    End With
End Sub

Nem preciso dizer que é preciso ativar as macros para a que o código funcione. Também não preciso lembrar que não ha como ativar as macros automaticamente, a não ser que utilize o recursos de certificados digitais do Office.

Abraços

Tomás Vásquez
http://www.tomasvasquez.com.br

Mais sobre FileSystemObject

Outro dia publiquei uma dica sobre como obter informações de um Drive com a bilbioteca FileSystemObject com o VBA.

Porém, gostaria de reforçar que a bilbioteca vai muito além disso, passando por tratamento de arquivos, pastas e suas propriedades.

Um artigo completo sobre o assunto pode ser visto neste link:

http://www.macoratti.net/filesyst.htm

Mais uma obra do mestre Macoratti.

Abraços

Tomás Vásquez
http://www.tomasvasquez.com.br