Notifications
Clear all

APLICAR MÁSCARA MOEDA SEM ABRIR UM "PRIVATE" P/ CADA TXTBOX

6 Posts
2 Usuários
0 Reactions
1,690 Visualizações
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

Olá, galera.

Bom dia.

No evento initialize do meu "frm_rbpa" tenho a instrução a baixo para que seja feita uma chamada do modo de classe "Classe1" para determinar na propriedade "TAG" dos meus txtbox's o formato moeda... anteriormente aqui no fórum Klarc28 ajudou-me com este código, na oportunidade ao testar ó cód. não atentei que após a vírgula estão sendo considerados três casas decimais, exemplo:

Ao tentar digitar R$ 123,33 é visualizado R$ 12,333

Dim cFormat() As New Classe1

Private Sub UserForm_Initialize()

Dim Obj         As Integer
Dim TotalObj    As Integer

Call txt_periodo_AfterUpdate
Call limpar
    
    'Pega a quantidade de controles do formulário e armazena na variável
TotalObj = Me.Controls.Count - 1
    
    'Redimensiona a matriz do controle criado para pegar a quantidade de controles existentes
ReDim cFormat(0 To TotalObj)
    
    'Laço para percorrer cada um dos controles existentes no formulário
For Obj = 0 To TotalObj
'Verifica se o controle encontrado possui a TAG "DATE" (definida nas propriedades)
    If Me.Controls(Obj).Tag = "DATE" Then
    'Atribui a matriz do objeto o número do controle encontrado
        Set cFormat(Obj).xFormatDate = Me.Controls(Obj)
    End If
Next
       
End Sub

Já tentei realizar algumas alterações, porém não obtive exito

aquém puder ajudar...muito obrigado pelo tempo e atenção

Link da planilha:
https://www.dropbox.com/s/a1dtp7tv8eocq ... .xlsm?dl=0

 
Postado : 30/05/2018 7:32 am
sandroh
(@sandroh)
Posts: 40
Eminent Member
 

Bom dia,
Creio que é mais simples você colocar o formato da célula com os 3 números após a virgula. Já tentou?

Caso tenha resolvido, não esqueça de clicar na mãozinha ao lado da ferramenta "citar" e fechar o tópico ;)

 
Postado : 30/05/2018 8:00 am
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

Já está assim...quero que fique com apenas duas...como é o esperado..tendo em vista a comparação com os outros sistemas profissionais!

 
Postado : 30/05/2018 8:18 am
sandroh
(@sandroh)
Posts: 40
Eminent Member
 

Diminuindo o número de casas no próprio excel não serve?

Caso tenha resolvido, não esqueça de clicar na mãozinha ao lado da ferramenta "citar" e fechar o tópico ;)

 
Postado : 30/05/2018 8:45 am
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

na planilha vai adiantar apenas quando houver retorno do afterupdate....preciso que seja no preenchimento para não precisar ficar colocando pontos, virgulas ..enfim formatando o txtbox....sei que isso é possível, pois no código a baixo isso é realizado..porém não o utilizo, pois trabalho com vários txtbox's e fica um pouco trabalhoso escrever a mesma linha de cód para cada txtbox...sem conta no tamanho da planilha...por isso utilizo o cód que já está planilha, que seria perfeito para minha necessidade se não fosse por esse problema das casas decimais, que não entendo o por quê ocorre, pois fora o modo de classe não muda quase em nada

UM PRIVATE PARA CADA TXTBOX

Private Sub txt_faturamento_Change()

'créditos do código - Bruno Sobral (http://excelevba.com.br/formato-moeda-no-textbox-enquanto-digita/)

valor = txt_faturamento.Value
    If IsNumeric(valor) Then
        If InStr(1, valor, "-") >= 1 Then valor = Replace(valor, "-", "") 'retira sinal negativo
        If InStr(1, valor, ",") >= 1 Then valor = CDbl(Replace(valor, ",", "")) 'retirar a virgula
        If InStr(1, valor, ".") >= 1 Then valor = Replace(valor, ".", "") 'para trabalhar melhor retiramos ponto
        Select Case Len(valor) 'verifica casas para inserção de ponto
            Case 1
            numPonto = "00" & valor
            Case 2
            numPonto = "0" & valor
            Case 6 To 8
            numPonto = Left(valor, Len(valor) - 5) & "." & Right(valor, 5)
            Case 9 To 11
            numPonto = inseriPonto(8, valor)
            Case 12 To 14
            numPonto = inseriPonto(11, valor)
            Case Else
            numPonto = valor
        End Select
        numVirgula = Left(numPonto, Len(numPonto) - 2) & "," & Right(numPonto, 2)
        txt_faturamento.Value = numVirgula
    Else
        If valor = "" Then Exit Sub
        MsgBox "Número invalido", vbCritical, "Caracter Invalido"
        Exit Sub
    End If

