Notifications
Clear all

REFERENCIAS MUTANTES em vba

6 Posts
1 Usuários
0 Reactions
1,376 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Po galera, estou com um problema dificílimo. Estou tentando criar no excel um tipo de programinha que controle as minhas finanças. Mas um dos requisitos desse programinha eu não consigo colocar em prática, pois ele possui variáveis que demais (do meu ponto de vista iniciante). O exemplo é o seguinte, imagine por exemplo que eu defina todo mês uma certa "verba" para pagar gastos com jogos na internet, por exemplo. A cada vez que eu adicionar uma conta paga referente a esse gasto, ele deve descontar dessa verba. Até aí eu consegui fazer algumas funções, mas nada no vba. O problema começa quando eu tenho que definir que a cada início de mês essa verba retorna ao seu valor original. Sendo assim o valor nunca ficaria negativo e eu saberia quanto falta para gastar no mês. A única forma que eu encontrei para solucionar esse problema, seria cadastrar uma tabela com os dias específicos que o vba deveria retornar a verba ao seu valor original. Mas acredito que haja um modo de não cadastrar essa tabela, pois senão teria de atualiza-lá sempre ou fazer uma tabela gigante, para nunca mais me preocupar com esse valores.

Abaixo segue um exemplo do que eu desejo.

VERBA MÊS DATAFINAL
R$ 1000,00 MARÇO 31/03/2011 (essa data varia conforme o mês)

CONTA Nº DATAINCLUSÃO VALOR RESTANTEVERBA
05 23/03/2011 R$ 550,00 R$ 450,00
06 27/03/2011 R$ 300,00 R$ 150,00
07 04/04/2011 R$ 100,00 R$ 900,00 (neste caso a verba já retornou ao seu valor original, devido ao mês ter sido modificado)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 06/08/2011 5:44 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Cara,
Pq você não faz isso tudo em excel puro, sem VBA.

Pelo que vejo é uma coisa 'simples' que vai dar mais trabalho fazer em vba, do que somente formulas no excel.

tem que ser VBA?

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/08/2011 7:57 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Então Sr. Caio,

Eu estou montando um programinha no vba, porque quem vai usá-lo, especificamente, não sou eu. E usando os forms do vba, uma pessoa leiga consegue entender melhor os resultados. Ocorre também o problema de que essa mesma pessoa, fazendo o trabalho na tabela poderia gerar erros que ela desconhece, por não entender o funcionamento das funções, com o vba eu diminuo as ocorrências de erro. E tem um outro motivo, perde a graça do desafio se eu desistir de fazer no vba neh. Mas valeu pela atenção.

Abraços

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/08/2011 2:46 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite,

Acredito que a seguinte fórmula, na célula D3, resolveria o problema:

=SE(MÊS(B3)=MÊS(B2);D2-C3;1000-C3)

Depois seria só copiá-la para as demais células da coluna D.

Tendo em vista que você quer que seja em VBA, talvez este código, que deve ser colocado no evento "Change" da sua planilha, te ajude:

Private Sub Worksheet_Change(ByVal Target As Range)
    If WorksheetFunction.CountBlank(Range("A" & Target.Row & ":C" & Target.Row)) = 0 Then
        Range("D" & Target.Row).FormulaR1C1Local = "=SE(MÊS(LC[-2])=MÊS(L[-1]C[-2]);L[-1]C-LC[-1];1000-LC[-1])"
    End If
End Sub

O código coloca a mesma fórmula na coluna D onde houver alteração.
Caso não queira uma fórmula e sim o valor direto:

Private Sub Worksheet_Change(ByVal Target As Range)
    If WorksheetFunction.CountBlank(Range("A" & Target.Row & ":C" & Target.Row)) = 0 Then
        If Month(Range("B" & Target.Row).Value) = Month(Range("B" & Target.Row - 1).Value) Then
            Range("D" & Target.Row).Value = Range("D" & Target.Row - 1).Value - Range("C" & Target.Row).Value
        Else
            Range("D" & Target.Row).Value = 1000 - Range("C" & Target.Row).Value
        End If
    End If
End Sub

Lembrando que o código só altera o valor da linha que houver alteração, portanto se houver alteração numa linha superior o saldo final pode ficar desatualizado.
Espero que seja isso.

Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/08/2011 6:00 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Muito obrigado Jvalq, mas não consegui aplicar a seu código no meu sistema. Não consegui entender o significado da formula que vc me passou. Apesar disso, consegui resolver meu problema usando loop, o código ficou muuuuito mais extenso, mas com ele eu consigo entender o que ele está fazendo. A minha falta de conhecimento avançado em VBA está me prejudicando, mas aos poucos eu vou aprendendo. Basicamente a solução que eu encontrei, foi que tive que incluir uma nova coluna com a validade da verba. E sempre que haja mudança na planilha ou quando o sistema é aberto essa validade é verificada com a data atual para saber se mantém o valor já somado ou se retorna ao valor inicial da verba, isso tudo para cada linha da planilha.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 10/10/2011 3:43 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Muito obrigado Jvalq, mas não consegui aplicar a seu código no meu sistema. Não consegui entender o significado da formula que vc me passou. Apesar disso, consegui resolver meu problema usando loop, o código ficou muuuuito mais extenso, mas com ele eu consigo entender o que ele está fazendo. A minha falta de conhecimento avançado em VBA está me prejudicando, mas aos poucos eu vou aprendendo. Basicamente a solução que eu encontrei, foi que tive que incluir uma nova coluna com a validade da verba. E sempre que haja mudança na planilha ou quando o sistema é aberto essa validade é verificada com a data atual para saber se mantém o valor já somado ou se retorna ao valor inicial da verba, isso tudo para cada linha da planilha.

