Notifications
Clear all

Formato de Texboxs

7 Posts
3 Usuários
0 Reactions
1,479 Visualizações
(@kurkas)
Posts: 85
Estimable Member
Topic starter
 

Boa tarde,
Tenho um userform com várias Texboxs.
Cada Textbox está formatada para valores com virgulas e duas casas decimais.
Porém, queria formatar as outras também da mesma maneira, aplicando apenas uma vez o código visto serem muitas textboxs.
Como aplico o código em baixo para várias?
Obrigado.

Private Sub TextBox4_Change()
Dim i As Integer, T As String
With TextBox4

T = .Text
i = Len(T) - .SelStart
T = Replace(.Text, ",", "")
If Len(T) < 3 Then T = String(3 - Len(T), "0") & T
T = Mid(T, 1, Len(T) - 2) & "," & Mid(T, Len(T) - 1)
T = Format(T, "#,##0.00")
If .Text <> T Then .Text = T
.SelStart = Len(T) - i
End With
End Sub

 
Postado : 22/08/2015 6:15 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo que conheço cada text box é um objeto individual/único (não coexistem duas com mesmo nome), como tal seus eventos são específicos, assim para configurar/formata-las é necessário/mandatório utilizar seus eventos individuais.

 
Postado : 22/08/2015 9:41 am
(@kurkas)
Posts: 85
Estimable Member
Topic starter
 

Está correto o que disse.
Tenho várias, Textbox1, Textbox2, Textbox3, Textbox4, etc.
Apenas não sei se haverá maneira de as formatar todas apenas num só código.

 
Postado : 22/08/2015 9:50 am
(@trindade)
Posts: 0
New Member
 

Boa noite, kurkas

Quando tiver um tempo da uma olhada nesse código, vê se te ajuda.

Private Sub FormatarTextBox()

Dim vC1

' # INICIO TEXTBOX1
TextBox = 5 ' Quantidade de TextBox de acordo com o Nome

For vC1 = 1 To TextBox

  If Len(Me.Controls("TextBox" & vC1)) > 0 Then
  
    With Me.Controls("TextBox" & vC1)
     T = .Text
        i = Len(T) - .SelStart
        T = Replace(.Text, ",", "")
        If Len(T) < 3 Then T = String(3 - Len(T), "0") & T
            T = Mid(T, 1, Len(T) - 2) & "," & Mid(T, Len(T) - 1)
            T = Format(T, "#,##0.00")
        If .Text <> T Then .Text = T
            .SelStart = Len(T) - i
    End With
    
  End If
  
Next

On Error Resume Next

End Sub


Private Sub TextBox1_Change()
    Call FormatarTextBox
End Sub

Private Sub TextBox2_Change()
    Call FormatarTextBox
End Sub

Private Sub TextBox3_Change()
    Call FormatarTextBox
End Sub

Private Sub TextBox4_Change()
    Call FormatarTextBox
End Sub

Private Sub TextBox5_Change()
    Call FormatarTextBox
End Sub

 
Postado : 22/08/2015 8:16 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

A proposta do colega , faz um loop por um numero determinado de Textbox formatando-as, perfeito.
Porem não vejo muito (na falta de uma palavra melhor) proveitoso chamar esse loop cada alteração de uma Text; pois se houver muitas Txt poderá,
na soma das "rodadas" acarretar um delay de desempenho.
Tambem deve ser visto/analisado como a formatação utilizada se comporta quando aplicada em uma textbox já formatada, o que fatalmente ocorrerá.
O ideal ( e no meu entender o mais correto) seria utilizar o loop em um único evento (a ser definido pelo usuario/desenvolvedor) formatando assim todas uma unica vez.
Havendo o desejo/necessidade de utilizar a formatação durante a digitação, então "transformar" a rotina de formatação em uma Function, e chama-la (a function) conforme propos o colega Trindade

 
Postado : 23/08/2015 8:09 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu trabalharia com manipulador de eventos usando um Modulo de Classe e WithEvents, observando que WithEvents é válido somente em um módulo de classe, assim não necessitamos escrever nenhum linha em qualquer dos textbox, uma vez que ao inicializar o formulário é criado um array que serve para aplicar a formatação para qualquer um deles.

Faça da seguinte forma:
1 º) Crie um MODULO DE CLASSE e cole as instruções abaixo :

Public WithEvents TextBoxFormat As MSForms.TextBox
 
Private Sub TextBoxFormat_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim i As Integer, T As String
    
    'Limita a Qde de caracteres
    'TextBoxFormat.MaxLength = 9
    
    With TextBoxFormat
        T = .Text
            i = Len(T) - .SelStart
            T = Replace(.Text, ",", "")
        If Len(T) < 3 Then T = String(3 - Len(T), "0") & T
            T = Mid(T, 1, Len(T) - 2) & "," & Mid(T, Len(T) - 1)
            T = Format(T, "#,##0.00")
        If .Text <> T Then .Text = T
            .SelStart = Len(T) - i
    End With

End Sub

2º ) De dois clique no Formulário e apqgue todas as instruções que e encontram no mesmo, e cole as instruções abaixo :

Option Explicit

Dim ArrayTextboxs() As New Classe1

'Cria um array dos Textbox no formulário uma unica vez
Private Sub UserForm_Initialize()
    Dim i As Integer, TBCtl As Control
 
    For Each TBCtl In Me.Controls
        If TypeOf TBCtl Is MSForms.TextBox Then
            i = i + 1
            ReDim Preserve ArrayTextboxs(1 To i)
            Set ArrayTextboxs(i).TextBoxFormat = TBCtl
        End If
    Next TBCtl
    Set TBCtl = Nothing
End Sub

Veja que no formulário a única linh de código que iremos ter é a do "UserForm_Initialize" onde iremos criar o array dos Textbox.

[]s

 
Postado : 23/08/2015 3:05 pm
(@kurkas)
Posts: 85
Estimable Member
Topic starter
 

Olá,
Experimentei ambas e confesso ter sido mais .... acessível, a proposta do Mauro Coutinho.
Ainda assim aprendi mais qualquer coisinha com ambos!!
Agradecido aos dois.

 
Postado : 24/08/2015 12:24 pm