Views

Histats

Vitrine

VBA Tips Exclusive - Geração Espontânea de Datas Retroativas



Se olharmos para o passado, analisando os inúmeros anos de experiência que temos, quais desenvolvedores, às vezes temos a impressão de que neste anos todos, várias vezes, desenvolvemos diversas funcionalidades (códigos) que serviram exclusivamente as nossas necessidades pontuais. Pensamos: 'Não é possível que alguém mais no mundo, precise de algo sequer parecido com esse código que acabei de desenvolver'.

Tal impressão de que os nossos códigos são tão proprietários que até seria inútil compartilhá-los com outros, impede-nos de trazer à tona soluções criativas que poderiam auxiliar muitos desenvolvedores mundo à fora.

O que segue é uma reflexão neste sentido. Olhando o passado, olha a ironia da funcionalidade do código, Percebi que tinha um código desenvolvido para a Geração Espontânea de Datas Retroativas. E este parecia-me encaixar-se na descrição do primeiro parágrafo. Os seus comentário a posteriori, é que me dirão se ele foi útil, ou não.

Sintaxe: GeraMonths(<Parâmetro>) <Retorna data no formato mmm|yy>

Se parametrizarmos com '0' (zero), retorna uma lista retroativa com todos os próximos 11, além do atual.

? GeraMonths(0) ' Supondo que estejamos no mês 05/2013:

mai|13
abr|13
mar|13
fev|13
jan|13
dez|12
nov|12
out|12
set|12
ago|12
jul|12
jun|12

Qualquer outro número, retornar o respectivo mês retroativo a partir do atual.

? GeraMonths(1) ' Supondo que estejamos no mês 05/2013:

mai|13

? GeraMonths(2) ' Supondo que estejamos no mês 05/2013:

abr|13

? GeraMonths(12) ' Supondo que estejamos no mês 05/2013:

jun|12

Divirta-se!

Function GeraMonths (MonthNumber As Byte) As String
    '        Author: André Luiz Bernardes - Bernardess@gmail.com.
    '          Date: 28/05/2012 - 10:30.
    '   Application:
    ' Functionality: Gera uma lista de 12 meses retroativos ao atual no formato "mmm|yy".
    
    Dim nMonth As String
    Dim i As Integer
    Dim j As Integer
    Dim k As Boolean
    Dim l As Boolean

    Let i = 0
    Let j = 0
    Let k = True
    Let l = True
    
    ' Gera 12 meses a partir do mês atual.
    While i < 12
    
        ' Na 1ª vez gera o mês atual.
        If k Then
            Let nMonth = Format(Now(), "mmm") & "|" & Format(Now(), "yy")
            
            Let k = False
        Else ' Apartir da 1ª vez subtrai 31 dias.

            ' A partir do mês de Jan o ano precisa ser subtraido por 1.
            If InStr(1, nMonth, "jan") <> 0 Then
                Let l = False
            End If

            If l Then
                Let nMonth = Format(Now() - j, "mmm") & "|" & Format(Now(), "yy")
            Else
                Let nMonth = Format(Now() - j, "mmm") & "|" & Format(Now(), "yy") - 1
            End If
        End If

        Let i = i + 1
        Let j = j + 31

        If MonthNumber = i Then
            Let GeraMonths = nMonth
            
            Debug.Print i & " - " & nMonth
        ElseIf MonthNumber = 0 Then
            Let GeraMonths = nMonth

            Debug.Print i & " - " & nMonth
        End If
    Wend
End Function

Ahh, claro, mas que desenvolvedor sou eu que não explico qual a funcionalidade para tal código.

Pois bem meus caros, regularmente recebia um arquivo texto com dados de MAT (Últimos 12 meses, mês-a-mês). O cabeçalho deste arquivo vinha com a descrição pouco aplicável ao relatório no qual iria utilizá-lo, algo como: UN12, UN11, UN10, etc...

Precisei criar uma interface, que no momento da importação, imprimisse um novo cabeçalho a tais campos. Este deveria ser indicado pelo usuário responsável pelo processamento.



Pode observar na imagem acima, no canto extremo à direita do formulário, um botão com a imagem de '2 olhos'.
Quando este é pressionado os campos anteriores são automaticamente preenchidos.

O código para isso?

Segue:

Function PreTyping (nField As Byte)
    '        Author: André Luiz Bernardes - Bernardess@gmail.com.
    '          Date: 28/05/2012 - 10:30.
    '   Application:
    ' Functionality: Preenche automaticamente os campos de meses

    'Carrega o nome dos meses.
    If nField = 1 Then
        Let Form_frm_Months.cxExercise01.Value = GeraMonths(1)
        Let Form_frm_Months.cxExercise02.Value = GeraMonths(2)
        Let Form_frm_Months.cxExercise03.Value = GeraMonths(3)
        Let Form_frm_Months.cxExercise04.Value = GeraMonths(4)
        Let Form_frm_Months.cxExercise05.Value = GeraMonths(5)
        Let Form_frm_Months.cxExercise06.Value = GeraMonths(6)
        Let Form_frm_Months.cxExercise07.Value = GeraMonths(7)
        Let Form_frm_Months.cxExercise08.Value = GeraMonths(8)
        Let Form_frm_Months.cxExercise09.Value = GeraMonths(9)
        Let Form_frm_Months.cxExercise10.Value = GeraMonths(10)
        Let Form_frm_Months.cxExercise11.Value = GeraMonths(11)
        Let Form_frm_Months.cxExercise12.Value = GeraMonths(12)
    End If
End Function

Pois é, acho que ninguém vai precisar de uma solução assim. O que você acha? Deixe seus comentários...

Tags: Tips, Exclusive, VBA, geração










LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...