RETENÇÃO DE IMPOSTO...
 
Notifications
Clear all

RETENÇÃO DE IMPOSTOS VIA VBA

33 Posts
5 Usuários
0 Reactions
4,792 Visualizações
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Bom dia amigos,

Estou com uma duvida que seria a seguinte:
Tenho 60 convênios onde cada um deles faz retenção de 5 impostos (ISS - IR - PIS - COFINS - CSLL) as porcentagens de retenção de cada imposto varia conforme convênio não sendo fixas. Antigamente usava uma tabela que fazia a retenção por meio de procv, o unico problema que encontrei e que se eventualmente eu alterar qualquer uma das retenções de um convênio (sim isso pode ocorrer no decorrer do ano) ele altera todos os dados sejam os antigos e novos e naverdade preciso que altere apenas as retenções daquela data em diante.
O que gostaria:

Preciso criar um codigo via vba onde conforme eu coloque o nome do convênio em um formulario (combobox de convênios) ele busque o % de retenção de cada imposto e faça o lançamento na planilha e se possivel que a listagem de convênios e de % estivesse toda no vba e não em uma planilha especifica.

Não tenho nenhum modelo de planilha com formulario ou algo do tipo mas as retenções podem ser:

IR - 1,5% OU 1,2% OU 4,8% OU 0%
ISS - 2% OU 0%
PIS - 0,65% OU 0%
COFINS 3% OU 0%
CSLL 1% OU 0%

Esses Impostos juntos podem combinar em retenções gerais com os seguintes percentuais(mais comuns):
0%/1,5%/3,5%/4,65%/6,15%/7,85%/8,15%/9,45%/11,45%

EX: CONVÊNIO CASSI NOTA VALOR DE R$ 1000,00 - FAZ RETENÇÃO DE 8,15% SENDO 2% ISS/ 1,5% IR/0,65% PIS/ 3% COFINS/ 1% CSLL. NA PLANILHA TEM QUE APARECER: CASSI 1000,00 /ISS R$ 20,00/IR R$ 15,00/ PIS R$ 6,50/ COFINS R$ 30,00/ CSLL R$ 10,00 LIQUIDO: R$ 918,50
Seria possivel ter esse fluxo de variaveis dentro do VBA e na hora do lançamento via formulario ele fazer a porcentagem sobre o valor convertendo em moeda e lançando na planilha do banco de dados?

Não tenho planilha modelo!

Desde já agradeço pela atenção.

 
Postado : 26/08/2016 8:29 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Bom dia,
Bruno,

Não é importante verificar qual o resultado anterior, por que no fim das contas todos estão certos o que acontece é que como as mudanças tributarias são muito frequentes a situação funcionará mais ou menos assim:

julho: convênio x tem retenção de 6,15% sobre o valor bruto
Agosto: Mesmo convênio passa a ter retenção de 8,15% sobre o valor bruto.

No fim das contas todas estão certas, apenas o fato gerador (retenção) ocorreu em uma competência (mês) diferente.
Como posso fazer Bruno.
Você poderia me ajudar?

Att.

Eraldo Ferreira

 
Postado : 29/08/2016 4:45 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Desde o inicio foi o que entendi. Efetuar a busca do percentual "fazer" os cálculos e gravar apenas o resultado(s). Exatamente como no modelo do tópico que lhe informei.
Lá tem o start.

 
Postado : 29/08/2016 6:14 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Boa Tarde!
Segue em anexo minha pasta de trabalho, os formulários já estão criados o que ocorre:
Minha lista de retenções está na planilha Listas de I10:V70
As retenções serão lançadas nas planilhas Janeiro a Dezembro conforme data de emissão, o lançamento e feito pelo formulario Form_nfe
Neste formulário tem os campos PIS, COFINS, ISS, CSLL, IR ( que eu gostaria que fosse preenchido por meio de mult e vlookup)
Condicional: i ou 9 = INOB/ H ou 7
O vlookup será feito baseado na condicional acima e nome de convênio que é escolhido na combobox, o lançamento é feito na planilha que é escolhida na listbox ao lado na mesma form.

