Embelezando sua fórmula no Excel

A internet é um lugar lindo, principalmente para quem busca coisas lindas.

Viagens a parte, o que significa embelezar sua fórmula no Excel? Não, ela não ficará mais bonita. Ela nem vai mudar, mas, vai ficar muito mais fácil de você entendê-la. Vamos pegar esse post recente deste honorável blog como cobaia. A fórmula do artigo é esta:

=SE(A2="";"";CONCAT(EXT.TEXTO(A2;1 + NÚM.CARACT(A2)-LIN(INDIRETO("1:" & NÚM.CARACT(A2)));1)))

É até simples, mas, e se ela fosse apresentada de outra forma?

=SE(
    A2 = "";
    "";
    CONCAT(
        EXT.TEXTO(
            A2;
            1 +
            NÚM.CARACT(
                A2
            ) -
            LIN(
                INDIRETO(
                    "1:" &
                    NÚM.CARACT(
                        A2
                    )
                )
            );
            1
        )
    )
)

Não sei você, mas se você estiver procurando algum erro, ou querendo isolar um pedaço da fórmula, ou mesmo tentando entendê-la melhor, é muito mais simples se ela estiver formatada como acima. Quem faz esse mágica é o site Excel Formula Beautifier. Ele está disponível somente em inglês, mas deixa que você configure o separador de fórmulas para ser o “;” ou invés do “,” do Excel em inglês.

Veja como fica a fórmula deste artigo “embelezada”:

Tive que reduzir o zoom da página para caber
Tive que reduzir o zoom da página para caber

Muito além do Excel

Só de fazer o que faz e ser de graça, já vale a menção. Não bastasse tudo isso, ele converte fórmulas do Excel para expressões linguagens como o C#, Javascript ou Python. Veja o exemplo padrão do site convertido em C#:

Não é feitiçaria, é tecnologia!
Não é feitiçaria, é tecnologia!

Mais ainda, o código da página é aberta e está disponível no github!

Quer mais? A página do autor sobre o assunto lista uma série de projetos na mesma linha de avaliar fórmulas de modo a quebrá-la em partes para um melhor entendimento. Um que me chamou a atenção foi fórmula parser, escrito em C#, também disponível para download.  Veja como ele destrincha uma fórmula do Excel em partes:

Excel Formula Parsing, in C#
Excel Formula Parsing, in C#

Para terminar, lembro que neste vídeo que postei no canal lendo comentários, muitos me perguntaram como colaborar com a comunidade. Esse é um jeito.

Invente o seu!

O problema do VBA é o VBA, não a linguagem em si

Tirinha do XKCD
Tirinha do XKCD Transcrição da tirinha: 1 – Você bem pra cama? 2 – Agora não posso. Estou fazendo algo importante 3 – O que? 4 – Alguém na internet está enganado

Título chato não? Eu odeio clickbait e juro que não tentei fazer um. Só mantive porque logo logo fará sentido. Quanto a tirinha no topo do artigo, quase me senti assim ao escrever esse texto, mas é só para dar tom de brincadeira. E NÃO, não acho que o Bill Jelen esteja errado. Só acho que faltou um pouco de contexto. Então, penso nesse texto como um complemento, não como uma resposta.

A discussão é antiga, como tantas outras, mas foi realimentada por este artigo traduzido pelo colega Cristiano Galvão do site/blog/youtube Excel Turbo que vale muito a pena a leitura:

Quando Faz Sentido Usar o Option Explicit

Já leu? Se a resposta for não, volte lá e depois continue lendo este texto. Do contrário, fará pouco sentido.

O argumento é sobre o uso do Option Explicit no VBA. Ele força a declaração de variáveis no contexto do módulo de código. A ausência de declaração fará o programa gerar um erro antes mesmo de executar, o conhecido erro de compilação, algo que os programadores VBA estão pouco acostumados, infelizmente. O autor explica porque antes era contra e porque depois se tornou a favor.

Antes de seguir, um pouco de contexto. Minha principal linguagem de programação no dia a dia é o C#. Ele é por natureza fortemente tipado, ou seja, qualquer coisa que for colocada em memória precisa ser previamente declarada e ter seu tipo definido. Qualquer atribuição indevida causará um erro de compilação. Não declarar variável então…

É natural assumir que, por muito tempo argumentei que linguagens de tipagem forte eram “a coisa correta a se usar”. Qualquer coisa que não isso era demonizada. PHP era o patinho feio da vez e o ASP então. C#, Java e Delphi eram as bolas da vez. As IDEs ficavam cada vez mais ricas e baratas (Eclipse e NetBeans principalmente). Vamos tipar tudo e dar adeus aos problemas de compilação. Deu certo, por um tempo.

Não demorou muito e o mercado, principalmente o web, foi dominado por linguagens como o Ruby, Python, o PHP voltou à tona e o Javascript deu as caras pra valer. O que elas têm em comum? Sim, elas não são linguagens de tipagem forte. Ainda que algumas exijam que você defina uma variável, o tipo dela tanto faz. Ruby e Python, amado por quase todos os programadores que conheço, nem isso. E hoje, algumas delas pagam mais do que as citadas anteriormente, as de tipo de forte tão bravamente defendidas pela turma do Ctrl+Shift+B.

Ok, mas e o VBA?

O que mudou tanto e o que isso tem a ver com o VBA? A partir daqui este texto é de total opinião minha.

O que mudou de lá pra cá que afetou isso foram duas coisas:

  • As IDEs
  • Os frameworks de teste