End Sub


Function inseriPonto(inicio, valor)
    I = Left(valor, Len(valor) - inicio)
    M1 = Left(Right(valor, inicio), 3)
    M2 = Left(Right(valor, 8), 3)
    F = Right(valor, 5)
    If (M2 = M1) And (Len(valor) < 12) Then
    inseriPonto = I & "." & M1 & "." & F
    Else
    inseriPonto = I & "." & M1 & "." & M2 & "." & F
    End If
End Function
 
Postado : 30/05/2018 9:04 am
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

Para quem está a procura de uma solução para aplicação de formato moeda sem ter que abrir um "PRIVATE"para cada txtbox está é uma forma ideal para qnd vamos trabalhar com muito form's ..e muitos txtbox.

1 - Abra um módulo de classe e declare:

Public WithEvents xFormatDate As MSForms.TextBox

2- No mesmo módulo de classe cole

Private Sub xFormatDate_Change()
    Call FormataMoeda(xFormatDate.Value)
End Sub


Private Sub FormataMoeda(valor As Variant)
   'Dim valor As String
    Dim numPonto As String
    Dim numVirgula As String
    valor = xFormatDate.Value
    If IsNumeric(valor) Then
        If InStr(1, valor, "-") >= 1 Then valor = Replace(valor, "-", "") 'retira sinal negativo
        If InStr(1, valor, ",") >= 1 Then valor = CDbl(Replace(valor, ",", "")) 'retirar a virgula
        If InStr(1, valor, ".") >= 1 Then valor = Replace(valor, ".", "") 'para trabalhar melhor retiramos ponto
        Select Case Len(valor) 'verifica casas para inserção de ponto
            Case 1
                numPonto = "00" & valor
            Case 2
                numPonto = "0" & valor
            Case 6 To 8
                numPonto = Left(valor, Len(valor) - 5) & "." & Right(valor, 5)
            Case 9 To 11
                numPonto = inserirPonto(8, valor)
            Case 12 To 14
                numPonto = inserirPonto(11, valor)
            Case Else
                numPonto = valor
        End Select
        numVirgula = Left(numPonto, Len(numPonto) - 2) & "," & Right(numPonto, 2)
        xFormatDate.Value = numVirgula
    Else
        If valor = "" Then Exit Sub
        MsgBox "Número invalido", vbCritical, "Caracter Invalido"
        Exit Sub
    End If
End Sub

Function inserirPonto(inicio, valor)
    I = Left(valor, Len(valor) - inicio)
    M1 = Left(Right(valor, inicio), 3)
    M2 = Left(Right(valor, 8), 3)
    F = Right(valor, 5)
    If (M2 = M1) And (Len(valor) < 12) Then
        inserirPonto = I & "." & M1 & "." & F
    Else
        inserirPonto = I & "." & M1 & "." & M2 & "." & F
    End If
End Function

3 - Ainda no módulo de classe, chame o evento anterior dentro do procedimento abaixo:

Private Sub xFormatDate_Change()
    Call FormataMoeda(xFormatDate.Value)
End Sub

4 - Em seguida no módulo de cada form:

Private Sub UserForm_Initialize()
    Dim Obj As Integer
    Dim TotalObj As Integer
    Dim i As Integer, l As Integer, TB
    
    
    'Pega a quantidade de controles do formulário e armazena na variável
    TotalObj = Me.Controls.Count - 1
    
    'Redimensiona a matriz do controle criado para pegar a quantidade de controles existentes
    ReDim cFormat(0 To TotalObj)
    
    'Laço para percorrer cada um dos controles existentes no formulário
    For Obj = 0 To TotalObj
        'Verifica se o controle encontrado possui a TAG "DATE" (definida nas propriedades)
        If Me.Controls(Obj).Tag = "DATE" Then
            'Atribui a matriz do objeto o número do controle encontrado
            Set cFormat(Obj).xFormatDate = Me.Controls(Obj)
        End If
        Next
End Sub
5 - Pronto! Nas propriedade de cada txtbox, em "tag" basta digitar DATE ...só testar

Espero ter ajudado galera!

 
Postado : 06/06/2018 6:03 am