Página 1 de 1

Cálculo sem execução

Enviado: 03 Abr 2018 às 09:25
por AMORIM123
Bom dia

No código do meu "btn_calcular" tenho a instrução que após o preenchimentos dos txtbox é feita uma verificação na sheets("dados") para verificar se já há algum registro com "periodo & empresa" semelhantes, se houver algum registro com essas informações, o usuário é informado por msgbox a sobrescrever as informações já existentes ou não. Até aqui tava rodando lega, porém tive a necessidade de que os cálculos fossem feitos no vba (aplicado para todas as colunas), ao invés de utilizar fórmulas/funções dos recursos nativos do excel (economizar alguns bites!); neste calculo tenho uma condição para formatação do resultado e em seguida uma outra condição para associar um status (coluna J) a depender do "resultado" apresentado.

O cadastro tá sendo feito, mas o cálculo não está sendo feito..da erro em tempo de execução...tipos incompátiveis → sv2 = Cells(quantidade, 4) + Cells(quantidade, 5)
Código: Selecionar todos
Dim periodo As Date
Dim ei, compras, ef, vendas As Currency
Dim linha As Integer
Dim resultado As Double
Dim novoRegistro As Boolean

Set plan = ThisWorkbook.Sheets("Dados")


Set frm = frm_estoque

quantidade = ActiveCell.Row
linha = 2
periodo = frm.txt_periodo.Text
empresa = frm.txt_empresa.Text
ei = frm.txt_ei.Text
compras = frm.txt_compras.Text
ef = frm.txt_ef.Text
vendas = frm.txt_vendas.Text
observacoes = Me.txt_observacoes.Text

novoRegistro = True

plan.Activate
plan.Range("B2").Select

quantidade = ActiveCell.Row
    

    Do While Cells(linha, 2) & Cells(linha, 3) <> ""
    
        busca = plan.Cells(linha, 2) & plan.Cells(linha, 3)
        If busca = periodo & empresa Then
            If MsgBox("Empresa " & empresa & " já cadastrado para o " & periodo & " , deseja sobrescreve-lo?!", vbYesNo) = vbYes Then
            
                
                Cells(linha, 2) = periodo
                Cells(linha, 3) = empresa
                Cells(linha, 4) = ei
                Cells(linha, 5) = compras
                Cells(linha, 6) = ef
                Cells(linha, 7) = vendas
                Cells(linha, 11) = observacoes
                novoRegistro = False
            Else
                novoRegistro = False
                Exit Sub
            End If
        End If
        
        linha = linha + 1
        
            
    Loop
    
    
    If novoRegistro = True Then
        'Cells(linha, 1) = numeracao_automatica
        Cells(linha, 2) = periodo
        Cells(linha, 3) = empresa
        Cells(linha, 4) = ei
        Cells(linha, 5) = compras
        Cells(linha, 6) = ef
        Cells(linha, 7) = vendas
        Cells(linha, 11) = observacoes
    End If
    
    
    
sv1 = Cells(quantidade, 6) + Cells(quantidade, 7)
sv2 = Cells(quantidade, 4) + Cells(quantidade, 5)
resultado = (sv2 - sv1) / Cells(quantidade, 7)

    If resultado = 0# Then
        Cells(quantidade, 8) = Format(VBA.Round((resultado) * 1000, 2), "0.00") & "%"
        Else
        Cells(quantidade, 8) = Format(VBA.Round((resultado) * 100, 2), "0.00") & "%"
    End If
Cells(quantidade, 8) = resultado

    
    
    If resultado <= 80 Then
        '80%
        Cells(quantidade, 9) = "OK"
        Else
        Cells(quantidade, 9) = "CMV<20%"
    End If
    
txt_resultado = Cells(quantidade, 8)

    
    
    
If Me.txt_periodo = "" Then
    MsgBox ("Preenchimento imconpleto! Insira Período"), vbExclamation, aviso
    Me.txt_periodo.SetFocus
    Exit Sub
