LISTBOX - ATUALIZAR...
 
Notifications
Clear all

[Resolvido] LISTBOX - ATUALIZAR BASE - ERRO DE LINHA

8 Posts
2 Usuários
4 Likes
1,165 Visualizações
 Siqs
(@siqs)
Posts: 12
Active Member
Topic starter
 

Bom dia galera! Todos bem?

Montando um controle de logística aqui, me deparei com um erro na hora de atualizar a base.

A ideia é a base ser alimentada somente pelo userform que criei, não impede que alterem direto na planilha, mas dentro do userform tem uma listbox e é possível atualizar e deletar pelo próprio userform.

O problema, quando altero um registro, a alteração é incluída como um novo registro e fora da tabela criada como base (umas 10 linhas abaixo), já procurei e sigo procurando uma solução por aqui e em outros fóruns, mas até agora não tive sucesso.

Sou leigo no assunto, essa solução já foi uma adaptação que fiz assistindo alguns tutoriais, agradeço demais se alguém conseguir um tempo para me ajudar.

 

Abraços,

 

 
Postado : 28/06/2022 10:55 am
EdsonBR
(@edsonbr)
Posts: 1056
Noble Member
 

Olá, @Siqs!

Durante a alteração, pelo fato do usuário já selecionar a linha-alvo no Listbox, vc pode aproveitar a propriedade ListIndex do ListBox pra ir direto na linha correspondente da Tabela, usando nessa última a propriedade ListRows, somando 1 pois a ListIndex é base-0 e a ListRows é base-1. Isso evita ter que usar o método Find e demais tratamentos.

Por exemplo, se o usuário está editando a 3ª linha da ListBox (que tem ListIndex = 2) essa linha também corresponderá coerentemente à 3ª linha da Tabela (ListRows(3)).

Assim vc poderia implementar, por exemplo:

With TABELA.ListRows(UserForm1.ListBox1.ListIndex + 1).Range
  .Cells(1).Value = REG
  .Cells(3).Value = UserForm1.TDATA.Value
  ' etc, etc...
End With

 
Postado : 28/06/2022 10:35 pm
Siqs reacted
 Siqs
(@siqs)
Posts: 12
Active Member
Topic starter
 

Bom dia @edsonbr !

Agradeço demais pela atenção, entendi o raciocínio e apliquei o código com as demais informações, agora a questão é que não está atualizando, única informação atualizada foi a data as outras não mudaram, o código ficou assim:

Sub EDITAR()

Bloquado = True
Dim TABELA As ListObject

Set TABELA = Planilha1.ListObjects(1)

With TABELA.ListRows(UserForm1.ListBox1.ListIndex + 1).Range
.Cells(3).Value = UserForm1.TDATA.Value
.Cells(4).Value = UserForm1.THSAÍDA.Value
.Cells(5).Value = UserForm1.TKMINICIO.Value
.Cells(6).Value = UserForm1.TVEÍCULO.Value
.Cells(7).Value = UserForm1.TMOTORISTA.Value
.Cells(8).Value = UserForm1.TSERVIÇO.Value
.Cells(9).Value = UserForm1.TOSCOLAFI.Value
.Cells(10).Value = UserForm1.THCHEGADA.Value
.Cells(11).Value = UserForm1.TKMFINAL.Value
.Cells(14).Value = UserForm1.TABASTECIMENTO.Value
.Cells(15).Value = UserForm1.TPOSTO.Value
.Cells(16).Value = UserForm1.TQTDLITROS.Value
.Cells(17).Value = UserForm1.TNOTA.Value
.Cells(18).Value = UserForm1.TMANUTENÇÃO.Value
.Cells(19).Value = UserForm1.TFRETE.Value
.Cells(20).Value = UserForm1.TDATAPGTO.Value
.Cells(21).Value = UserForm1.THEXTRAAM.Value
.Cells(22).Value = UserForm1.THEXTRAPM.Value
.Cells(23).Value = UserForm1.TALIMENTAÇÃO.Value
.Cells(24).Value = UserForm1.TOBSERVAÇÕES.Value

End With

