Notifications
Clear all

Mudar codigo usado em listbox para textbox

9 Posts
3 Usuários
0 Reactions
2,381 Visualizações
willianrc
(@willianrc)
Posts: 0
Trusted Member
Topic starter
 

Ola,
Tenho um codigo usando em listbox , alguem consegue altera-lo para usar em textbox?

Private  Sub TextFile_FindReplace()

Dim y, i As Long, ii As Long 

If Me.ListBox1.ListIndex = -1 Then Exit Sub
y = Split(x(Me.ListBox1.ListIndex), "|") 

For i = 0 To Me.ListBox1.ColumnCount - 1
    If Me("textbox" & i + 1) <> "" Then y(i) = Me("textbox" & i + 1)
Next 

x(Me.ListBox1.ListIndex) = Join(y, "|")
Open ThisWorkbook.Path & "REGISTERusers.txt" For Output As #1
    Print #1, Join(x, vbNewLine);
Close #1
UserForm_Initialize 

End sub


 
Postado : 03/11/2019 11:49 am
willianrc
(@willianrc)
Posts: 0
Trusted Member
Topic starter
 

Certo Mauro,
Eu tentei fazer a adaptaçao, mas fiquei na duvida na hora de fazer o "Join".
Veja meu arquivo neste link : https://drive.google.com/file/d/1ARbCj4 ... sp=sharing

Obrigado pela ajuda

 
Postado : 04/11/2019 6:46 pm
(@faraha)
Posts: 28
Eminent Member
 

William e Mauro, bom dia. Me desculpe me intrometer, mas vamos lá.

William, pelo que entendi ao visualizar o código que enviou e onde o está alocando (no botão "Change Password" do "frame3" do formulário "frmlogin")
Creio que o seu desejo seja concatenar todos os valores dos textboxes separando cada um com o delimitador "|", separá-los pelo delimitador "|" usando a função split, e depois concatená-los novamente usando o delimitador que cria uma nova linha?

Se for isto segue o código:

Private Sub TextFile_FindReplace()
Dim Controles As Control
Dim x As String, z As String, txtArray() As String

    For Each Controles In frmLogin.Frame3.Controls
        If TypeName(Controles) = "TextBox" Then
            x = x & Controles.Value & "|"
        End If
    Next Controles

txtArray = Split(Left(x, Len(x) - 1), "|")

z = Join(txtArray, vbNewLine)

    Open ThisWorkbook.Path & "REGISTERusers.txt" For Output As #1
        Print #1, z
    Close #1
End Sub

Mas por que ao invés de juntar com o "|" e depois separar não separa logo por uma nova linha?

Segue o código:

Private Sub TextFile_FindReplace()
Dim Controles As Control
Dim x As String

    For Each Controles In frmLogin.Frame3.Controls
        If TypeName(Controles) = "TextBox" Then
            x = x & Controles.Value & vbNewLine
        End If
    Next Controles

    Open ThisWorkbook.Path & "REGISTERusers.txt" For Output As #1
        Print #1, x
    Close #1

End Sub

Uma última consideração, por que utiliza a instrução print para o output das informações para o txt? Haverá apenas um cadastro de login e senha? Caso deseje realizar mais de um cadastro seria necessário utilizar a instrução line input, realizar um loop até encontrar o valor desejado e então substituir o valor. Caso não proceda desta forma, toda vez que executar esta sub irá sobrescrever as informações de todos os cadastros iniciais.

 
Postado : 05/11/2019 7:08 am
willianrc
(@willianrc)
Posts: 0
Trusted Member
Topic starter
 

Olá Abraao Farah,
Muito válido sua ajuda, testei seu exemplo, o que deu mais certo foi o segundo codigo , porém ao encontrar o valor no txt e substituir o password ele escreve mais linhas do que deve, tipo assim:
JHON
JHON
01/10/2010
444
444
F444
1|F444|JHON|JHON|01/10/2010|444|AV. FULANO DE TAL 35|BOSS|NEW_USER|NEW_USER

E eu queria só substituir o password, ou se for mais conveniente substituir a linha toda do cadastro encontrado.
Segue meu arquivo neste link:
https://drive.google.com/file/d/1NrRYEv ... sp=sharing

Muito obrigado pela sua ajuda.

 
Postado : 05/11/2019 7:53 am
(@faraha)
Posts: 28
Eminent Member
 

Vamos lá William, vamos ver se eu entendi a sua necessidade, você quer toda vez que clicar em "Change Password" mudar no .txt a informação da senha, correto?