ElseIf Me.txt_empresa = "" Then
    MsgBox ("Preenchimento imconpleto! Insira Empresa"), vbExclamation, aviso
    Me.txt_empresa.SetFocus
    Exit Sub
ElseIf Me.txt_ei = "" Then
    MsgBox ("Preenchimento imconpleto! Insira EI"), vbExclamation, aviso
    Me.txt_ei.SetFocus
    Exit Sub
ElseIf Me.txt_compras = "" Then
    MsgBox ("Preenchimento imconpleto! Insira Compras"), vbExclamation, aviso
    Me.txt_compras.SetFocus
    Exit Sub
ElseIf Me.txt_ef = "" Then
    MsgBox ("Preenchimento imconpleto! Insira EF"), vbExclamation, aviso
    Me.txt_ef.SetFocus
    Exit Sub
ElseIf Me.txt_vendas = "" Then
    MsgBox ("Preenchimento imconpleto! Insira Vendas"), vbExclamation, aviso
    Me.txt_vendas.SetFocus
    Exit Sub
End If


If MsgBox("Dados cadastrados com sucesso! Deseja realizar um novo registro?!", vbYesNo) = vbYes Then

        Call UserForm_Initialize
        
Exit Sub
        
Else
    Unload Me
    frm_estoque.Show

End If


End Sub

Quem puder dar mais essa força ai...muito obrigado meu caro!

Em anexo a planilha para verificar

Re: Cálculo sem execução

Enviado: 03 Abr 2018 às 10:55
por babdallas
Anexa o arquivo com alguns dados cadastrados para que possamos ajudar. Sem dados dificulta.

Cálculo sem execução

Enviado: 03 Abr 2018 às 11:25
por AMORIM123
Vdd, sem dados dificulta mesmo!

Segue anexo

Re: Cálculo sem execução

Enviado: 03 Abr 2018 às 12:21
por babdallas
Veja se é isso.

Cálculo sem execução

Enviado: 03 Abr 2018 às 14:24
por AMORIM123
babdallas,

ficou massa mesmo, muito obrigado!... o problema era inserir a rotina do cálculo no loop e outras coisas mais, né :mrgreen:
ainda não tinha visto uma compilação deste jeito, com as lembras de propriedade a frente da variável ...ajuda e muito na hora de lembrar das propriedades, evitando os erros incompatibilidade que tava dando, ...o wsh da workbook.sheets.. bem melhor do que definir variável pra definir sheets..

só estou com uma dificuldade para definir o valor da coluna STATUS baseado no valor da variável "resultado", porque ela é porcentagem
Código: Selecionar todos
If resultado <= 80 Then
            ' esse é valor da comparação 80%, porém não deixa colocar o sinal da porcentagem 
            .Cells(lngUltLinDados + 1, 9).Value = "OK"
        Else
            .Cells(lngUltLinDados + 1, 9).Value = "CMV<20%"
        End If

Re: Cálculo sem execução

Enviado: 03 Abr 2018 às 15:00
por babdallas
Para ajudar preciso entender o que você quer fazer.
Então:
1) Como se calcula a variável resultado? Qual o significado dela?
2) Dê-me uns 2 exemplos de como você quer validar o Status em função da variável resultado.

Cálculo sem execução

Enviado: 03 Abr 2018 às 15:23
por AMORIM123
A variável "resultado" é produto de (sv1 - sv2) / .Cells(lngUltLinDados + 1, 7).Value2 em seguida formato esse produto (o resultado) com cód abaixo, para caso ele seja iniciado com 0:
Código: Selecionar todos
If resultado = 0# Then
            .Cells(lngUltLinDados + 1, 8).Value = Format(VBA.Round((resultado) * 1000, 2), "0.00") & "%"
        Else
            .Cells(lngUltLinDados + 1, 8).Value = Format(VBA.Round((resultado) * 100, 2), "0.00") & "%"
        End If
se após essa formatação o "resultado" for <=80% ai .Cells(lngUltLinDados + 1, 9).Value assume o status "ok" senão "CMV<20%"