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