Abaixo segue o loop que fiz


Public Sub LIMITEATUAL()
' FAZ O CALCULO DO LIMITE ATUAL DAS CATEGORIAS NA TABELA DE CATEGORIAS
    Dim LIN As Integer
    Dim LINB As Integer
    Dim CREDITO As Currency
    Dim DEBITO As Currency
    Dim MSG As String
' CLASSIFICA A TABELA CATEGORIAS
    Sheets("CADASTROCATEGORIA").Select
    Range("A3:H103").Select
    ActiveWorkbook.Worksheets("CADASTROCATEGORIA").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("CADASTROCATEGORIA").Sort.SortFields.Add Key:=Range("D4:D103"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("CADASTROCATEGORIA").Sort.SortFields.Add Key:=Range("B4:B103"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("CADASTROCATEGORIA").Sort.SortFields.Add Key:=Range("A4:A103"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("CADASTROCATEGORIA").Sort
        .SetRange Range("A3:H103")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
' CLASSIFICA AS CONTAS A PAGAR DA TABELA FLUXO
    Sheets("FLUXO").Select
    Range("A3:K50003").Select
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("F4:F50003"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("B4:B50003"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("FLUXO").Sort.SortFields.Add Key:=Range("D4:D50003"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("FLUXO").Sort
        .SetRange Range("A3:K50003")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    LIN = 4
    LINB = 4
    CREDITO = 0
    DEBITO = 0
    Do While Worksheets("CADASTROCATEGORIA").Cells(LIN, 2).Value <> ""
        If Worksheets("CADASTROCATEGORIA").Cells(LIN, 4).Value = "S" Then
            If Worksheets("CADASTROCATEGORIA").Cells(LIN, 2).Value = Worksheets("FLUXO").Cells(LINB, 4).Value Then
                If Worksheets("FLUXO").Cells(LINB, 6).Value = "FECHADO" Then
                    If CDate(Format(Worksheets("CADASTROCATEGORIA").Cells(LIN, 7).Value, "DD/MM/YYYY")) >= CDate(Format(Worksheets("FLUXO").Cells(LINB, 2).Value, "DD/MM/YYYY")) And CDate(Format(Worksheets("CADASTROCATEGORIA").Cells(LIN, 8).Value, "DD/MM/YYYY")) <= CDate(Format(Worksheets("FLUXO").Cells(LINB, 2).Value, "DD/MM/YYYY")) Then
                        If Worksheets("FLUXO").Cells(LINB, 10).Value = "D" Then
                            DEBITO = DEBITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                            LINB = LINB + 1
                        ElseIf Worksheets("FLUXO").Cells(LINB, 10).Value = "C" Then
                            CREDITO = CREDITO + Worksheets("FLUXO").Cells(LINB, 5).Value
                            LINB = LINB + 1
                        Else
                            LINB = LINB + 1
                        End If
                    Else
                        LINB = LINB + 1
                    End If
                Else
                    LINB = LINB + 1
                End If
            Else
                LINB = LINB + 1
            End If
        Else
            LIN = LIN + 1
        End If
        If Worksheets("FLUXO").Cells(LINB, 2).Value = "" Then
            Worksheets("CADASTROCATEGORIA").Cells(LIN, 6).Value = CREDITO - DEBITO
            If Worksheets("CADASTROCATEGORIA").Cells(LIN, 6).Value > Worksheets("CADASTROCATEGORIA").Cells(LIN, 5).Value And Worksheets("CADASTROCATEGORIA").Cells(LIN, 4).Value = "S" Then
                MSG = MsgBox("A CATEGORIA " & Worksheets("CADASTROCATEGORIA").Cells(LIN, 2).Value & " ULTRAPASSOU O LIMITE ESTABELECIDO, POR FAVOR, VERIFIQUE POSSÍVEIS ERROS, OU SE É NECESSÁRIO A ATUALIZAÇÃO DA COTA, OU AINDA, SE O VALOR REALMENTE SERÁ LANÇADO NEGATIVO.", vbOKOnly, "CUIDADO LIMITE ULTRAPASSADO")
            End If
            LIN = LIN + 1
            LINB = 4
            CREDITO = 0
            DEBITO = 0
        End If
    Loop
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/02/2012 9:43 am