As IDEs, ou melhor, as ferramentas de codificação evoluiram em níveis absurdos. O que antes só uma ferramenta muito bem paga te dava (Visual Studio, Delphi, JBuilder, FoxPro, [sem links, por favor]) hoje editores de texto quase gratuitos como o Sublime Text, Atom e Visual Studio Code com alguns plugins fazem muito melhor. Mesmo o Visual Studio .NET tem uma versão community gratuita com 100% do poder de fogo de codificação. As versão PRO e acima te dão mais ferramentas de depuração, portanto, não contam.

O que isso muda? Simples. Com algum tempo de experiência, é muito, muito difícil você errar algo porque o editor auto completa no digitar da primeira letra do que seja lá o que você for chamar, variável, método, namespace, módulo, etc. Fora os snippets. Se você teve a chance de usar o Visual Studio codificando em VB.NET, terá a grata surpresa de nunca mais esquecer um bloco If sem um End If, ou um Select sem End Select, ou um With sem End With. O editor estará lá, autocompletando tudo, salvando os calos dos seus dedos e horas de tendinite. E sim caro leitor, o VBA não tem isso.

E os frameworks de teste? Bom, isso passa longe do mundo do VBA, a não ser que você seja um super ultra mega progressista da linguagem e coma RubberDuck com farinha.

O que esses frameworks lhe dão, antes mesmo de uma nova forma de pensar no seu código, é a garantia de que seu ele fará o que tem que fazer, sem dar erros. Claro que a qualidade do teste está relacionada ao bom resultado disso, mas a priori, você está circundando seu código com uma camada de software que pode ser automatizada e que vai garantir que seu código funcione como esperado. E, para esse mecanismo, tanto faz você declarar variáveis ou se sua linguagem tem tipagem forte.

A tipagem forte perdeu valor. De nada vale seu código compilar se ele não faz o que precisa, sem errar. Um sistema feito em Perl (aquela coisa horrorosa) ou no amado Python, ambas não tipadas, vale muito mais do que qualquer código C, C++, C# ou Java, naturalmente tipadas.

Em resumo, tudo ficou mais esperto e automatizado. E o VBA não acompanhou isso.

E o Option Explicit?

A resposta é, você é decide. Eu não uso.  E só o digo porque não lembro a última vez que o ativei, memos ainda um dia em que não usá-lo causou-me algum problema. Acaba então sendo uma questão de gosto.

O que quero deixar claro aqui é, se você não gosta de usar o Option Explicit, vá em frente. Só não ache que você é infalível o suficiente para não precisar dele. Se você gosta, vá em frente. Só não ache que ele vai salvar sua vida em todas as situações só por estar lá.

Excel – Gerando GUIDs sem VBA

Sim, é possível!

Para você que nunca ouviu falar, um GUID (se já sabe ou não quer saber, vá para o final do artigo) ou Identificador Universal Único (do inglês Global Unique IDentifier) é uma valor de 128 bits representado por uma cadeia de texto de caracteres alfa numéricos. Mas pra que isso?

Há varias razões para você querer um identificador desse tipo. Lhe darei estas:

  • Um identificador único dentro de um contexto ou universo que seja difícil de repetir
  • Um identificador que seja difícil de memorizar
  • Um identificador que em nada se relacione com o que ele está identificando

Poderia citar outras. O fato é que uma hora ou outra, ele se tornará interessante para você algum dia. Então, porque não gerá-lo no Excel? Sim, é possível. A fórmula não é simples, mas você não precisa dominá-la, só saber que existe e fazer proveito:

=CONCATENAR(DECAHEX(ALEATÓRIOENTRE(0;4294967295);8);"-";DECAHEX(ALEATÓRIOENTRE(0;42949);4);"-";DECAHEX(ALEATÓRIOENTRE(0;42949);4);"-";DECAHEX(ALEATÓRIOENTRE(0;42949);4);"-";DECAHEX(ALEATÓRIOENTRE(0;4294967295);8);DECAHEX(ALEATÓRIOENTRE(0;42949);4))

É bem isso mesmo, mas funciona! É claro que não tirei isso do nada. Este post no stackoverflow dá a dica. E mais, coloca a fórmula em vários outros idiomas!

Em inglês:

=CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,42949),4),"-",DEC2HEX(RANDBETWEEN(0,42949),4),"-",DEC2HEX(RANDBETWEEN(0,42949),4),"-",DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,42949),4))

Em espanhol:

=CONCATENAR(
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(16384,20479),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(32768,49151),4),"-",
DEC.A.HEX(ALEATORIO.ENTRE(0,65535),4),
DEC.A.HEX(ALEATORIO.ENTRE(0,4294967295),8)
)

Em francês:

=CONCATENER(
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;42949);4);"-";
DECHEX(ALEA.ENTRE.BORNES(0;4294967295);8);
DECHEX(ALEA.ENTRE.BORNES(0;42949);4))

Em alemão (feio demais, eu sei):

=KLEIN(VERKETTEN(DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);"-";DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));4);"-";"4";DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";DEZINHEX(ZUFALLSBEREICH(8;11));DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;3));3);"-";DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;8));8);DEZINHEX(ZUFALLSBEREICH(0;POTENZ(16;4));

Em holandês:

=KLEINE.LETTERS(TEKST.SAMENVOEGEN(DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);"-";DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4);"-";"4";DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";DEC.N.HEX(ASELECTTUSSEN(8;11));DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;3));3);"-";DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;8));8);DEC.N.HEX(ASELECTTUSSEN(0;MACHT(16;4));4)))

Ufa! Se precisar da fórmula em mais algum idioma, bem… se vira aí!

😉