Notifications
Clear all

Identificar coluna (local) de registro no form

6 Posts
3 Usuários
0 Reactions
2,326 Visualizações
(@roblua)
Posts: 0
New Member
Topic starter
 

Senhores saudações.
Um pequeno desafio para os senhores; uma grande solução para eu.

Vim aqui pedir uma ajuda/socorro!
O site " https://www.excel-easy.com/ " disponibiliza gratuitamente um formulário de cadastro/pesquisa/atualização extremamente simples no ponto de vista de utilização.
Baixei ele e algumas coisas consegui compreender e alterar, acrescentei mais textbox; alterei o código e já identifiquei onde isso ocorre uma vez que a estrutura do form (o código) não é escrito campo a campo como é costumeiro; por isso o motivo de meu interesse nele.
Porem, apesar de simples em sua utilização; a forma simplificada de sua escrita e sem duvidas a minha falta de conhecimento mais avançado em VBA, não me permitiram localizar onde seria possível determinar a coluna onde posso inserir os dados, exceto na já programada "A".
Testei de várias formas, alterei tudo visível aos olhos de um leigo, porem como disse, meu conhecimento ainda é pouco para entender bem como aquelas poucas linhas (que muito me ajudam) podem ser alteradas para irem direto para a coluna/linha especifica que eu desejo, e no mais o código não contem nenhuma explicação.
Como anexo segue um protótipo para situa-los do que falo e na mesma guia a partir da celula J6, um exemplo de onde eu gostaria que os dados começassem, por exemplo.
O que eu quero de fato é que me ajudem a identificar no VBA onde posso alterar para adequar as minhas necessidades se possivel descrevendo aqui ou em um comentário dentro do VB mesmo onde deve ser alterado para iniciar (Cadastro e Pesquisa) na linha / coluna que preciso.

http://abre.ai/projeto_base

Grato desde-já.

 
Postado : 06/01/2020 2:52 am
(@klarc28)
Posts: 0
New Member
 
i = 0

Esse i seria o número da linha que está percorrendo no momento.
Para começar na linha 6, você deve mudar para i = 5.

    emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1

Aqui ele procura a primeira linha vazia na coluna A.
Para começar na coluna J, você deve mudar para "J:J"

 
Postado : 06/01/2020 5:09 am
(@roblua)
Posts: 0
New Member
Topic starter
 

klarc28 obrigado pela atenção; porem não é bem assim.
Como disse eu testei o pouco que conheço de VBA Excel e essa parte (o lógico assim que a gente bate o olho) eu também tentei.
Ao menos para eu não altera; sei que a referencia "i" no geral trata da linhas (Integer) mas nesse código: não respondeu; como descrevi, ao menos em meus testes não deu certo.
Isso tem tirado minha concentração. kkk
Preciso muito da ajuda de vocês.
Mais uma vez, muito obrigado pela atenção e aguardo mais dicas, para desvendar esse código ...
Grato.

 
Postado : 07/01/2020 9:39 pm
(@srobles)
Posts: 0
New Member
 

roblua,

Conforme o amigo Klark28 disse, repare nas instruções da rotina que Edita / Adiciona um registro :

Sub EditAdd()
Dim emptyRow As Long

If Frm_Cad_Base.TextBox1.Value <> "" Then
    flag = False
    i = 0
    id = Frm_Cad_Base.TextBox1.Value
    emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1

    Do While Cells(i + 1, 1).Value <> ""

        If Cells(i + 1, 1).Value = id Then
            flag = True
            For j = 2 To 4
                Cells(i + 1, j).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
            Next j
        End If

        i = i + 1

    Loop

    If flag = False Then
        For j = 1 To 4
            Cells(emptyRow, j).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
        Next j
    End If

End If

End Sub

Este trecho procura na coluna 1 (A) da guia pelo ID :

    Do While Cells(i + 1, 1).Value <> ""

        If Cells(i + 1, 1).Value = id Then

Caso queira que seja na coluna J, altere para 10, ficando :

    Do While Cells(i + 1, 10).Value <> ""

        If Cells(i + 1, 10).Value = id Then

Não se esqueça de determinar o valor da variável emptyRow, caso deseje inserir um novo registro.
Altere para a coluna desejada, alterando de A:A para a coluna em questão.

    emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1

Repare também, a variável booleana flag contida no código, pois é ela que determina se será um novo registro ou se será alteração do registro existente.Aqui é que está o famoso "pulo do gato"... :D

Outra coisa, se atente para os laços For => Next contidos em ambas as situações (Editar e Adicionar, respectivamente).

Caso a variável flag seja igual a False, somente são alterados os dados das colunas 2 a 4, e caso seja True, são inseridos os valores dos campos á partir da coluna A, por isso que laço vai de 1 a 4.

Editar :

        If Cells(i + 1, 1).Value = id Then
            flag = True
            For j = 2 To 4
                Cells(i + 1, j).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
            Next j
        End If

Adicionar :

    If flag = False Then
        For j = 1 To 4
            Cells(emptyRow, j).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
        Next j
    End If

Note que em ambos os casos, as respectivas colunas recebem os valores dos seus respectivos TextBox, determinados pela variável i, então se o cadastro começar na coluna 10, altere também estes laços :
Editar :
Repare no j + 8 :

        If Cells(i + 1, 10).Value = id Then
            flag = True
            For j = 2 To 4
                Cells(i + 1, j + 8).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
            Next j
        End If

Adicionar :
Novamente, repare no j + 9

    If flag = False Then
        For j = 1 To 4
            Cells(emptyRow, j + 9).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
        Next j
    End If
 
Postado : 08/01/2020 9:51 am
(@klarc28)
Posts: 0
New Member
 

