Baixe o app para aproveitar ainda mais
Prévia do material em texto
Herbert Kimura, Jim Heiji Aburaya, Vinicius Amorim Sobreiro e Leonardo Fernando Cruz Basso VBA Excel para Finanças: Edição para Iniciantes Prefácio Este livro tem por objetivo possibilitar que o usuário iniciante em programação VBA possa rapidamente desenvolver aplicações na área de finanças. A partir de exemplos que podem ser compreendidos facilmente, o livro permite um aprendizado bastante direto, auxiliando o leitor a elaborar seus próprios algoritmos. A obra não pretende atender às necessidades do usuário mais experiente, que já tenha noções de macro no Excel. Em um contexto pragmático, o livro traz uma abordagem prática, sem se preocupar com um rigor da sintaxe da linguagem de programação, propiciando um direcionamento para que o leitor possa rapidamente desenvolver suas próprias funções. VBA é o acrônimo de Visual Basic for Applications. O VBA é a linguagem de programação disponível no pacote Office da Microsoft® que permite ao usuário mais exigente a criação de rotinas e funções que automatizam ou diminuem sequências complicadas de operações. No Microsoft® Excel, o ambiente de programação orientada a objetos do VBA envolve uma linguagem de alto padrão e possibilita o acesso e a utilização dos recursos disponíveis no programa, como a biblioteca de fórmulas, a interação com a planilha de dados e o uso de soluções de outros usuários ou empresas. Para exemplificar o aprendizado da linguagem, ao longo deste livro, serão abordados temas relevantes em Finanças. Iniciaremos com implementações simples, que permitirão o entendimento gradativo da estrutura da linguagem e de aspectos computacionais importantes. Não se trata de uma obra que foca o entendimento das nuances da computação eletrônica, mas de uma aplicação prática da microinformática no auxílio de resolução de problemas do dia a dia em Finanças com a flexibilidade, velocidade e eficiência exigidas pelo profissional tomador de decisões pressionado pela dinâmica do mercado financeiro. Assim, abordaremos inicialmente conceitos básicos de finanças como, por exemplo, capitalização de juros, para ilustrar as primeiras aplicações de funções desenvolvidas no Excel. Posteriormente, discutiremos Modelo de Precificação de Ativos de Capital (CAPM), no qual será permitido um contato com o VBA de forma bastante simples obtendo o retorno esperado de um ativo em função de alguns parâmetros. Apresentaremos também o Modelo de Gordon para avaliação de ações para consolidar conhecimentos básicos e para exemplificar o uso de parâmetros opcionais. Na sequência, já demonstrando algumas estruturas de decisão utilizadas em programação, o cálculo do Valor Presente Líquido (VPL) será implementado em diversas versões. A cada código-fonte há uma discussão sobre o tratamento das informações e, quando necessário, apresenta-se o fluxograma de utilizado pelo algoritmo. A aplicação das funções criadas será abordada na forma de exemplos e com valores numéricos simulando uma situação financeira real. O modelo de Black-Scholes também será abordado, permitindo a ambientalização do uso de fórmulas inerentes do Microsoft® Excel. É também discutido no livro, conceitos como Value-at-Risk, DeltaVar, ComponentVar exemplificando o uso de matrizes de dados. Uma situação complexa que, utilizando todos os recursos que foram abordados nos capítulos anteriores, é discutida na obra para exemplificar o uso de programação para problemas de finanças mais sofisticados. Um capítulo extra foi adicionado com a utilização de simulação de Monte Carlo para análise de risco. É importante destacar que essa obra tem como foco desenvolvimento de funções, sem uma ênfase em sub-rotinas. Os autores acreditam quea a abordagem de programação de funções permite um entendimento mais rápido e mais sólido do VBA Excel. Contexto profissional Usuários mais avançados podem observar algumas limitações do Excel relacionados à performance computacional e à adequação das funções estatísticas presentes. Porém, para a maioria das aplicações em Finanças, o Excel propicia um ambiente poderoso e amigável para a elaboração de cálculos e geração de relatórios. Assim, tendo em vista que o Excel é uma ferramenta amplamente utilizada pelos analistas e administradores financeiros, abordamos uma nova perspectiva na sua utilização como ferramenta de modelagem. Aplicações que envolvem um número elevado de operações podem ser implementadas em outras linguagens de programação, como por exemplo, C, C++, Phyton ou R, que permitem controle sobre a utilização da memória do computador e a otimização do processamento matemático. Estas rotinas podem ser encapsuladas em bibliotecas de funções e eventualmente acessadas pelo Excel. No entanto, o custo de desenvolvimento de programas em um ambiente externo à plataforma do Excel pode ser elevado, não somente em termos de capacitação técnica no desenvolvimento como também em termos de auditoria, controle de qualidade e manutenção e atualização das rotinas. Em geral, é mais fácil encontrar profissionais de Finanças que entendam de Excel do que de outras linguagens de programação. Assim, uma forma de aprimorar tanto os aspectos computacionais quanto os de design de planilhas envolve a programação em VBA Excel. Embora o uso do VBA exija a adaptação do mecanismo de cálculo para um algoritmo computacional, ou seja, para a sintaxe de uma linguagem de programação, suas vantagens são inúmeras: Em primeiro lugar, a planilha tende a ficar mais clara e concisa, pois grande parte dos cálculos é realizada no ambiente do VBA, não necessitando de células na planilha para a realização de cálculos intermediários. A velocidade de processamento e o uso de memória também podem ser aprimoradas; Em segundo lugar, a lógica de programação acaba orientando a formulação de algoritmos. Assim, no processo de desenvolvimento do próprio algoritmo, consegue-se identificar passagens desnecessárias ou mecanismos repetitivos que podem ser automatizados; Em terceiro lugar, os cálculos tornam-se mais documentáveis e auditáveis dada a necessidade de estruturação do algoritmo de uma forma lógica e dentro da sintaxe do VBA. Deste modo, evitam-se planilhas, no mínimo, confusas, de difícil entendimento e manutenção. Auditar planilhas sem uma programação de funções é extremamente complicado. Utilizando a programação em VBA, os processos tornam- se mais inteligíveis e menos vulnerável a erros; e Finalmente, a evolução da regulamentação e dos mecanismos de controle pode fazer com que áreas de auditoria e de validação de modelos matemáticos comecem a exigir que os algoritmos sejam desenvolvidos em um ambiente e formato que possam ser mais facilmente analisados e rastreados. Neste contexto, o uso do VBA Excel permite o desenvolvimento de planilhas mais profissionais, e observa a tendência na elaboração de aplicações financeiras mais robustas e sintonizadas com as exigências mais modernas. Brasília, Maio, 2017 Herbert Kimura, Jim H. Aburaya, Vinicius A. Sobreiro e Leonardo F. C. Basso Capítulo 1 Bem vindo ao Microsoft® Excel Para iniciarmos o desenvolvimento das rotinas em VBA no Excel é necessário abrir a janela de edição de código. Na versão 2016, o editor do Visual Basic é acessado através do menu Desenvolvedor, na faixa de opções[1] (Figura 1.1), ou, por meio de um atalho, através da combinação de teclas [ALT] + [F11]. A janela do editor do Visual Basic então se abre (Figura 1.2). Caso não encontre esta opção, ou esta esteja desabilitada, é possível que este recurso não tenha sido incluído na instalação original. Neste caso, reinstale o pacote Office, assegurando que a versão completa foi instalada. Figura 1.1: Acesso ao editor do Visual Basic. Figura 1.2: Janela do editor do Visual Basic. No Excel 2016, a opção de acesso aos recursos do VBA encontra-se desabilitada como padrão. Para habilitar estes recursos, deve-se, ao iniciar uma nova sessão do Excel, clicar sobre o Botão Arquivo (Figura 1.3), para ter acesso ao botão de Opções do Excel (Figura1.4): Figura 1.3: Botão Arquivo do Excel 2016. Figura 1.4: Opções do Excel 2016. Ao acessarmos as Opções do Excel, devemos clicar sobre a opção Personalizar Faixa de Opções (Figura 1.5) e marcar a opção Desenvolvedor. Clique em OK e observe que o menu Desenvolvedor surge na barra de menus (Figura 1.6). Ao clicar sobre a guia, o acesso ao editor do VBA pode ser localizado no canto superior esquerdo (Figura 1.6). Ao clicar sobre o botão Visual Basic, ou a o atalho dado pelas teclas [ALT] + [F11], a janela do editor do Visual Basic se abre (Figura 1.7). Figura 1.5: Mostrar guia Desenvolvedor na Faixa de Opções. Figura 1.6: Guia Desenvolvedor ativa. Figura 1.7: Janela do editor Visual Basic. No ambiente do editor, além das barras tradicionais: barra de título, de menus e de ferramentas; é possível identificar três janelas filhas, as quais irão ser exploradas: a janela de navegação do projeto VBA (Project Explorer), a janela de propriedades e a janela da área de código (Figura 1.7). Estas janelas filhas podem ser acessadas, quando não visíveis através das opções correspondentes no menu Exibir ou através das teclas de atalho: [CTRL]+[R], [F4] e [F7] respectivamente. Como o objetivo deste livro é apresentar os conceitos de VBA, com aplicações na área financeira, utilizando o Excel, muitas possibilidades e funcionalidades do ambiente de programação não serão exploradas. São inúmeros os recursos disponíveis e, a despeito da grande variedade de obras sobre o assunto, nenhuma delas esgota o assunto. Assim, modestamente iremos explorar alguns modelos utilizados em Finanças e permitir ao leitor que se inicie na arte de programar. Contudo, mesmo que conhecimentos de computação não sejam necessários inicialmente, é bem-vinda a leitura de obras voltadas à programação estruturada e à programação orientada a objetos. Àqueles leitores que pretendem se tornar desenvolvedores de aplicações, por exemplo, envolvendo banco de dados profissionais ou interfaces mais sofisticadas com o usuário, deverão fazê-lo através de leitura de conceitos mais aprofundados sobre o assunto. 1.1 Visual Basic como Linguagem de Programação Programar resume-se em instruir o computador a realizar tarefas para nós. Para tanto, uma linguagem apropriada deve ser empregada. As operações no processador ocorrem na forma de binária, utilizando palavras e instruções formadas por bits. Contudo a programação em linguagem binária é praticamente impossível de ser realizada por seres humanos devido a sua complexidade. Assim, criam-se ferramentas que transportam nossa intenção em instruções computacionais, permitindo a utilização de poderosas máquinas de processamento para efetuar cálculos e automatizar processos. Neste cenário, o Visual Basic é uma linguagem de programação que disponibiliza instruções (códigos) que, por serem construídas de forma lógica, podem ser interpretadas e transformadas (compiladas) em linguagem de máquina, acessando os diversos recursos disponíveis no ambiente do sistema operacional. Estas instruções são interpretadas linha a linha, de cima para baixo, como uma lista de tarefas a realizar. Para esta lista, dá-se o nome de código-fonte. Dentro de uma mesma linha, algumas instruções, como as de atribuição, são interpretadas da direita para a esquerda; outras, como as de tomada de decisão, são interpretadas da esquerda para a direita. Não se preocupe em entender os pormenores. Você irá absorver estes conceitos à medida que os códigos-fonte sejam apresentados e interpretados. Seguindo esse conceito, não vamos abordar aspectos computacionais sem sua aplicação imediata. A cada capítulo iremos abordar aspectos do ambiente de programação do Visual Basic, no momento exato da exigência de um conhecimento mais aprofundado. Assim, ao tratarmos de variáveis passadas como argumento de funções, iremos também abordar os tipos de variáveis e as operações matemáticas disponíveis para ele. Contudo, vale uma atenção especial, dentre as várias instruções que utilizaremos, para os blocos de tomada de decisão e os recursivos ou também chamados de laço. A mais comum instrução para tomada de decisão é sem dúvida o If Then Else (Se, então, senão). A instrução testa uma condição (por isso, também é conhecida como instrução condicional) que, em caso afirmativo (True) executa certo bloco de instruções. Opcionalmente, um segundo bloco de instruções pode ser executado em caso negativo (False). Assim, se tivéssemos duas variáveis a e b e uma condição de teste a=b, e o bloco para a condição True associado a abrir uma caixa com a mensagem: “As variáveis possuem o mesmo valor.”; poderíamos ter o seguinte código- fonte. 01 02 03 If a=b Then Msgbox “Correto! As variáveis possuem o mesmo valor.” End If Código 1.1: Código fonte 1. Note que a instrução If necessita que seu escopo seja delimitado através de uma palavra-chave para o interpretador: End If. Se tivéssemos a condição negativa com a mensagem: “As variáveis não possuem o mesmo valor.” o código tomaria a forma: 01 02 03 04 05 If a=b Then Msgbox “Correto! As variáveis possuem o mesmo valor.” Else Msgbox “As variáveis não possuem o mesmo valor.” End If Código 1.2: Código-fonte 2. Entre as palavras-chaves Then e Else contemplam-se as instruções que determinaram as ações em caso afirmativo da condição de teste da instrução If. De forma similar, entre as palavras-chaves Else e End If, as instruções de tratamento em caso de negação da condição de teste. Poderíamos ter feito uma outra pergunta, isto é, uma outra condição de teste. Por exemplo: a é maior que b? Neste caso o operador lógico definido em Visual Basic é o sinal de “maior que” (>). Vamos ao código. 01 02 03 04 05 If a>b Then Msgbox “A variável a é maior que a variável b.” Else Msgbox “A variável b é maior que a variável a.” End If Código 1.3: Código-fonte 3. Note que nesse código, não estamos contemplando, de maneira ingênua, a possibilidade de a ser igual a b, como já tratado anteriormente. Um resumo de operadores lógicos será apresentado na medida em que sejam necessários em nossos códigos-exemplos. Já estruturas de laço são importantes mecanismos de programação que permitem a utilização de algoritmos recursivos, nos quais há a repetição de uma específica sequência de instruções. Os laços geralmente são quebrados assim que atingem uma condição. Deste modo, algum tipo de teste é realizado, antes ou depois, de cada iteração, permitindo controlar a quantidade de vezes em que a rotina implementada será executada. Em particular, temos o For Next e o Do Loop. Em nossas rotinas, apenas o For Next será utilizado. Assim, tratemos de examiná-lo. Por exemplo: suponha que gostaríamos de gerar o resultado da soma dos números 1 a 10. Isto é 1+2+3+...+10. Uma possível implementação seria: 01 02 03 04 a=0 For i=1 To 10 a=a+i Next i Código 1.4: Código-fonte 4. Interpretando o código: temos na linha 1 a atribuição do valor zero à variável a; na linha 2, uma segunda variável, i, tem seu valor inicial igual a 1; na linha 3 a variável a assume seu próprio valor somado ao valor da variável i; na linha 3 a variável i é incrementada em uma unidade, retornando a linha 2 onde a instrução For testa a variável i que, neste caso, se i > 10 a próxima linha a ser executada é a posterior a linha 4. Um aspecto no VBA que pode causar confusão ao iniciante em programação envolve a linha 3. Afinal, matematicamente como “a” pode ser igual a “a + i”? A lógica nessa sintaxe é que, ao se estabelecer “a = a + i”, o primeiro “a” receberá um valor atualizado igual ao “a” anterior mais o valor de “i”. Assim, dentro da sintaxe de programação do VBA, a linha indica que a variável “a” receberá um novo valor que depende de seu valor anterior adicionado ao valor de “i”. O incremento em um laço pode ser redefinido através da palavra-chave Step, atribuindo qualquer valor ao passo de incremento. No exemplo a seguir vamos tomar incrementos de 0,2 obtendo o valor de 5,2+5,4+5,6+ ...6,0. 01 0203 04 a=0 For i=5.2 To 6 Step 0.2 a=a+i Next i Código 1.5: Código-fonte 5. As estruturas de decisão e laço no Visual Basic não estão restritas apenas ao If Then Else e ao For Next. Há ainda variações do tema como o Select Case, If, For Each Next, Do While, Do Until que podem ser encontradas em livros especializados em programação Visual Basic. Vamos nos ater às instruções básicas e nos casos interativos com a planilha de cálculo do Excel, que já permitem a elaboração de aplicações de grande utilidade. Capítulo 2 Modelos de juros O Excel possui uma gama de fórmulas matemáticas que permite a realização de operações variadas, desde soma e subtração, passando por métodos estatísticos e funções trigonométricas, até mecanismos para solução de equações não-lineares. No entanto, em algumas situações, a implementação de uma função específica pode agilizar o processo de cálculo. Assim, a utilização mais imediata do VBA do Excel envolve a utilização de funções definidas pelo usuário, atribuindo características precisas e detalhadas para um determinado problema ou situação. Neste capítulo, vamos propor modelos financeiros simples que poderiam ser facilmente calculados através do uso de funções predefinidas e básicas do Excel como, por exemplo, operações de soma, subtração, multiplicação e divisão. Porém, ilustraremos a programação em VBA desenvolvendo funções específicas que replicam, no ambiente de programação, fórmulas que comumente são implementadas diretamente na planilha. Esses exemplos, apesar de básicos, possibilitam que o leitor possa rapidamente compreender os conceitos mais simples de programação no Excel e já implementar uma função em VBA. No decorrer do livro, aplicações mais sofisticadas serão discutidas. Todavia, é importante que o leitor se familiarize com o ambiente e com a lógica de programação por meio de exemplos mais diretos. Assim, o objetivo didático deste capítulo é mostrar como parâmetros são passados às funções definidas em VBA. Procuraremos evidenciar a sintaxe de desenvolvimento de funções para utilização no Excel, utilizando, como exemplo, modelos de capitalização simples e composta. 2.1 Uma breve referência a finanças Um dos aspectos fundamentais em finanças é a atribuição de juros, que representam um custo de oportunidade ou o valor do dinheiro no tempo. Praticamente qualquer operação ou produto financeiro possui algum cálculo de taxa de juros associado. Na prática, quase todo analista usa funções matemáticas na planilha para resolver problemas que envolvam valor presente ou valor futuro. Em linhas gerais, a capitalização é a aplicação de juros sobre um valor de referência. Na capitalização simples, a cada período, os juros incidem somente sobre o valor de referência. Na capitalização composta, os juros incidem sobre o valor de referência acrescido da remuneração do capital. 2.2 Capitalização simples No caso da capitalização simples, um investimento de valor presente – VP, aplicado a uma taxa de juros i por n períodos, tem um valor futuro – VF dado pela fórmula: (2.1) Esta fórmula de capitalização simples será usada para ilustrar como funções podem ser rapidamente desenvolvidas em VBA. Neste caso, será implementada uma função que dá como resultado o valor futuro, a partir de parâmetros de entrada referentes (i) ao valor presente, (ii) à taxa de juros ao período e (iii) ao número de períodos. Para discutir o conceito, o caso a seguir ilustra uma operação típica de mercado financeiro, no qual um investimento em dólar tem juros capitalizados de forma simples. Exemplo 2.1: Suponha que um investidor adquira um produto financeiro no qual aplica um valor presente VP = $100.000. Este produto será resgatado ao final de n = 3 anos, corrigido por uma taxa anual de i = 5%. Ao final de três anos, qual o valor futuro VF a ser resgatado pelo investidor considerando capitalização simples, ou seja, juros incidindo somente no valor inicial investido? Resolução: Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor investido $100.000, obtendo-se um total de juros J1, ou seja: Ao final do segundo ano, novamente a taxa de juros é aplicada sobre o valor investido, obtendo-se um total de juros J2 de: Note que os juros incidem sobre o valor inicial VP. Este procedimento caracteriza a capitalização simples, por meio da qual os juros são sempre aplicados a um valor inicial de referência, no caso, ao investimento inicial dado por VP. Assim, de maneira análoga, ao final do terceiro ano, o investidor também recebe juros de 5% sobre o valor investido $100.000. Ao final do período de aplicação, o investidor deve receber o valor investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o valor futuro a receber no final do período, temos: Ou seja, o valor de resgate, ao final de 3 anos, de uma aplicação de $100.000 que paga 5% ao ano, capitalizada de forma simples, é igual a $115.000. De fato, se substituirmos os dados do exemplo na Equação 2.1, obtemos: Usuários com conhecimentos básicos em Excel geralmente implementam esse cálculo de valor futuro usando as operações na própria planilha. Agora, vamos utilizar o mesmo exemplo e implementar essa equação utilizando os recursos do VBA. Nesse primeiro contato, o roteiro passo a passo proposto pode ser seguido: • Abra o Excel; • Inicie o editor do Visual Basic; • Insira novo módulo através da opção Módulo do menu Inserir (Figura 2.1); e • Uma nova janela, referente ao módulo inserido, é aberta (Figura 2.2). Figura 2.1: Opção Módulo do menu Inserir do editor do Visual Basic. Figura 2.2: Módulo 1. No editor do módulo, digite o código a seguir: 01 02 03 Function VFCS(VP, N, TJ) As Double VFCS = VP * (1 + N * TJ) End Function Código 2.1: Código-fonte 6. O resultado deve ser semelhante ao obtido na Figura 2.3. Figura 2.3: Implementação da função VFCS (Valor Futuro por Capitalização Simples). Volte ao ambiente da planilha utilizando a barra de tarefas do Windows, ou do ícone correspondente na barra de ferramentas, ou do atalho [ALT] + [F11]. Digite os seguintes valores e fórmulas nas células da planilha do Excel: • Na célula A1, o texto “VP”; • Na célula A2, o texto “N”; • Na célula A3, o texto “TJ”; • Na célula A4, o texto “VFCS”; • Na célula B1, o valor correspondente à VP: 100.000; • Na célula B2, o valor correspondente à N períodos: 3; • Na célula B3, o valor correspondente à TJ: 5%; e • Na célula B4, a expressão: “=VFCS(B1;B2;B3)”. É importante observar que a descrição refere-se a um ambiente Excel no qual parâmetros não separados por ponto e vírgula, que é o padrão no caso brasileiro. O resultado deve ser semelhante ao obtido na Figura 2.4. O leitor pode notar que a medida em que vai escrevendo o nome da função, o próprio Excel já mostra a sugestão de uso da nova função VFCS criada pelo usuário. Figura 2.4: Implementação da função VFCS (Valor Futuro por Capitalização Simples). Você já deve ter notado que o resultado obtido é o mesmo que a solução demonstrada neste exemplo. Isto é, de $115.000 (Figura 2.5). Você deve ter percebido que a criação de funções é, de certa forma, simples e facilmente implementável. Longe das complicações teóricas de programação, iremos sempre facilitar ao usuário que necessita de aplicação imediata dos fundamentos aqui descritos. Novamente, insistimos em dizer que são inúmeras possibilidades de funções definidas pelo usuário, e de rotinas que podem ser criadas para a solução de praticamente quaisquer modelos financeiros atuais. Figura 2.5: Valor obtido da função VFCS. Vamos voltar ao código e entender sua estrutura: 01 02 03 Function VFCS(VP, N, TJ) As Double VFCS = VP * (1 + N * TJ) End Function Código 2.2: Código-fonte 7. Note que a numeração das linhas do código-fonte, à esquerda, é apenas um recurso gráfico, incluído no livro, para que haja uma referência à linha, cujos comentáriosestão relacionados. É importante enfatizar que os comandos em VBA são os mesmos em qualquer linguagem do Excel, seguindo o idioma inglês. Quando possível, teclas de atalho estarão indicadas. Perceba que todo o código está grafado em tipografia diferente do texto. Neste código temos um exemplo de função. A função está definida entre duas declarações: Function e End Function. O Visual Basic processa o código em linhas, isto é, o interpretador do VBA lê a primeira linha do código, processa-a, passando à segunda linha, e assim sucessivamente. Deste modo, quando o interpretador encontra a instrução Function automaticamente reconhece que os parâmetros seguintes são os que darão funcionalidade a uma função no VBA. Da mesma forma, encontrar End Function sinaliza o fim do código da função. Esta maneira como o VBA processa as instruções é utilizada em outras estruturas de programação como o If e End If, que será abordado nos códigos de tópicos posteriores. O entendimento deste simples código é vital para as futuras implementações. Na primeira linha, i.e., na linha 1, temos a referência à declaração Function, que sinaliza o interpretador do VBA para o código de uma função, cujo nome foi dado como VFCS, mnemônico e acrônimo de Valor Futuro por Capitalização Simples. O leitor poderia dar um nome qualquer para essa função, lembrando que, para usá-la na planilha, deve usar o nome atribuído no código. Da fórmula de capitalização simples, sabemos que há algumas variáveis relevantes: VP (Valor presente), N (Número de períodos de aplicação) e TJ (Taxa de juros). Assim esses parâmetros devem ser passados como argumentos ou parâmetros para o código. Essa passagem de parâmetros é realizada através da sintaxe VFCS(VP,N,TJ). Desta forma, ao acessarmos a função pelo Excel, há a necessidade de fornecermos valores para cada uma das variáveis, sejam eles numéricos, ou endereçados a uma célula. O termo As Double indica ao VBA que a função VFCS foi declarada como um número do tipo Double, isto é, a célula, ou a rotina que chamar a função receberá como resposta, um valor do tipo Double. Vale a pena, aqui, falar um pouco mais sobre os tipos de variáveis. Essencialmente, em VBA, temos quatro tipos de variáveis: (i) numéricas, (ii) booleanas (lógicas), (iii) textuais ou (iv) estruturadas numa combinação das três anteriores. As numéricas, que são os principais alvos de estudo em finanças, podem ser Tipo de Dado Memória Escopo Byte 1 byte 0 to 255 Boolean 2 bytes True or False Integer 2 bytes -32.768 to 32.767 Long 4 bytes -2.147.483.648 to 2.147.483.647 Single 4 bytes -3.402823E38 to -1.401298E-45 † 1.401298E-45 to 3.402823E38‡ Double 8 bytes -1.79769313486231E308 to -4.94065645841247E-324‡4.94065645841247E-324 to 1.79769313486232E308† Currency 8 bytes -922.337.203.685.477.5808 to 922.337.203.685.477.5807 Decimal 14 bytes +/- 79.228.162.514.264.337.593.543.950.335 7,922816251 (with 28 decimal places) +/-0.0000000000000000000000000001 (Lowest decimal number other than zero) Date 8 bytes January, 1 100 to December, 31 9999 Variant 16 bytes Similar to Double então (i) escalares ou (ii) vetoriais (matriciais) e podem ter seu escopo de abrangência conforme o espaço reservado na memória. Este espaço é definido conforme declaramos no código do programa. Temos então as do tipo Byte podendo representar números de 0 a 255 e outras conforme quadro (Tabela 2.1) a seguir: Tabela 2.1: Tipos de dados utilizados em variáveis no VBA, espaço reservado na memória e escopo de valores representados. Notas: †Valores positivos e ‡valores negativos. Para as versões de 2013 em diante. O leitor não precisa se preocupar em decorar ou entender detalhadamente a Tabela 2.1. É importante compreender que uma função gera um resultado que, no caso da maior parte das aplicações em finanças, será valor um numérico. O Double simplesmente estabelece que a função gerará um resultado numérico que pode ser não inteiro, isto é, pode ter diversas casas decimais. Se o resultado da função pudesse ser somente um valor inteiro pequeno, no intervalo entre −32.768 e 32.767, então a função poderia ser declarada como Function VFCS(VP, N, TJ) As Integer. Se o resultado da função pudesse ser somente um valor inteiro muito grande, fora do intervalo anterior, então a função poderia ser declarada como Function VFCS(VP, N, TJ) As Long. No caso, do nosso problema financeiro, obviamente que a escolha da função como Integer ou Long é inapropriada, pois o valor futuro pode assumir valores não-inteiros. Um leitor mais atento poderia questionar porque então não se define uma função sempre como Double, uma vez que seria mais abrangente que o Integer e o Long. No entanto, em certas situações, o resultado da função é intuitivamente inteiro e, desta maneira, declará-la como Integer ou Long é uma escolha natural. Além disso, através dos números de bytes descritos na Tabela 2.1, pode-se verificar que um Double ocupa o dobro de memória do computador do que um Long e o quádruplo de memória que um Integer. Para aplicações em que memória alocada e velocidade de processamento sejam essenciais, detalhes como a definição do tipo de dados tornam-se críticos. Em algumas aplicações financeiras mais sofisticadas, o tempo de processamento em uma planilha Excel pode demorar horas e, portanto, a inadequada inicialização de dados pode comprometer ou até mesmo inviabilizar um cálculo financeiro. Neste livro, as funções que criaremos não envolvem uma alocação de memória crítica e, portanto, na maioria das situações as funções serão definidas como Double. Voltando à descrição da função de capitalização simples. O corpo da função apresenta uma única linha (linha 2) aonde estamos atribuindo o retorno da função VFCS, isto é o valor que será passado como resultado da função, por meio do operador de atribuição =. Operadores matemáticos, neste caso, aritméticos, foram utilizados para as operações de soma (+) e multiplicação (*). Há outros operadores aritméticos como segue (Tabela 2.2) e que também podem ser usados para funções a serem criadas pelo usuário em VBA. Operador aritmético Utilização Exemplo ^ Exponenciação 3^2 resulta em 9 * Multiplicação 3*2 resulta em 6 / Divisão 4/2 resulta em 2 \ Inteiro da Divisão 3\2 resulta em 1 Mod Resto da Divisãi 3 Mod 2 resulta em 0.5 + Soma 1+2 resulta em 3 - Subtração 3-1 resulta em 2 Tabela 2.2: Operações aritméticas presentes no VBA e exemplos de aplicação. Parênteses são usados em sua forma habitual, ou seja, podem ser aninhados e as operações entre os parênteses mais internas precedem as mais externas, bem como as operações de multiplicação e divisão precedem as operações de soma e subtração. O quadro anterior está em ordem de precedência de operações. Assim, na função que criamos, a operação N * TJ será realizada inicialmente, e o resultado será somado a 1, cujo resultado será multiplicado a VP e atribuído a VFCS. Finalmente a declaração de fim da função End Function sinaliza o retorno do valor atribuído à chamada da função. No exemplo, o retorno da função é apresentado na célula B4. Resumindo, a função que batizamos como VFCS calcula o valor futuro, através de capitalização simples, levando-se em consideração os parâmetros de entrada VP, N e TJ. A fórmula de cálculo de VFCS é VP * (1 + N * TJ). Na planilha do Excel, após a digitação do código da função, VFCS estará disponível para ser usada como uma função qualquer do Excel. Para uso da função na planilha, basta fazer como qualquer outra função. Coloca-se o sinal de igual, o nome da função e os parâmetros da função. De acordo com a ordem dos parâmetros no código da função, o valor presente, o número de períodos e a taxa de juros devem ser incluídos de forma subsequente. Por exemplo, se a função fosse declarada como Function VFCS(VP, TJ, N), então a ordem de inclusão de parâmetros na função seria o valor presente, a taxa de juros e o número de períodos. Assim, a ordem dos parâmetros definida no código da função deve ser mantida quando a função for usada na planilha. 2.3Capitalização composta Um outro exemplo que pode ajudar a consolidar ideias envolve a implementação de uma função para obter o valor futuro por meio da capitalização composta. A capitalização simples tem algumas aplicações, principalmente no mercado de câmbio, no qual transações podem envolver a incidência de juros somente sobre o valor inicial. Porém, a maioria das aplicações, principalmente no caso de produtos financeiros, envolve uma capitalização denominada de composta. Neste tipo de capitalização os juros de um período incidem sobre o valor total de um período anterior. Ou seja, na capitalização composta pode haver incidência de juros sobre juros. Genericamente, sendo o prazo da aplicação n períodos, a fórmula do valor futuro VF de um valor presente VP a partir de uma capitalização composta de uma taxa de juros i é dada por: (2.2) Exemplo 2.2: Suponha uma aplicação financeira na qual o investidor obtém juros capitalizados de forma composta. Como no estudo de caso da capitalização simples, o objetivo é calcular o valor futuro VF de um investimento de valor presente VP após um número de n períodos de capitalização composta, considerando uma taxa de juros igual a i ao período. Suponha que um investidor adquira um produto financeiro no qual aplica VP = $100.000. Esse produto será resgatado ao final de n = 3 anos, corrigido por uma taxa anual i = 5%. Ao final de três anos, qual o valor futuro VF a ser resgatado pelo investidor, considerando uma capitalização composta? Resolução: Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor investido R$100.000, obtendo-se um total de juros J1, ou seja: Ao final do segundo ano, a taxa de juros é aplicada sobre o valor acumulado, que incorpora o valor investido, bem como os juros do primeiro período. Assim, os juros eferentes ao segundo ano são dados por J2: Note que os juros estão incidindo sobre o valor inicial VP, acrescido dos juros J1. Este procedimento caracteriza a capitalização composta, na qual os juros são aplicados a um valor inicial de referência, no caso, ao investimento inicial dado por VP, e também aos juros incorridos em períodos anterior, no caso J1. De forma análoga, ao final do terceiro ano, a taxa de juros de 5% é aplicada sobre o valor investido $100.000 e todos os juros devidos anteriormente. Ao final do período de aplicação, o investidor deve receber o valor investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o valor futuro a receber no final do período, temos: Ou seja, o valor de resgate de uma aplicação de $100.000 que paga 5% ao ano, capitalizado de forma composta, é igual a $115.762,50. Este resultado pode ser obtido diretamente pela fórmula dada em 2.2: Um usuário comum desenvolveria a seguinte planilha: Figura 2.6: Resolução do exercício utilizando as funções básicas do Excel. No entanto, um usuário que saiba VBA pode desenvolver uma função no Excel e incorporá-la em uma biblioteca. Como fizemos para a capitalização simples, podemos usar a equação acima para exemplificar a programação de funções usando o ambiente do VBA para Excel. Chamaremos a função de VFCC, representativo de valor futuro através de capitalização composta. Os parâmetros da função serão (i) o valor presente VP, (ii) o número de períodos N e a taxa de juros ao período TJ. 01 02 03 Function VFCC(VP, N, TJ) As Double VFCC = VP * (1 + TJ) ^ N End Function Código 2.3: Código-fonte 7. Na janela de código, a implementação desta função pode ser realizada em sequência à função VFCS (Figura 2.7), conforme apresentado a seguir: Figura 2.7: Implementação da função VFCC (Valor Futuro por Capitalização Composta). A chamada da função possui os mesmos parâmetros. Utilizando-a na planilha temos (Figura 2.8): Figura 2.8: Utilização da função VFCC na planilha. E o valor obtido é o correspondente a resolução do exemplo dado: (Figura 2.9). Figura 2.9: Valor obtido da função VFCC. 2.4 Exercício de fixação - Capitalização contínua A capitalização contínua representa um mecanismo de incidência de juros que ocorre a todo instante. Em termos conceituais, pode-se dizer que a capitalização contínua é uma capitalização composta na qual a incidência de juros ocorre a cada momento de forma contínua e não a cada período de forma discreta como é o caso das capitalizações simples e composta. O leitor pode estranhar em um primeiro momento e indagar que tipo de aplicação possui uma capitalização contínua, na qual os juros sejam computados a todo instante continuamente. Na prática, este tipo de capitalização não é usual. Porém, em modelos teóricos de precificação de produtos financeiros, em algumas situações, a capitalização contínua é importante. Por exemplo, a fórmula de Black-Scholes, amplamente utilizada no mercado para precificação de derivativos, pressupõe que a taxa de juros é capitalizada continuamente. Sem entramos em detalhes sobre a capitalização contínua, considerando nosso objetivo de capacitar o leitor no desenvolvimento de funções no VBA do Excel, nossa proposta é a programação da função específica. Assim, como exercício de fixação, propomos que o leitor desenvolva uma função em VBA que permita calcular o valor futuro VF de um investimento de valor presente VP, aplicado durante n períodos e corrigido por uma taxa de juros i ao período, com capitalização contínua. A equação do valor futuro com capitalização contínua é dada por: (2.3) No VBA do Excel, a função exponencial é denotada por Exp(). Assim, pede-se que o leitor desenvolva o código da função de valor futuro com capitalização contínua, com parâmetros de entrada representativos do valor presente, do número de períodos e da taxa de juros. Resposta Uma possível implementação da função de capitalização composta é apresentada a seguir: 01 02 03 Function VFCN(VV, N, TJ) As Double VFCN = VP * Exp(N * TJ) End Function Código 2.4: Código-fonte 8. Capítulo 3 Precificação de ativos O capítulo anterior permitiu que o leitor se familiarizasse com o ambiente de programação do Excel. Por meio da construção de funções relativas à capitalização de juros, o leitor pôde ter contato com algumas sintaxes da linguagem do VBA e perceber que a programação de funções é extremamente simples. Em especial, os exemplos servem para mostrar que qualquer indivíduo com conhecimento do ambiente e da lógica de uma planilha Excel pode rapidamente programar em VBA. Neste capítulo, vamos treinar o desenvolvimento de outras funções que, de certa maneira, são mais interessantes do ponto de vista financeiro. Porém, como o leitor poderá perceber, o desafio de implementação em VBA não é muito diferente do que foi conduzido no capítulo anterior. Para um melhor entendimento dos conceitos financeiros do CAPM, o leitor pode consultar Brealey, Myers, and Allen (2016). 3.1 Aplicação do modelo de precificação de ativos de capital Uma ferramenta bastante comum em análises financeiras é o Capital Asset Pricing Model (CAPM), isto é, o modelo de precificação de ativos de capital. O CAPM é um modelo amplamente utilizado em finanças e sua fórmula envolve apenas operações básicas de adição e multiplicação, facilitando a exposição dos conceitos iniciais do VBA. O CAPM resume um item fundamental da teoria financeira, que relaciona retorno esperado com o nível de risco, representando, matematicamente, um resultado intuitivo de que quanto maior o risco assumido, maior o retorno esperado. Embora a demonstração do CAPM seja matematicamente rigorosa, sua argumentação lógica é relativamente simples. Partindo de algumas premissas, o modelo de precificação de ativos de capital leva à conclusão de que o retorno esperado de um ativo é diretamente proporcional ao seu nível de risco. Em especial, de acordo com o CAPM, o retorno esperado de um ativo é maior quanto maior for seu nível de risco sistemático. O risco sistemático é uma medida da sensibilidade dos retornos de um ativo em relação a uma carteirarepresentativa do mercado como um todo. Quando um ativo possui risco sistemático grande, sua sensibilidade com relação a flutuações do mercado é maior. Uma medida da sensibilidade risco sistemático de um ativo é comumente chamada de beta (β) do ativo. Pelo CAPM, um ativo com beta grande, i.e., com risco sistemático elevado, deve ter maior retorno esperado. De maneira oposta, um ativo pouco susceptível às flutuações do mercado como um todo envolve menos risco sistemático e, portanto, um retorno esperado menor. Em particular, para um retorno esperado de um ativo A, aqui representado por RA, a derivação do CAPM conduz à seguinte equação, que associa risco e retorno: (3.1) No qual • RF: retorno esperado do ativo livre de risco; • βA: sensibilidade risco sistemático associado ao ativo A; e • RM: retorno esperado do mercado. Assim, o CAPM estabelece um dos princípios da teoria moderna de finanças. Quanto maior o risco sistemático βA de um ativo A, maior seu retorno esperado RA. Mais especificamente, o retorno esperado de um ativo equivale a uma taxa de juros de uma aplicação sem risco RF adicionada de um prêmio pelo risco de mercado (RM − RF) ajustado pelo risco sistemático βA do ativo. É relevante observar que estamos simplificando a notação do valor esperado para facilitar a definição de variáveis no código da função em VBA. Assim, ao invés de usarmos uma notação mais rigorosa E(R) para retorno esperado, estamos simplesmente estabelecendo o conceito de retorno como R. 3.2 Aplicações do CAPM O CAPM é utilizado em diversas aplicações em finanças. Por exemplo: investidores podem estimar preços justos de ações, projetando dividendos esperados, e trazendo-os a valor presente por uma taxa de retorno, estimada por meio do CAPM, compatível com o nível de risco dos fluxos de caixa. A análise de valor de empresas em processos de fusões e aquisições também leva em consideração, as estimativas de custo de capital baseadas no CAPM. O estudo de viabilidade de projetos considerando-se técnicas de valor presente líquido também pode utilizar uma taxa de retorno que desconta fluxos de caixas, obtida a partir do CAPM. Adicionalmente, avaliações de criação de valor, como as envolvendo o Valor Econômico Adicionado ou Economic Value Added (EVA), têm um custo de capital que pode ser estimado também pelo CAPM. Assim, o CAPM possui inúmeras aplicações em finanças. Destaca-se, pela equação 3.1, que o retorno esperado de um ativo RA depende do retorno RF de um ativo livre de risco, da estimativa do risco sistemático βA e do retorno esperado do mercado RM. Tecnicamente, o beta de um ativo, por definição, é a covariância dos retornos deste ativo com a variância dos retornos do mercado. Porém, destacando-se da tecnicalidade da definição estatística, como já explicado anteriormente, o beta é uma medida de sensibilidade de como o ativo flutua em relação a flutuações do mercado. Uma forma de estimação do beta será estudada em um capítulo posterior, com auxílio de uma função programada. A seguir, discute-se um exemplo para ilustrar o uso do CAPM. Exemplo 3.1: Um analista estimou o beta de uma ação em 1,3. Sabendo que um investimento em um ativo livre de risco rende 11% ao ano e que o mercado como um todo tem um retorno esperado de 18% ao ano, obtenha o retorno esperado da ação. Resolução: Aplicando esses valores à equação 3.1 temos: ao ano Ou seja, a taxa de retorno esperada do ativo é de 20,1% ao ano. Pelo fato de o ativo possuir um beta superior a 1, pode-se classificá-lo como ativo agressivo, com risco sistemático maior que o mercado como um todo. Tendo um risco sistemático maior que o do mercado, o retorno esperado do ativo (20,1%) também é maior que o retorno esperado do mercado (18,0%). O código-fonte que implementa o retorno esperado de um ativo está na sequência. Note que a função se chama fncRA e possui argumentos de entrada dados por RF para o retorno esperado do ativo livre de risco, BA para sensibilidade ou beta, ou risco sistemático associado ao ativo A e RM para o retorno esperado do mercado. 01 02 03 Function fncRA(RF, BA, RM) As Double fncRA = RF + BA * (RM - RF) End Function Código 3.1: Código-fonte 9. Na janela do editor do Visual Basic for Applications poderíamos ter a seguinte situação (Figura 3.1) com um possível resultado obtido na planilha do Excel (Figura 3.2). Observe que o valor obtido pela aplicação da função é idêntico ao valor calculado anteriormente no nosso exemplo. Figura 3.1: Código da função fncRA (Retorno esperado de um ativo A). Figura 3.2: Valor obtido da função fncRA. 3.3 Beta do ativo Ainda explorando a questão do risco sistemático, podemos obter outras fórmulas a partir da fórmula do CAPM, ou seja, se conhecêssemos o retorno esperado de um certo ativo A (RA), o retorno esperado do ativo livre de risco (RF), e o retorno esperado do mercado (RM), a sensibilidade risco sistemático associado ao ativo A (βA) pode ser encontrada por meio de: (3.2) Esta fórmula é obtida mediante da manipulação da fórmula 3.1. O código para implementação da fórmula de βA pode ser o sugerido: 01 02 03 Function fncBA(RA, RF, RM) As Double fncBA = (RA - RF) / (RM - RF) End Function Código 3.2: Código-fonte 10. O nome da função pode ser qualquer, desde que não esteja na lista dos termos exclusivos do VBA. Como convenção, neste livro adotaremos que sempre funções possuam fnc como prefixo. Desta forma, cria-se um padrão e evita-se que se utilize um nome que já está reservado para o próprio VBA. Destaca-se ainda que letras maiúsculas e minúsculas não são diferenciados pelo VBA, isto é, RA e ra, ou ainda rA, referem-se à mesma variável. Mas adotaremos sempre que as variáveis passadas como argumentos sejam grafadas em maiúsculas, e que as variáveis auxiliares, utilizadas no corpo da função sejam grafadas em minúsculas. Insistimos que a escolha destes nomes é livre. Contudo, a adoção de alguma convenção separando visualmente, universos de rotinas e funções, variáveis como argumentos e variáveis auxiliares, permite rapidamente obter informações adicionais sobre como tratá-los. 3.4 Retorno do ativo livre de risco Em alguns exercícios de finanças, a incógnita é a taxa de juros livre de risco RF. Da fórmula do CAPM, equação 3.1, podemos isolar esta variável, obtendo-se: (3.3) Assim, a implementação da função que calcula a taxa de juros livre de risco a partir das outras variáveis do CAPM pode ser feita a partir das seguintes linhas de código: 01 02 03 Function fncRF(RA, BA, RM) As Double fncBA = (RA – BA * RM) / (1 - BA) End Function Código 3.3: Código fonte 11. 3.5 Exercício de fixação - Retorno esperado do mercado A última informação que pode ser obtida da formulação do CAPM é sobre o retorno esperado do mercado, considerando outros dados. Isolando RM na fórmula básica do CAPM, na equação 3.1, temos: (3.4) Exemplo 3.2: Neste exercício, pede-se que o leitor desenvolva uma função em VBA na qual, a partir das outras variáveis do CAPM, obtenhase o retorno esperado do mercado. Resolução: Um possível código para a função solicitada no exercício é descrito a seguir. 01 02 03 Function fncRM(RA, BA, RF) As Double fncRM = (RA – (1 - BA) * RF) / BA End Function Código 3.4: Código-fonte 12. Capítulo 4 Modelo de Gordon Em finanças, o preço de praticamente qualquer ativo pode ser estimado por meio do cálculo do valor presente de fluxos de caixa esperados. Estes fluxos de caixa projetados são trazidos a valor presente por uma taxa de desconto RA compatível com o nível de risco. Em particular, no mercado de ações, os fluxos de caixa relevantes são os dividendos projetados Di que a empresa deve pagar nos diversos instantes i. Assim, para precificar um ativo deve-se inicialmente estimar todos os fluxos de caixa futuros e trazê-los a valor presente, a uma taxa de desconto que pode ser calculada, por exemplo, usando o CAPM, discutido no capítulo anterior.Tendo em vista a complexidade de avaliação, principalmente devido à necessidade de projeção de um número infinito de fluxos de caixa, é importante o uso de modelos mais simples, pelo menos para uma análise preliminar. Uma das tarefas do analista é justamente identificar ativos que estão precificados de forma incorreta, sub ou sobre-avaliados e definir estratégias para obtenção de lucro. O modelo de Gordon representa um dos mecanismos mais ágeis e mais utilizados pelos analistas para avaliar o preço justo de uma ação. Deve-se entender que o preço justo, ou o preço que o analista acha justo, pode diferir do preço de mercado, pelo qual o ativo está sendo transacionado. O modelo geral de precificação de um preço justo é dado pela fórmula do valor presente líquido aplicado a esta situação: (4.1) No qual • PA: preço justo; • Di: i-ésimo dividendo; • RA: retorno esperado do ativo A, em função de seu risco; e • ti: instante do recebimento do i-ésimo dividendo. A equação 4.1 pode assustar em um primeira passada de olhos. No entanto, a equação simplesmente denota que o valor da ação PA é simplesmente uma somatória de vários dividendos Di, com i variando de 1 a infinito. Ou seja, o valor de uma ação é dado pela soma de todos os dividendos que a empresa propiciará ao longo dos próximos instantes ti de pagamento de proventos. Para se obter o valor justo, cada dividendo é trazido a valor presente, por um fator (1+ RA)t-i associado a uma capitalização composta. A equação 4.1 é genérica e pode ser usada para precificar praticamente qualquer ativo ou projeto. Para ativos e projetos quaisquer, os dividendos são substituídos por fluxos de caixa. Enquanto a equação 4.1 descreve o modelo geral para avaliação de ativos, o modelo de Gordon representa uma simplificação no processo de precificação. Enquanto na equação 4.1, os dividendos podem ser quaisquer, no modelo de Gordon, parte-se da suposição de que os dividendos crescem periódica e indefinidamente a uma taxa constante G. Ou seja, em cada período, o dividendo equivale ao dividendo anterior corrigido por um fator G. Uma suposição implícita é que os dividendos são pagos com uma frequência constante, isto é, em períodos subsequentes. Obviamente, dificilmente uma empresa propiciará dividendos com esse comportamento de crescimento constante e periódico. Porém, a ideia do modelo de Gordon é partir de premissas simplificadoras, para facilitar o processo de precificação. Apesar de o valor obtido não ser acurado, permite que um investidor possa rapidamente identificar um valor razoável para a ação. Além disso, no modelo geral, o investidor teria que projetar infinitos dividendos para poder calcular a somatória da equação 4.1. Como veremos a seguir, supondo-se que os dividendos crescem a uma taxa constante G ao período, simplifica-se o cálculo do preço. Considerando a premissa do modelo de Gordon, tem-se, portanto, as seguintes relações entre os dividendos de períodos subsequentes: Mais genericamente, fazendo substituições sucessivas: (4.2) Utilizando propriedades matemáticas, em particular, da soma de infinitas parcelas de uma progressão geométrica, o modelo de Gordon, com a suposição de dividendos que crescem indefinidamente a uma taxa G constante, pode ser reduzido a uma fórmula simples: (4.3) A simplicidade do modelo de Gordon representa seu ponto forte e permite ao analista fazer uma estimativa do preço de uma ação, rapidamente, sem a necessidade de estimar muitos fluxos de caixa. De fato, é necessário apenas estimar o fluxo de caixa projetada ao próximo período D1, a taxa de desconto dos fluxos de caixa RA, a taxa de crescimento de dividendos G. Deve-se ressaltar que a taxa de desconto RA pode ser obtida através do CAPM, conforme realizado no capítulo anterior. A fórmula fundamental do modelo de Gordon pode ser implementada como sugerido no código a seguir. Note que o nome da função é definido como fncPA e possui argumentos de entrada dados por DU referente ao dividendo no instante 1, RA referente à taxa de desconto dos fluxos de caixa e G referente à taxa de crescimento de dividendos ao período. 01 02 03 Function fncPA(DU, RA, G) As Double fncPA = DU / (RA – G) End Function Código 4.1: Código-fonte 13. Diversas técnicas podem ser usadas para estimar o próximo fluxo de caixa. Cada analista deve usar seu poder de avaliação para entender melhor a empresa e o potencial de geração de caixa e de pagamento de dividendos. Uma melhor avaliação é o diferencial de um melhor analista. Assim, o modelo de Gordon serve apenas como uma primeira aproximação de um valor justo para a ação. Cada analista, de posse de maiores e melhores informações, pode realizar diferentes projeções de fluxos de caixa, obtendo diferentes estimativas de dividendos. Um dos usos mais simples do modelo de Gordon é supor que o último dividendo pago se repita indefinidamente ao longo dos anos. Neste caso, considera-se que a taxa de crescimento G é nula e que o dividendo D1 é igual ao último dividendo pago. Este modelo com G = 0 é bastante comum, pois não envolve nenhuma projeção e permite uma rápida identificação da ordem de grandeza do preço justo de uma ação. Podemos aproveitar este fato para ilustrar como passar parâmetros como valores opcionais em funções criadas no ambiente do VBA Excel. Ou seja, para utilizar o modelo de Gordon com taxa de crescimento nula, não há a necessidade de passar um valor zero à função como um parâmetro nulo. Basta declarar a variável G como um parâmetro opcional na declaração da função. Assim, podemos definir que, se este parâmetro não for informado, a nossa função irá considerá-lo com valor igual a zero. O código-fonte a seguir possui uma situação possível de implementação: 01 02 03 04 Function fncPAG(DU, RA, Optional G) As Double If IsMissing(G) Then G = 0 fncPAG = DU / (RA – G) End Function Código 4.2: Código-fonte 14. As novidades encontram-se na primeira e segunda linhas. Na primeira linha, a variável G possui uma declaração de opcional (Optional), assim, a obrigatoriedade da variável G ser passada como argumento não existe. Contudo, a sequência de instruções seguintes deve tratar da possibilidade de o valor de G não ser passado. A segunda linha trata disso: Is Missing é uma função do VBA que retorna o valor lógico verdadeiro (True) se a variável testada está ausente. Assim, esta linha de código traduz-se como: “Se G não estiver presente, então atribua a G o valor zero”. A sequência de instruções segue inalterada. Poderíamos ainda ter outra forma de implementação: 01 02 03 04 05 06 07 Function fncPAG(DU, RA, Optional G) As Double If IsMissing(G) Then fncPA = DU / RA Else fncPA = DU / (RA – G) End If End Function Código 4.3: Código-fonte 15. • A linha 2 traduz-se: “Se G não estiver presente, então...”. • A linha 3 calcula o preço da ação sem o valor de G. • A linha 4 traduz-se: “Senão”, por exemplo, caso G esteja presente... • A linha 5 calcula o preço da ação com o valor de G. • A linha 6 fecha o bloco condicional. Ou ainda: 01 02 03 04 05 06 07 08 Function fncPAG(DU, RA, Optional G) As Double Select Case IsMissing(G) Case Is True fncPA = DU / RA Case Is False fncPA = DU / (RA – G) End Select End Function Código 4.4: Código-fonte 16. • A linha 2 traduz-se como: “Selecione os casos referentes à presença de G...” • A linha 3 traduz-se como: “Caso seja verdadeira...”, por exemplo, G não está presente • A linha 4 calcula o preço da ação sem o valor de G. • A linha 5 traduz-se como: “Caso seja falso...”, por exemplo, G está presente • A linha 6 calcula o preço da ação com o valor de G. • A linha 7 fecha o bloco de seleção “Select Case” Conforme já discutido, dada sua simplicidade e facilidade de cálculo, o modelo de Gordon constitui uma primeira abordagem para a estimação do preço de uma ação. Assim, antes de lançar mão de análises mais detalhadas ou de outras ferramentasde precificação, o analista pode usar a fórmula proposta para ter uma noção da ordem de grandeza do preço justo de uma ação. 4.1 Exercício de fixação - Custo médio ponderado de capital Na avaliação de empresas ou na análise de viabilidade de projetos, um parâmetro financeiro importante é o custo médio ponderado de capital, também conhecido pela sigla em inglês WACC (Weighted Average Cost of Capital). O WACC representa a taxa de juros que reflete o risco dos ativos da empresa e pode, portanto, ser utilizado como taxa de desconto de fluxos de caixa de uma empresa ou de fluxos de caixa de um projeto com o mesmo risco da empresa. A fórmula do WACC é dada por: (4.4) na qual • wE representa a participação do patrimônio líquido no total do passivo da empresa; • wD representa a participação da dívida no total do passivo da empresa; • rE representa o custo de capital ou a taxa de juros compatível com o risco das ações da empresa; • rD representa o custo da dívida da empresa; e • I representa a alíquota marginal do imposto de renda. Pode-se programar, a partir da equação anterior 4.4, funções que permitam calcular cada uma das variáveis (WACC, rE, rD, wE, wD, I) a partir das outras. A variável I deve ser definida como opcional quando servir como parâmetro de entrada de uma função. Apesar de impostos serem inexoráveis, em algumas aplicações de WACC pode-se utilizar I = 0 como premissa. Capítulo 5 Modelos de valor presente Nos capítulos anteriores, foram discutidas funções em VBA básicas que poderiam ser facilmente implementadas no ambiente de planilha sem a necessidade de utilização de programação. Ou seja, o leitor pode estar se perguntando qual seria a vantagem de se programar no Excel. A partir desse capítulo, serão estudadas funções mais trabalhosas que justificam o uso de programação. Para manter o didatismo, as funções serão discutidas aumentando-se a complexidade gradativamente. A flexibilidade do Excel em permitir a repetição de um mesmo cálculo básico em diversas células de uma planilha representa uma característica extremamente poderosa. Esta facilidade em repetir cálculos implica ganhos de produtividade consideráveis, pois uma mesma fórmula é replicada em várias células usualmente adjacentes. A repetição de cálculos pode ser realizada rapidamente na planilha do Excel, sem a necessidade de programação. Usuários com conhecimentos básicos de Excel frequentemente realizam as várias repetições nas próprias células da planilha, tornando-a, muitas vezes, bastante poluída. Em algumas situações, os cálculos repetitivos constituem passos intermediários do resultado de interesse. Por exemplo, para o levantamento do valor presente líquido, VPL, de um projeto é necessário trazer a valor presente os vários fluxos de caixa que ocorrem em períodos diferentes. Uma vez obtidos os valores presentes de cada fluxo, calcula-se o valor presente líquido consolidando-os. Assim, no ambiente da planilha, o usuário muitas vezes se vê obrigado a explicitar, em diversas células, alguns cálculos intermediários, para que estes possam ser utilizados na obtenção do resultado final de interesse. Utilizando o VBA do Excel, estes cálculos intermediários podem ser realizados sem a necessidade de ocupação de células, pois valores auxiliares são calculados pelo algoritmo e armazenados em variáveis que podem ser acessadas e processadas para a obtenção do resultado de interesse. A planilha torna-se mais limpa, com menos células preenchidas. Neste contexto, considerando que a repetição de cálculos envolve a entrada de um conjunto de dados de uma mesma natureza como, por exemplo, fluxos de caixa, o objetivo didático deste capítulo é discutir a implementação de funções que envolvem parâmetros definidos por intervalos de células. Esse aspecto representa uma inovação importante em relação às funções discutidas nos capítulos anteriores, pois permite que um parâmetro de entrada seja não somente uma célula, mas um conjunto de células. Para uma discussão sobre os temas deste capítulo o leitor pode consultar a obra de Fabozzi (1999). 5.1 Uma breve referência a finanças A partir do problema financeiro básico de cálculo do valor presente líquido VPL, abordaremos com maior ênfase as diversas formas de leitura e de uso de dados apresentados em intervalos de células. A discussão do VPL permite ilustrar a flexibilidade do VBA para a resolução de problemas financeiros. Em particular, evidenciaremos as limitações de funções predefinidas no Excel. No caso do VPL, a função predefinida no Excel envolve premissas extremamente restritivas podendo ser aplicada em situações muito específicas. Ou seja, as funções predefinidas do Excel não são adequadas para problemas de finanças mais práticos. Assim, em situações mais genéricas, a implementação de funções em VBA torna-se, portanto, imprescindível. Destaca-se que o conceito de valor presente fundamenta diversas aplicações financeiras como, por exemplo, o estudo de viabilidade de projetos, a estimativa de preço de ações, a análise de sensibilidade de preços de ativos de renda fixa, etc. 5.1.1 Modelo geral Genericamente, um ativo ou um projeto pode ter uma configuração qualquer de fluxos de caixa, conforme ilustrado na figura a seguir: Figura 5.1: Fluxos de caixa (FC) genéricos e estrutura temporal de taxas de juros. Na Figura 5.1 é também apresentada a estrutura temporal de taxa de juros à vista que representa o custo do dinheiro ri em função do prazo ti. Por exemplo, o fluxo de caixa FC2, que ocorre no prazo t2, deve ser trazido a valor presente por uma taxa de juros r2 ao período. Matematicamente, o Valor Presente Líquido (VPL) é calculado através da seguinte equação: (5.1) É importante observar que fluxos de caixa genéricos envolvem diversos desembolsos e recebimentos, que ocorrem em períodos diferentes. Não necessariamente os fluxos de caixa FC0...FCn são iguais nem os intervalos entre os prazos t0 ... tn de ocorrência dos fluxos de caixa são constantes. Além disso, cada fluxo FCi que ocorre no prazo i pode ser descontado a uma taxa de juros ri distinta, refletindo a possibilidade de que a estrutura temporal de taxa de juros não seja constante. Note que no capítulop anterior, o modelo de Gordon possui simplificações relevantes como, por exemplo, fluxos igualmente espaçado se taxa de juros constate. 5.2 Valor presente líquido As observações apresentadas anteriormente são importantes, pois funções do Excel para cálculo de valor presente têm limitações extremamente críticas. Por exemplo, a função VPL do Excel, que calcula o valor presente líquido, parte da premissa de que os fluxos de caixa são igualmente espaçados ao longo do tempo. Além disso, o fluxo inicial na função VPL do Excel ocorre em t0 = 1. Estes elementos parecem ser detalhes pouco significantes, mas na prática, têm implicações consideráveis, pois exigem cuidados adicionais por parte do analista, uma vez que as especificações dos parâmetros da função do Excel não são imediatas nem genéricas o suficiente. Em particular, o VPL do Excel considera que o primeiro fluxo ocorre em t0 = 1, o resultado gerado sempre é defasado em relação ao conceito tradicional de VPL, no qual t0 comumente é zero. Adicionalmente, fluxos com prazos que não possuem uma frequência regular não podem ser trazidos a valor presente através da função VPL já programada do Excel, uma vez que não há flexibilidade de incorporar fluxos com prazos chamados de não-convencionais, como por exemplo, que não acontecem em intervalos iguais. Além disso, usar a função VPL do Excel, que serve para calcular o valor presente e não o valor presente líquido, também pode não ser adequado, pois esta função parte da premissa de que os fluxos de caixa são, além de periódicos, constantes. Finalmente, na função VPL do Excel, todos os fluxos são descontados a uma mesma taxa de juros, ou seja, r0 = r1 = r2 = ... = r. Assim, em termos matemáticos, a função VPL do Excel operacionaliza um casoparticular do VPL dado pela seguinte equação: (5.2) Comparando as equações 5.1 e 5.2, deve ficar evidente que a função do VPL do Excel representa um modelo simplificado, no qual a taxa de juros é constante e os prazos são igualmente espaçados e inteiros, isto é, não são permitidos prazos fracionados como, por exemplo, 1,5 anos. Além disso, conforme já discutido, existe um descompasso no fluxo de caixa inicial, pois para a função VPL do Excel, o primeiro fluxo, FC1 que pode representar o investimento inicial em um projeto, não ocorre imediatamente no instante t0 = 0 ou em um instante arbitrário inicial, mas somente ao final do primeiro período, isto é, t0 = 1. Note que, em uma análise do mundo real, o investimento inicial não precisa ser realizado nem em t0 = 0 ou t0 = 1. Desta forma, a equação 5.1 permite flexibilidade na escolha do momento exato do início do fluxo inicial. Eventualmente, uma empresa pode estar avaliando um investimento, cujo primeiro desembolso ocorrerá em 4 meses e meio, por exemplo, e não imediatamente. Obviamente, alguns ajustes podem ser utilizados para compatibilizar a função VPL do Excel com a equação denotada em 5.1. Porém, quando os fluxos de caixa não obedecem a uma periodicidade constante, como é o caso da maioria das aplicações financeiras reais, o uso da função do VPL do Excel fica comprometido, pois os parâmetros desta função não conferem liberdade o suficiente para o usuário incorporar informação sobre os prazos exatos dos fluxos de caixa. Ressalta-se, portanto, que as funções financeiras do Excel, assim como as de uma calculadora financeira tradicional como a HP-12C, são adequadas para fins didáticos, não devendo ser utilizadas para aplicações com aspectos mais genéricos e reais. Desta forma, mesmo problemas simples não são facilmente avaliados a partir do uso imediato da função VPL do Excel ou de uma função equivalente da HP-12C. Exemplificando, o VPL dos fluxos de caixa a seguir não pode ser analisado sem ajustes dos parâmetros de entrada às funções financeiras do Excel, pois os fluxos não ocorrem em períodos convencionais, igualmente espaçados. Figura 5.2: Exemplo de fluxos de caixa que necessitam de ajustes para o uso da função VPL do Excel. Portanto, do ponto de vista prático, dadas as limitações das fórmulas predefinidas do Excel, é mais conveniente desenvolver uma planilha própria ou uma função específica. 5.2.1 Taxa de juros constante Suponha que um analista queira calcular o VPL de um projeto, no qual o investimento inicial é $100 e os fluxos projetados para os próximos dois anos são iguais a $110 e $150, conforme mostrado na Figura 5.3. Suponha que a taxa de desconto seja constante ao longo de todo período de análise e equivalente a 20% ao ano. Figura 5.3: Exemplo de fluxos de caixa de um projeto. Usando a equação 5.1 genérica, temos o seguinte cálculo: Observe que, no caso especial em que o primeiro fluxo ocorre no momento t0 = 0, a taxa de juros r0 se torna irrelevante, pois (1+0,20)0 = 1. A planilha a seguir é um possível exemplo de implementação deste procedimento de cálculo do valor presente líquido no Excel: Figura 5.4: Exemplo de cálculo do VPL usando o Excel. 5.2.2 Taxa de juros variável O conceito desenvolvido na planilha em Excel permite também obter o valor presente líquido considerando casos razoavelmente genéricos, nos quais os prazos de cada fluxo de caixa ocorrem em instantes sem uma determinada periodicidade. Além disso, no contexto das aplicações financeiras reais, a estrutura temporal de taxa de juros à vista não é constante em função do prazo e, portanto, a premissa de que r0 = r1 = r2 = ... = r na equação 5.2 não é adequada. Por exemplo, vamos considerar o valor presente líquido dos fluxos da situação da Figura 5.5. Figura 5.5: Exemplo de fluxos de caixa de um projeto. Observe que os prazos não são igualmente espaçados e ainda envolvem valores que não são inteiros. Por exemplo, o primeiro fluxo ocorre em 0,25 anos, ou seja, em 3 meses, o segundo fluxo em 0,75 anos, isto é, 9 meses e o último, em 2 anos e 3 meses. A configuração destes fluxos exige diversos ajustes para serem analisados a partir da função VPL do Excel. Assim, ao invés de tentar ajustar os dados para usar uma função predefinida, é mais fácil utilizar os recursos da planilha, conforme ilustrado a seguir: Figura 5.6: Exemplo de cálculo do VPL usando o Excel. Assim, a falta de flexibilidade da função VPL do Excel é facilmente superada pela estruturação de uma planilha que realiza diversos cálculos em células intermediárias e totaliza o valor presente líquido, como mostrado na célula D5 da Figura 5.6. Praticamente todo usuário de Excel que precisa fazer um cálculo de VPL com uma configuração de fluxos pouco convencional já desenvolveu uma planilha semelhante à discutida anteriormente. Porém, uma forma mais elegante de resolver o problema de valor presente líquido genérico envolve a elaboração de uma função do Excel que permita uma flexibilidade para avaliar diversas configurações de fluxos de caixa. Apesar de a aplicação ser simples, o leitor poderá visualizar a potencialidade do VBA do Excel. O uso de um exemplo de estruturação de uma função para cálculo do valor presente líquido possibilita ilustrar como obter parâmetros de entrada que correspondem a um conjunto de células e não a células individualmente como feito nos capítulos anteriores. Deve-se ressaltar que, enquanto nas funções dos capítulos anteriores, nas quais os parâmetros de entrada eram representados por células individuais, por exemplo, o beta do ativo era incorporado a partir da leitura de um valor em uma célula, na função desenvolvida neste capítulo, parâmetros de entrada são representados por um conjunto de células representativo de uma série de dados. Observe que o cálculo do VPL envolve uma sequência de valores correspondentes à série temporal na qual o fluxo de caixa é contabilizado sob uma taxa de juros correspondente ao período. 5.2.3 Programando em VBA o VPL a uma taxa de juros variável Como exemplo, podemos supor o fluxo de caixa de um investimento de $200,00 que gera os seguintes fluxos subsequentes dados pela Tabela 5.1 a seguir: t(Meses) Fluxo de Caixa Taxa de Juros Valor Presente 0,0 $-200,00 1,00% $-200,00 0,5 $100,00 1,20% $99,41 1,0 $200,00 1,30% $197,43 2,3 $300,00 1,50% $289,90 2,5 $50,00 1,60% $48,05 3,0 $60,00 1,80% $56,87 4,0 $-40,00 1,90% $-37,10 4,5 $300,00 2,00% $274,42 Valor Presente Líquido $728,99 Tabela 5.1: Exemplo de fluxo de caixa e cálculo do valor presente líquido. Note que os fluxos de caixa ocorrem em intervalos de tempos variáveis. A coluna mais a direita representa o cálculo de cada termo do somatório da fórmula, juntamente com o VPL ao final da coluna. Vamos colocar estes valores numa planilha do Excel: • Abra o Excel • Digite os seguintes valores: Figura 5.7: Valores do exemplo de cálculo do valor presente líquido. • Inicie o editor do VBA; e • Insira novo módulo através da opção “Módulo” do menu “Inserir” [CTRL] + [M]. Digite o código a seguir: 01 02 03 04 05 06 Function fncVPL(T, FC, R) As Double Dim i As Integer For i = 1 To T.Count fncVPL = fncVPL + FC(i) / (1 + R(i)) ^ T(i) Next i End Function Código 5.1: Código-fonte 17. Vá para a planilha aberta ou feche o editor do VBA. • Em B11, digite o texto “VPL”; e • Digite na célula C11 a fórmula =fncVPL(A2:A9;B2:B9;C2:C9). O valor que a fórmula recém criada retorna é dado, a seguir, equivalente ao que foi encontrado na Tabela 5.1 sem a necessidade de células auxiliares serem preenchidas: Figura 5.8: Ilustração do valor retornado para a fórmula do valor presente líquido. Vamos entender o código. A função, desenvolvida pelo usuário, foi batizada de fncVPL, na qual são passados os argumentos como variáveis denominadas: T (Prazo), FC (Fluxo de Caixa) e R (Taxa de Juros). Note que na chamada da função, todas as variáveis estão representando uma série de dados.O VBA traz flexibilidade para o programador, pois não há a necessidade de, a priori, se definir o tamanho, i.e., o número de células na série. No exemplo, T representa as células A2, A3, A4, A5, A6, A7, A8, A9, ou ainda, na notação do Excel, a seleção de um conjunto de células no intervalo A2:A9. O mesmo vale para as outras variáveis, FC e R. Caso os dados de entrada envolvessem mais fluxos, isto é, células, bastaria na planilha do Excel selecionar essas células na função fncVPL, não sendo necessário alterar o código. Assim, voltando ao código, temos uma nova instrução: Dim que indica ao interpretador do VBA que seja dimensionado um espaço na memória, de tamanho apropriado para um número do tipo inteiro (2 bytes), para a variável i. Ela será usada na próxima instrução. A variável i possui a mesma representatividade da fórmula do VPL, identificando os termos do somatório. Assim, o laço For percorre através de i, valores de 1 ao número de termos da série temporal (Número de células no intervalo A2:A9). Em VBA este valor pode ser acessado por T.Count. Count é uma propriedade do argumento passado para a função. Isto é, quando a função recebe, como argumento, a referência a uma célula ou um intervalo de células, por exemplo: A2, ou A2:A9 respectivamente, a variável criada é uma coleção de objetos do tipo célula. A propriedade Count de T retorna então o número de objetos que a coleção contém, ou seja, o número de células entre A2:A9. Desse modo, em nosso exemplo i irá percorrer valores inteiros entre 1 e 8 numa estrutura de laço que calcula o VPL: fncVPL = fncVPL + FC(i) / (1 + R(i)) ˆ T(i) O somatório é então implementado como uma soma incremental do fncVPL com seus termos seguintes. O acesso ao valor de cada termo da série de dados pode ser feito como no código proposto: FC(i) representa o i-ésimo termo da série do fluxo de caixa, representado pela variável FC. Utilizamos então os i-ésimos termos da taxa de juros e do prazo, R(i) e T(i) respectivamente. Next fecha o laço, incrementando o valor do i, e retornando para o início do laço. Enquanto i estiver dentro do intervalo [1, T.Count], definido por i = 1 To T.Count, o código entre o laço For e Next será executado. Note que a função criada deixa a planilha mais “limpa”. A sequência de eventos pode ser ilustrada pelo fluxograma a seguir: Figura 5.9: Fluxograma da função fncVPL. 5.2.4 Programação em VBA do VPL a uma taxa de juros constante Agora, vamos supor a seguinte situação: t(Meses) Fluxo de Caixa Taxa de Juros Valor Presente 0,0 $-200,00 1,00% $-200,00 0,5 $100,00 $99,50 1,0 $200,00 $198,02 2,3 $300,00 $293,21 2,5 $50,00 $48,77 3,0 $60,00 $58,24 4,0 $-40,00 $-38,44 4,5 $300,00 $286,86 Valor Presente Líquido = $746,17 Tabela 5.2: Exemplo de fluxo de caixa e cálculo do valor presente líquido. Os valores das taxas e o fluxo de caixa continuam os mesmos. Mas temos uma taxa de juros constante durante todo o período, 1,00%. O valor de cada termo do somatório do VPL está representado pela coluna mais a direita. A nossa fórmula fncVPL permite obter o valor do VPL, desde que nossa taxa de juros tenha a mesma dimensão das outras variáveis, que também seja uma série de dados. Mas pode-se modificar nosso código a permitir que situações como esta possam ser contempladas com uma fórmula, na qual a taxa de juros é uma constante. Segue o código: 01 02 03 04 05 06 Function fncVPL2(T, FC, R) As Double Dim i As Integer For i = 1 To T.Count fncVPL2 = fncVPL2 + FC(i) / (1 + R) ^ T(i) Next i End Function Código 5.2: Código-fonte 18. Note que no código, a taxa de juros perdeu seu índice. Neste caso, a taxa de juros deve ser um valor numérico, ou uma referência a uma única célula. Caso seja fornecido um intervalo de células, como no caso anterior, a fórmula retornará um erro. Observe o resultado para este caso: Figura 5.10: Ilustração da aplicação da função fncVPL2. Podemos criar um código que preveja as duas situações: taxa de juros variável ou constante. Se a taxa de juros for uma série de dados, o código a ser executado é semelhante ao fncVPL, caso contrário, semelhante ao fncVPL2: 01 02 03 04 05 06 07 08 09 10 11 12 Function fncVPL3(T, FC, R) As Double Dim i As Integer If IsArray(R) Then For i = 1 To T.Count fncVPL3 = fncVPL3 + FC(i) / (1 + R(i)) ^ T(i) Next i Else For i = 1 To T.Count fncVPL3 = fncVPL3 + FC(i) / (1 + R) ^ T(i) Next i End If End Function Código 5.3: Código-fonte 19. Uma nova instrução foi acrescentada para decidir o que fazer, caso R seja uma série de dados, ou um vetor. Para isso, usamos uma função do VBA que retorna um valor tipo Boolean (True ou False) quando aplicada num objeto. IsArray(R) retorna True quando R for uma série de dados, isto é, um vetor de dados. Assim, a estrutura de decisão If... Then... Else pode ser utilizada. A linha 3 do código (If IsArray(R) Then) pode ser lida como: “Se R for um vetor, então...”; na linha 5 temos o código utilizando os termos da série da taxa de juros R(i) para a resposta True da instrução IsArray(R), “Sim, R é um vetor”. Na linha 7 temos: “Senão...” ou “Se R não for um vetor...”, e temos o laço For... Next utilizando uma taxa de juros constante para todos os termos do somatório. A linha 11 com a instrução End If encerra a estrutura de decisão If... Then... Else. Agora teste você mesmo. A função fncVPL3 é válida para as duas situações. Ela prevê tratamentos distintos para a entrada da taxa de juros na função. Seja numa situação na qual a taxa de juros é constante: • Em C11 a fórmula “=fncVPL3(A2:A9;B2:B9;C2)”; • Ou a fórmula “=fncVPL3(A2:A9;B2:B9;0,01)”; e • Ou uma série de dados pela fórmula “=fncVPL3(A2:A9;B2:B9;C2:C9)”. 5.2.5 Programação em VBA de modelo geral para VPL Já que estamos nos familiarizando a trabalhar com vetores de dados, podemos implementar a fórmula do VPL, trabalhando com uma visão matricial da situação. Vamos criar uma função, na qual o único argumento seja a seleção A2:C9, por exemplo, as três colunas numa única seleção: prazo, fluxo de caixa e taxa de juros, nesta ordem e com valores numéricos em todas as células (Figura 5.11). Observe que em C11 a fórmula é “=fncVPL4(A2:C9)”. Podemos fazê-lo dessa forma porque o Excel interpreta a seleção A2:C9 como um vetor de dados com a sequência: A2, B2, C2, A3, B3, C3, A4, B4, C4... Ou seja, o vetor possui referência às células, percorrendo as linhas, uma a uma, colocando em fila, da esquerda para a direita e de cima para baixo, cada célula pertencente ao intervalo da seleção. O código, assim, deve tratar esta característica da lista de valores atribuídos ao argumento passado para a função (Código-fonte 20). Figura 5.11: Ilustração da aplicação da função fncVPL4. A função foi definida com o nome de fncVPL4 e a única variável de entrada se chama VPL. Este nome pode ser qualquer um, a não ser algum elemento da lista de termos exclusivos do VBA. Como o cálculo do VPL envolve três listas de valores, a linha 4 está definida para que o vetor de dados VPL, indexado pela variável i, seja incrementada, de três em três unidades, garantindo a varredura de uma linha que correspondem ao tempo, fluxo de caixa e taxa de juros, relativos ao primeiro item da série, respectivamente. As linhas 5, 6 e 7, dentro do laço For, atribui cada valor do vetor em uma variável mnemônica (T, FC e R), declaradas na linha 3, e calcula iterativamente o VPL na linha 8. 01 02 03 04 05 06 07 08 09 10 Function fncVPL4(VPL) As Double Dim i As Integer Dim T, FC, R As Double For i = 1 To VPL.Count Step 3 T = VPL(i) FC = VPL(i+1) R = VPL(i+2) fncVPL4 = fncVPL4 + FC / (1 + R) ^ T Next i End Function Código 5.4: Código-fonte 20. O código poderia ser escrito também como: 01 02 03 04 05 06 07 Function fncVPL5(VPL) As Double Dim i As Integer For i = 1 To VPL.Count Step 3 fncVPL5 = fncVPL5 + _ VPL(i + 1) / (1 + VPL(i + 2)) ^ VPL(i) Next i End Function Código 5.5: Código-fonte 21. Assim, como o primeiro elemento do vetor é o prazo, o segundo elemento
Compartilhar