Logo,
No campo (ISS) será feito---> Mult(V.Bruto (TextBox);Vlookup (Convênio,Listas!I10:V70,6,0) (minha logica de raciocinio)

Usei o comando:
Sheets(Me.ListBox1.Value).Cells(t + 1, 6) = APLICATION.WorksheetFunction.MMult(Sheets(Me.ListBox1.Value).Cells(t + 1, 5), Aplication.WorksheetFunction.VLookup(Sheets(Me.ListBox1.Value).Cells(t + 1, 4), Plan6.Range("I10:V100"), 6, 0))

No entanto na planilha do lançamento não aparece o resultado.
Se alguém puder me ajudar com a solução serei grato!!!

Senha e Loguin: ADMIN/ADMIN
DESBLOQUEIO DA PLANILHA: INOB
DESBLOQUEIO VBA: 962355600

Desde já agradeço!!!!

 
Postado : 29/08/2016 1:05 pm
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Alguém?
Bom Dia a todos!!

 
Postado : 30/08/2016 7:38 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Supondo que a procura/calculo devam ocorrer apos o preenchimento da text do valor
Acrescente no modulo do seu formulario "FORMNFE" a rotina abaixo, e teste se os calculos estão ok

Private Sub TextBox8_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Select Case Me.TextBox10.Value
    Case "I", 9
    TextBox4 = TextBox8.Value * Sheets("listas").Range("N" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox14 = TextBox8.Value * Sheets("listas").Range("L" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox13 = TextBox8.Value * Sheets("listas").Range("J" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox12 = TextBox8.Value * Sheets("listas").Range("K" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox11 = TextBox8.Value * Sheets("listas").Range("M" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    Case "H", 7
    TextBox4 = TextBox8.Value * Sheets("listas").Range("U" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox14 = TextBox8.Value * Sheets("listas").Range("S" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox13 = TextBox8.Value * Sheets("listas").Range("Q" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox12 = TextBox8.Value * Sheets("listas").Range("R" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
    TextBox11 = TextBox8.Value * Sheets("listas").Range("T" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value
End Select

End Sub
 
Postado : 30/08/2016 10:20 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

No Caso eu coloco dentro de um modulo e peço para chamar a macro ou coloco dentro da FORMNFE Activate?

 
Postado : 30/08/2016 10:40 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

E no modulo de rotinas do formnfe, porem é uma rotina especifica. Copie e cole no final depois da rotina de nome -->"Private Sub UserForm_Activate()" por exemplo

 
Postado : 30/08/2016 10:56 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Coloquei a Rotina em um modulo, no entanto ao chamar o formulario e fazer o lançamento o mesmo não preenche as textbox e mesmo depois de gravar ele não lança na planilha. No comando MATCH vc relacionou o intervalo de i10 a i100, no entanto não seria de i10:v100 intervalo este que esta incluído todas as retenções dos dois cases?

Desde já agradeço.

Eraldo Ferreira

 
Postado : 30/08/2016 11:07 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Reinaldo,
Boa Tarde,

Coloquei a rotina dentro do useform_activate e funcionou ele aparece dentro das textbox de retenção agora vou redirecionar o lançamento das textbox para a planilha mas fiquei com 2 duvidas sendo:
1º Se eu começo o lançamento e coloco o nome do convênio ele faz os cálculos, mas se por acaso eu tiver que mudar o convênio dentro da form ele não refaz os cálculos mantem os anteriores seria possível fazer com que ele refaça os cálculos dentro das textbox?
2º E possivel fazer com que as texbox possam colocar o simbolo de R$ enquanto estou fazendo o lançamento?

Desde já agradeço.

Eraldo Ferreira

 
Postado : 30/08/2016 11:56 am
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Reinaldo,

Outra coisa, os valores estão sendo calculados com 4 casas decimais, seria possível reduzir para 2 casas decimais ou formatar?

Atenciosamente.:

Eraldo Ferreira

 
Postado : 30/08/2016 12:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

"No comando MATCH vc relacionou o intervalo de i10 a i100, no entanto não seria de i10:v100 intervalo este que esta incluído todas as retenções dos dois cases?"
Application.MATCH "corresponde" à função de Planilha Corresp, que por default utiliza uma unica coluna ou linha, por isso utilizado I10:I100; retorna a posição relativa do objeto/valor procurado na range/matriz utilizada. Exemplo:ALLIANZ ira retornar 1, já que é o primeiro registro na range.

"Outra coisa, os valores estão sendo calculados com 4 casas decimais, seria possível reduzir para 2 casas decimais ou formatar?"
Para arredondar utiliza Vba.Round, abaixo irá arredondar para duas casa decimais, obedecento o padrão de arredondemento do sistema

TextBox4 = VBA.Round(TextBox8.Value * Sheets("listas").Range("N" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2)

"E possivel fazer com que as texbox possam colocar o simbolo de R$ enquanto estou fazendo o lançamento?"

Entendo que queira "ver" na text com o simbolo, então utilize assim:

TextBox4 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("N" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")

Se eu começo o lançamento e coloco o nome do convênio ele faz os cálculos, mas se por acaso eu tiver que mudar o convênio dentro da form ele não refaz os cálculos mantem os anteriores seria possível fazer com que ele refaça os cálculos dentro das textbox?

Voçe deve definir, quando serão efetudados os calculos; propus no evento de atualização da TextBox de valor, pois sem valor não há calculo; contudo tambem sem o convenio irá gerar um erro, e sem a serie não haverá calculo.

 
Postado : 30/08/2016 1:22 pm
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Reinaldo,
Boa tarde,
Os cálculos devem ser feitos sempre que eu colocar serie, convênio e valor e devem se refazer sempre que eu atualizar uma dessas informações antes de mandar gravar o formulário na planilha, nesse caso onde deve se alterar o codigo?

Atenciosamente.:

Eraldo Ferreira

 
Postado : 30/08/2016 1:46 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bem vamos lá,

Incluir e/ou alterar as rotinas abaixo:
Verifica se há dados do convenio e valor ao alterar Serie, para efetuar o calculo/recalculo

Private Sub TextBox10_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox10.Text = UCase(TextBox10.Text)
If ComboBox2.Value <> "" And TextBox8.Value <> "" Then CalcRetido
End Sub

Verifica se há dados do convenio e serie ao alterar valor, para efetuar o calculo/recalculo

Private Sub TextBox8_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
TextBox8.Text = Format(TextBox8.Text, "R$ #,##0.00")
If ComboBox2.Value <> "" And TextBox10.Value <> "" Then CalcRetido
End Sub

Verifica se há dados de serie e valor ao alterar oconvenio, para efetuar o calculo/recalculo

Private Sub ComboBox2_Change()
If TextBox8.Value <> "" And TextBox10.Value <> "" Then CalcRetido
End Sub

Efetua o calculo quando solicitado

Private Sub CalcRetido()
Select Case Me.TextBox10.Value
    Case "I", 9
    TextBox4 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("N" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox14 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("L" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox13 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("J" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox12 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("K" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox11 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("M" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    
    Case "H", 7
    TextBox4 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("U" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox14 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("S" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox13 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("Q" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox12 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("R" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
    TextBox11 = Format(VBA.Round(TextBox8.Value * Sheets("listas").Range("T" & Application.Match(ComboBox2.Value, Sheets("Listas").Range("I10:I100"), 0) + 9).Value, 2), "R$ #,##0.00")
End Select
End Sub

Obs.: Não envio seu modelo, pois fiz diversas alterações (eliminado o que considero maquiagem / manipulação de barras) no mesmo, para adapta-lo à maneira que me sinto mais confortavel, bem como o tamanho, mesmo compactado, não é aceito no forum

 
Postado : 30/08/2016 6:13 pm
(@eraldofer)
Posts: 0
New Member
Topic starter
 

Boa Noite,
Primeiramente muito obrigado por todo o apoio estarei fazendo os testes e dou retorno, quanto ao as rotinas acima colocarei dentro do modulo da form, correto?
Quanto a pasta de trabalho, poderia (se quiser é claro) mandar suas alterações ou o que excluiu, sou novo no fórum e VBA então não sei distinguir o que é ou não adequado, nos critérios de desenvolvimento da programação, sendo assim todo o tipo de informação e modelo é bem vindo.
A titulo de esclarecimento não sei identificar o que é essa "maquiagem do que você fala".

Desde já agradeço e ficarei feliz se puder mandar a pasta com suas alterações.

Att.

Eraldo ferreira

 
Postado : 30/08/2016 6:36 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Exatamente, as rotinas acima devem ser acrescentadas e/ou substituir a(s) existente(s) no modulo do Formulário em questão

Quanto ao que disse anteriormente sobre "maquiagem", não é a titulo de critica, mas sim de uma opinião pessoal; são tratamentos dado ao aplicativo, os quais muitos gostam, outros não ligam; e provavelmente para o dia dia do usuário final deve ser útil; mas que, julgo eu, não agregam nada na hora da programação/correção de rotinas.
tipo: conjunto de comandos nas suas subs : Workbook_Open / Workbook_Close / Workbook_SheetDeactivate / MostrarHoras / removeCaption; ou comando como
-->Application.DisplayFullScreen = True e/ou Application.Visible.
Como não anotei o que alterei, não dá para identificar corretamente.

 
Postado : 30/08/2016 8:02 pm
Página 2 / 3