O número 10 refere-se à coluna 10, ou seja, coluna J.
Ao deslocar da coluna A para a coluna J, houve o deslocamento de 9 colunas, por isso, escrevi j + 9.

Dim id As Integer, i As Integer, j As Integer, flag As Boolean

Private Sub UserForm_Initialize()
TextBox1.SetFocus
End Sub

Private Sub TextBox1_Change()
Pesquisar
End Sub
Private Sub CommandButton1_Click()
EditAdd
End Sub
Private Sub CommandButton2_Click()
ClearForm
End Sub
Private Sub CommandButton3_Click()
Unload Me
End Sub
Sub Pesquisar()
If IsNumeric(Frm_Cad_Base.TextBox1.Value) Then
    flag = False
    i = 6
    id = Frm_Cad_Base.TextBox1.Value

    Do While Cells(i + 1, 10).Value <> ""

        If Cells(i + 1, 10).Value = id Then
            flag = True
            For j = 2 To 4
                Frm_Cad_Base.Controls("TextBox" & j).Value = Cells(i + 1, j + 9).Value
            Next j
        End If

        i = i + 1

    Loop

    If flag = False Then
        For j = 2 To 4
            Frm_Cad_Base.Controls("TextBox" & j).Value = ""
        Next j
    End If

Else
    ClearForm
End If

End Sub

Sub ClearForm()

For j = 1 To 4
    Frm_Cad_Base.Controls("TextBox" & j).Value = ""
Next j

End Sub

Sub EditAdd()
Dim emptyRow As Long

If Frm_Cad_Base.TextBox1.Value <> "" Then
    flag = False
    i = 5
    id = Frm_Cad_Base.TextBox1.Value
    emptyRow = WorksheetFunction.CountA(Range("J:J")) + 1

    Do While Cells(i + 1, 10).Value <> ""

        If Cells(i + 1, 10).Value = id Then
            flag = True
            For j = 2 To 4
                Cells(i + 1, j + 9).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
            Next j
        End If

        i = i + 1

    Loop

    If flag = False Then
        For j = 1 To 4
            Cells(emptyRow, j).Value = Frm_Cad_Base.Controls("TextBox" & j).Value
        Next j
    End If

End If

End Sub



 
Postado : 08/01/2020 10:06 am
(@roblua)
Posts: 0
New Member
Topic starter
 

Com o intuito de contribuir, segue a baixo o código final da aplicação.
Não irei inserir anexo pois caso o arquivo se corrompa ainda será possível desenvolver o projeto.
Material:
1 Formulário (Aqui nomeado de Frm_Cad_Base)
4 Labels (Id, Nome, Sobrenome, Idade)
4 Textbox (Não nomear as textbox, o sistema reconhece-as e insere os dados com a instrução Form_Cad_Base.Controls("TextBox" ... )
3 Botões (Adicionar, Limpar, Fechar - Aqui não foram nomeados)
Obs: O formulário acessa os dados da guia ativa

Código do formulário

Dim id As Integer, i As Integer, j As Integer, flag As Boolean
Private Sub UserForm_Initialize()
TextBox1.SetFocus
End Sub
Private Sub TextBox1_Change()
Pesquisar
End Sub
Private Sub CommandButton1_Click()
EditAdd
End Sub
Private Sub CommandButton2_Click()
ClearForm
End Sub
Private Sub CommandButton3_Click()
Unload Me
End Sub
Sub Pesquisar()
If IsNumeric(Frm_Cad_Base.TextBox1.Value) Then
    flag = False
    i = 6    'Determina Linha
    id = Frm_Cad_Base.TextBox1.Value

    Do While Cells(i + 1, 10).Value <> ""  'Alterar (i + 1, 10) onde 10 é o numero da coluna

        If Cells(i + 1, 10).Value = id Then  'Alterar (i + 1, 10) onde 10 é o numero da coluna
            flag = True
            For j = 2 To 4
                Frm_Cad_Base.Controls("TextBox" & j).Value = Cells(i + 1, j + 9).Value 'j+9 muda a coluna a ser percorrida a partir do 1
                
            Next j
        End If

        i = i + 1

    Loop

    If flag = False Then
        For j = 2 To 4
            Frm_Cad_Base.Controls("TextBox" & j).Value = ""
        Next j
    End If

Else
    ClearForm
End If

End Sub

Sub ClearForm()

For j = 1 To 4
    Frm_Cad_Base.Controls("TextBox" & j).Value = ""
Next j

End Sub

Sub EditAdd()
Dim emptyRow As Long

If Frm_Cad_Base.TextBox1.Value <> "" Then
    flag = False
    i = 6  'Determina Linha
    id = Frm_Cad_Base.TextBox1.Value
    emptyRow = WorksheetFunction.CountA(Range("J:J")) + 1

    Do While Cells(i + 1, 10).Value <> "" 'Alterar (i + 1, 10) onde 10 é o numero da coluna

        If Cells(i + 1, 10).Value = id Then 'Alterar (i + 1, 10) onde 10 é o numero da coluna
            flag = True
            For j = 2 To 4
                Cells(i + 1, j + 9).Value = Frm_Cad_Base.Controls("TextBox" & j).Value 'j+9 muda a coluna a ser percorrida a partir do 1
            Next j
        End If

        i = i + 1

    Loop

    If flag = False Then
        For j = 1 To 4
            Cells(emptyRow, j + 9).Value = Frm_Cad_Base.Controls("TextBox" & j).Value 'j+9 muda a coluna a ser percorrida a partir do 1
        Next j
    End If

End If

End Sub
 
Postado : 09/01/2020 11:36 pm