Todos os posts de Tomás Vásquez

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.

LETRIS 2.0

O pessoal do Ócio anda mesmo caprinhando…

2008_06_04_letris.jpg

O Letris, um dos jogos mais baixados e mais interessantes do Ócio, merecia uma turbinada: o Letris 2.0. Para começar a falar nas mudanças, o dicionário. Além de, a exemplo do Montando Palavras, acrescentarmos os verbos no infinitivo, também retiramos os acentos. Sei que a língua portuguesa sofre um pouco com isso, mas em termos de jogabilidade ganha-se muito.

Se você, ao jogar o primeiro Letris, notou as peripécias que a macro fazia a cada letra, deve ter notado uma significativa diferença. Para a macro checar se existia palavras formadas, as células eram selecionadas por linha e coluna e checadas contra o dicionário. Essa checagem obviamente continua ocorrendo, mas de forma diferente. O comando utilizado anteriormente era o Range e o Select, ou seja, selecionava-se uma célula na macro e depois extraía-se o texto de dentro dela. Por exemplo:

Range(“A3”).Select
Selection.Text

Com uma simples substituição, a macro ficou muito mais rápida e eficiente:

Cells(3,1).Text

Com o comando Cells, pula-se a etapa de selecionar, o que fica mais rápido e o usuário não tem que ficar assistindo várias células serem selecionadas sem entender nada do que está acontecendo. No exemplo, o número 3 corresponde à linha e o 1, à coluna (coluna A).

Além da correção de alguns “bugs”, mudamos também a probabilidade de letras mais ou menos utilizadas caírem. A letra “a”, obviamente, tem que cair bem mais do que a letra “w”, não?

Abraços

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

Auto-Completar somente dias úteis no Excel

O recurso autocompletar o Excel auxiliar bastante quando queremos preencher automaticamente sequências de números, valores e principalmente datas. Porém, uma necessidade muito comum é preencher ou idenficar somente os dias úteis, excluindo sábados e domingos. Para fazer isso usando o autocompletar, faça o seguinte:

  • Na primeira célula (A1, por exemplo) digite a data inicial (03/06/2008);
  • Na célula abaixo (A2) insira a fórmula: =A1+(MOD(A1;7)=6)*2+1;
  • Formate a célula para que a data apareça como deseja;
  • Clique na célula com a fórmula e, segurando o botão esquerdo do mouse sobre seu canto inferior direito, arraste-a até preencher toda a região desejada.

Abraços

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

Excel – Usando a notação L1C1

Essencialmente uma planilha é uma tabela, e não há modo mais simples do que fazer referência do que por coordenadas de linha e coluna.

O Excel disponibiliza duas formas referenciar as células que compõem uma planilha. São elas o A1 e o L1C1 (Linha X Coluna X) do inglês R1C1 (Row X Column X).

O padrão é a primeira, sendo que letras representar colunas e a linhas os números. É uma forma mais usual por se acostumar facilmente com ela. Mas como nem sempre é fácil traduzir letras em números (Do A ao Z é até simples, mas será fácil saber exatamente a coordenada da coluna CQ?), que geralmente utilizamos em fórmulas mais avançadas como PROCV, PROCH, ÍNDICE, entre outras.

A notação é muito utilizada na gravação de macros, pois prevê maneiras de referenciar células de forma relativa e absoluta.

Referência relativa

Como o próprio nome diz, é utilizada para identificar a uma coordenada a partir de outra. Por exemplo, se queremos saber onde está a linha 5 sendo que estamos na linha 2, a linha 5 está 3 coordenadas abaixo desta.

L[-1] corresponde ao preenchimento de uma linha inteira considerando uma linha acima da célula referenciada inicialmente.

L[1]C[3] referencia uma célula uma linha abaixo e três colunas à direita da célula referenciada inicialmente.

Referência absoluta

Identifica uma coordenada pelo seu valor real, partindo o zero.

L3C3 faz referência a uma célula na linha 3 e coluna 3.

C corresponde ao preenchimento da coluna atual.

Como ativar a notação L1C1 no Excel

Vá ao menu Opções->Ferramentas. Na janela que surgir, vá aba Geral e em Configurações, ative a opção Estilo de referência L1C1.

Opcoes L1C1

Clique OK para confirmar e veja uma célula já com a nova notação apresentada na caixa de nomes:

Resultado final

Importante: quando se configura o estilo de referência em uma pasta de trabalho, ela é carregada para outro computador. Caso a ative para auxiliar no desenvolvimento de fórmulas, lembre-se de voltar ao estilo original para não assustar o usuário.

Abraços

Tomás Vásquez