Call ATUALIZAR_LISTBOX
Call LIMPAR_FORMULÁRIO
MsgBox "ATUALIZADO COM SUCESSO!"
BLOQUEADO = False

End Sub

Devo ter feito algo errado...

E aproveitando, imagino que posso utilizar o mesmo parâmetro para o código de exclusão, porém adicionando código para selecionar a linha completa e excluí-la, certo? (entirerow.delete)

Agradeço novamente pela atenção.

Abs,

 
Postado : 29/06/2022 10:47 am
 Siqs
(@siqs)
Posts: 12
Active Member
Topic starter
 

Bom dia @edsonbr !

Cometi um erro de digitação no código que havia te passado, por isso sua sugestão não tinha dado resultado, após a correção funcionou perfeitamente, agradeço novamente pelo suporte. 

 

Agora o desafio é excluir uma registro da tabela após selecionar no ListBox (ainda não achei a solução) e coloco abaixo o código para análise (obviamente resultou em erro, não entendo ainda todas as propriedades dos elementos e estou estudando para melhorar), segue:

Sub DELETAR()

BLOQUEADO = True
Dim TABELA As ListObject
Dim N As Integer, L As Integer


Set TABELA = Planilha1.ListObjects(1)
N = UserForm1.ListBox1.Value
L = TABELA.Range.Columns(1).Find(N, , , xlWhole).Row

Planilha1.Range(L).EntireRow.Select
Planilha1.Range(L).EntireRow.Delete

Call ATUALIZAR_LISTBOX
Call LIMPAR_FORMULÁRIO
MsgBox "EXCLUÍDO COM SUCESSO!"
BLOQUEADO = False

End Sub

Planilha em anexo.

 

Valeu gente!

 
Postado : 07/07/2022 11:52 am
EdsonBR
(@edsonbr)
Posts: 1056
Noble Member
 
Postado por: @siqs

Agora o desafio é excluir uma registro da tabela após selecionar no ListBox...

Nesse seu código, elimine as linhas:

   …
L = TABELA.Range.Columns(1).Find(N, , , xlWhole).Row
Planilha1.Range(L).EntireRow.Select
Planilha1.Range(L).EntireRow.Delete
   …

e em seu lugar insira a seguinte instrução:

TABELA.ListRows(N + 1).Delete

 

 

 
Postado : 11/07/2022 12:04 am
Siqs reacted
 Siqs
(@siqs)
Posts: 12
Active Member
Topic starter
 

Muito agradecido @edsonbr , funcionou perfeitamente! Se não for pedir demais, pode explicar o código por favor? Pq apenas inserindo (N + 1) o excel reconhece e exclui a linha exata sendo que antes ela buscava uma linha completamente fora do range?

Valeu novamente pelo tempo dedicado ao fórum.

Abs

OBS(planilha final - caso alguém tenha achado útil)

 
Postado : 11/07/2022 4:28 pm
EdsonBR
(@edsonbr)
Posts: 1056
Noble Member
 

Uma tabela (ListObject) é um objeto diferenciado no Excel. As linhas em uma tabela estão em uma coleção também especial (ListRows) que NÃO É uma coleção tipo Range. Range é uma Subpropriedade dela. A coleção ListRows contém todas as linhas e seu índice começa em 1 e vai até o nº de linhas da tabela. Então ListRows(1) retorna a primeira linha (objeto tipo ListRow) e ListRows(1).Range retorna o intervalo todo da primeira linha.

Note que não é necessário retornar o Range da linha pra poder deletá-lo (embora pudesse fazê-lo). A própria propriedade [argh!] ListRow já dispõe de um método Delete pra isso, o que torna o processo mais simples.

Como no seu UserForm a linha que vc selecionou no ListBox corresponde à mesma linha da Tabela, só que deslocada em 1 (pois o ListIndex começa em 0 e o ListRows começa em 1), a correspondência é única e pode ser usada para deletar a linha correta da tabela. 

 
Postado : 11/07/2022 4:45 pm
Siqs reacted
 Siqs
(@siqs)
Posts: 12
Active Member
Topic starter
 

Boa @edsonbr !

Explicação clara, agradeço pela aula.

Abs,

 
Postado : 11/07/2022 5:55 pm
EdsonBR reacted