Bug ao colar a validação no VBA - dicas do Excel

Índice

Se você leu os primeiros capítulos de VBA e Macros para Microsoft Excel, sabe que reclamo que o gravador de macro do Excel não faz o melhor trabalho de gravação de código utilizável. Normalmente, o código funciona bem, mas é gravado de forma que pode não ser útil para conjuntos de dados de tamanhos diferentes. O código pode funcionar bem hoje, mas não amanhã.

Encontrei um problema muito estranho em que o gravador de macro gravou um código que não funcionou. Eu estava escrevendo uma macro que tentava copiar a validação de uma célula para um intervalo de células. No Excel 2002, esse código era o seguinte:

Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation

Este código funcionou bem no Excel 2002, mas falhou na máquina de um cliente com Excel 2000. Um dos computadores antigos do escritório ainda tem o Excel 2000, então tentei o código lá. O problema era com o xlPasteValidation. Sempre que encontro algo incomum, eu inicio o gravador de macro para ver como ele gravaria o código. Configurei a validação no E5, liguei o gravador de macro, copiei o E5 e usei Colar Especial - Validação. Depois de parar o gravador de macro, observei que o Excel 2000 registrou a constante como:

Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation

Então, fui para o aplicativo cliente, alterei o código para xlDataValidation e executei novamente. Estranhamente, produziu o mesmo erro!

Acontece que o gravador de macro do Excel 2000 realmente tem um bug. Ele gravará a constante xlDataValidation, mas o interpretador de macro não reconhecerá xlDataValidation nem xlPasteValidation. A Ajuda do Excel VBA no Excel 2000 finge que não há como colar apenas as validações.

Para fazer isso funcionar, você precisa descobrir o valor subjacente de xlPasteValidation. Na minha máquina XL2002, fui ao Editor VBA. Digite Ctrl + G para abrir a janela imediata e digite isto no painel imediato:

Print xlPasteValidation

Pressione Enter e o Excel 2002 dirá que xlPasteValidation é uma maneira amigável de dizer “6”. De volta à máquina Excel 2000, tentei este código:

Range(“E6:E12”).PasteSpecial Paste:=6

Felizmente, funciona. Na verdade, você é forçado a usar o valor subjacente em vez da constante. Alerto contra essa prática no livro, pois torna o programa realmente difícil de ler para a próxima pessoa que olhar o código. Nesse caso específico, você realmente não tem escolha. Adicione um comentário explicando por que você o codificou desta forma:

‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6

Portanto - a pequena lição de hoje é o problema muito específico de como colar validação especial no Excel 2000, mas a maior lição é o trabalho de detetive necessário para descobrir o que está acontecendo quando algo estranho acontece no Excel VBA.

Artigos interessantes...