terça-feira, 18 de novembro de 2014

Atualização de valores - exemplo com IGP-M no VBA do Access

Olá!
Há tempos não publico uma nova dica... então dando continuidade, vai um código para atualizar valores pelo IGP-M (índice geral de preços - mercado).
Antes de mais nada, vale levar em consideração alguns aspectos importantes desta atualização (o cálculo em si é simples):

- Embora o IGP-M seja publicado sempre no final do mês, eu coloquei na minha tabela o primeiro dia apenas para facilitar o SELECT. Poderia criar uma função para entrar sempre com o último dia do mês que é o mais usual nestes casos, foi só uma opção mesmo;

- No site da FVG - http://fgv.br é difícil encontrar as tabelas de índices, geralmente estão em arquivos PDF. No site do Debit é mais fácil e tem uma URL fixa: https://www.debit.com.br/consulta30.php?&indice=igpm;

- Cuidado com as variações negativas: contratos de aluguel por exemplo, costumam ter cláusulas do tipo "correção pela variação positiva do IGP-M" o que equivale a dizer que, caso o índice seja negativo, não haverá redução do valor atualizado, o que pelo cálculo ocorre. Nos meses onde a variação é negativa, o valor "atualizado" é simplesmente mantido. Muito cuidado nesta questão;

- Para conferir os cálculos utilize a calculadora do cidadão no site do Banco Central: https://www3.bcb.gov.br/CALCIDADAO/publico/exibirFormCorrecaoValores.do?method=exibirFormCorrecaoValores

- Como sempre, não esqueçam de marcar a referência Microsoft Activex Data Objects (a versão mais recente que tiver, eu utilizo a 2.8)

Bem, abaixo segue o código e uma imagem da minha tabela para melhor entendimento.

;-)
Option Compare Database
Option Explicit

Dim rst         As ADODB.Recordset
Dim ssql        As String
Dim acumulador  As Double
Dim i           As Integer

Public Function Atualiza_IGPM(MesInicio As Integer, _
                                AnoInicio As Integer, _
                                MesFim As Integer, _
                                AnoFim As Integer, _
                                valor As Double) As Double

    ssql = "SELECT * FROM tabela1 WHERE "
    ssql = ssql & "DataIndice >= #" & MesInicio & "/1/" & AnoInicio & "#"
    ssql = ssql & "ORDER BY DataIndice"
    
    Set rst = New ADODB.Recordset
    rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst.MoveFirst
    
    'Primeiro índice
    acumulador = 0
    acumulador = (rst!indice / 100) + 1
    rst.MoveNext
    
    Do While Not rst.EOF
    
        'Acumular taxas
        acumulador = acumulador * ((rst!indice / 100) + 1)
        
        If rst!mes = MesFim And rst!ano = AnoFim Then
            Exit Do
        Else
            rst.MoveNext
        End If
    
    Loop
        
    Atualiza_IGPM = Round(valor * ((acumulador - 1) * 100), 5)

    rst.Close
    Set rst = Nothing

End Function


Nenhum comentário:

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.