Então, utilizando o padrão por ti compartilhando:

1|F444|JHON|JHON|01/10/2010|444|AV. FULANO DE TAL 35|BOSS|NEW_USER|NEW_USER

Considerei a informação "F444" depois do primeiro "|", como uma informação imutável e única, ou seja, cada funcionário tem o seu. Então toda vez que preencher as informações do Frame3 e clicar no botão para mudar a senha, o valor preenchido no campo do textbox "TxtChangeID" será procurado no .txt dentro da pasta register e modificará somente na linha em que houver a mesma informação, a informação que será mudada será somente o "444" pela informada no textbox "TxtNewPass", o campo depois da data, pois creio eu que seja a senha, caso não seja me informe qual é o campo da senha rsrs.

Segue o código:

Private Sub TextFile_FindReplace()
Dim valores() As String, linha As String, x As String, IDdoFuncionario As String, NovaSenha As String

IDdoFuncionario = frmLogin.Frame3.TxtChangeID.Value
NovaSenha = frmLogin.Frame3.TxtNewPass.Value
    

    Open ThisWorkbook.Path & "REGISTERusers.txt" For Input As #1
        Do While EOF(1) = False
            Line Input #1, linha
            If linha <> "" Then
                valores = Split(linha, "|")
                If valores(1) = UCase(IDdoFuncionario) Then
                    valores(5) = NovaSenha
                    linha = Join(valores, "|")
                End If
            End If
            x = x + linha + vbNewLine
        Loop
    Close #1

    Open ThisWorkbook.Path & "REGISTERusers.txt" For Output As #1
        Print #1, x
    Close #1
End Sub

Obs: O código lhe permite trabalhar com mais de um cadastro sem problema nenhum, caso a informação do ID na companhia seja único.

 
Postado : 05/11/2019 6:47 pm
willianrc
(@willianrc)
Posts: 0
Trusted Member
Topic starter
 

Perfeito FarahA, voce entendeu certinho, só uma coisa, quando faço qualquer mudança no txt ele coloca 2 espaços abaixo (vbTab), teria como remove-los?
Pois no código de cadastro ele pega o ultimo numero cadastrado e soma+1 , caso tiver espaços (vbTab) ele dá erro de execuçao.
Muitissimo obrigado.

 
Postado : 06/11/2019 4:37 am
(@faraha)
Posts: 28
Eminent Member
 

Foi mal pelo bug :o

Segue o código adaptado:

Private Sub TextFile_FindReplace()
Dim valores() As String, linha As String, x As String, IDdoFuncionario As String, NovaSenha As String

IDdoFuncionario = frmLogin.Frame3.TxtChangeID.Value
NovaSenha = frmLogin.Frame3.TxtNewPass.Value
    

    Open ThisWorkbook.Path & "REGISTERusers.txt" For Input As #1
        Do While EOF(1) = False
            Line Input #1, linha
            If linha <> "" Then
                valores = Split(linha, "|")
                If valores(1) = UCase(IDdoFuncionario) Then
                    valores(5) = NovaSenha
                    linha = Join(valores, "|")

                End If
                        If x <> "" Then
                            x = x + vbNewLine + linha
                        Else
                            x = x + linha
                        End If
            End If
        Loop
    Close #1
    Open ThisWorkbook.Path & "REGISTERusers.txt" For Output As #1
        Print #1, x;
    Close #1
End Sub
 
Postado : 06/11/2019 6:00 am
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

willianrc, eu estava sem tempo, não cheguei a baixar seu exemplo, mas ainda bem que temos mais membros dispostos a ajudar e resolveu.

Farah, o bom do forum é isso, termos a interação de todos, nem sempre estamos com tempo disponivel, as vezes a solução é rápida, se consegue uma resposta só pela analise das linhas, mas qdo se tem de analisar por modelos mais complexos ai o bicho pega, então sinta-se a vontade para se intrometer em qualquer tópico, alem do que, como deve saber, no VBA muitas vezes temos muitas variações na estrutura de determinadas rotinas e é sempre bom podermos estar demonstrando isso, eu mesmo já troquei soluções que tinha postado por dicas e exemplos que outros indicaram.

[]s

Mauro Coutinho
Administrador

 
Postado : 06/11/2019 6:39 am
willianrc
(@willianrc)
Posts: 0
Trusted Member
Topic starter
 

FarahA

Perfeitooooooooooo

Muito Obrigado FarahA e Mauro Coutinho.

 
Postado : 06/11/2019 1:22 pm