Notifications
Clear all

Linha em branco no listview

10 Posts
2 Usuários
0 Reactions
1,273 Visualizações
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Pessoal, boa tarde!

Tenho uma listview a qual faço uma pesquisa por critério e, ao clicar em um dos resultados encontrados, os valores aparecem nos textbox's.

Até ai td bem. O negócio é que, se eu clicar em uma linha em branco, aparece o seguinte erro:

Vide o código que utilizo:

Dim linha, Index
Dim i As Integer
Dim oList As Object
Dim indiceRegistro As Long

Set oList = lslista.SelectedItem
If oList Is Nothing Then 'Exit Sub

Else
indiceRegistro = UserForm9.ProcuraIndiceRegistroPodId(lslista.ListItems.Item(lslista.SelectedItem.Index))
If indiceRegistro <> -1 Then
Call UserForm9.CarregaRegistroPorIndice(indiceRegistro)
End If

O que devo alterar?

 
Postado : 12/02/2014 12:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, você tem de verificar a aba de onde estão vindo os dados que preenche o ListView, por padrão um Listview quando é carregado não deixa linhas em branco apos o último registro, eu acredito que a aba que contem os dados, apos o ultimo registro possivelmente teve alguma digitação nela e depois foi apagada, e no excel, mesmo que uma celula esteja em branco, mas teve algum dado antes, a formatação continua e consequentemente o excel entende como celula preenchida.

[]s

 
Postado : 12/02/2014 5:00 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

A aba é um banco de dados que possui inúmeras células com formulas de apoio que ficam em branco, caso o código do item for igual a ""

Não existe um comando que verifica se o código do item está vazio?

 
Postado : 13/02/2014 12:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O Trecho do código acima, não permite visualizar como é feito o "carregamento" dos dados em sua listview (eu pelo menos não identifiquei).
Contudo a linha--> If oList Is Nothing Then 'Exit Sub deveria fazer isso, ou seja se clicou em uma linha sem dados (nothing) sai da sub; porem o trecho que sai ("Exit sub") foi comentado/inibido (uso do apostrofe " ' ").
Então creio eu se eliminar o apostrofe deva resolver.

 
Postado : 13/02/2014 12:42 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Reinaldo,

Eu fiz a retirada, mas não resolveu. Vide o erro:

o código que preenche a listview é esse:

Private Sub PreencheCampos()
Dim ws As Worksheet
Dim coluna As Integer
Dim linha As Integer
Set ws = ThisWorkbook.Worksheets(NomeDaPlanilha)
coluna = 1 'de 1 para 2
linha = LinhaCabecalho

With ws
While .Cells(linha, coluna).Value <> Empty
Me.ComboBoxCampos.AddItem .Cells(linha, coluna)
coluna = coluna + 1
If coluna = 13 Then Exit Sub
Wend
End With
End Sub

 
Postado : 13/02/2014 1:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, dificil acertar quado não temos o modelo para analisar, então vamos colocar amais algumas suposições:

Reinaldo o Exit Sub desabilitado de fato não resolve, como ele está adaptando de uma outra rotina para este esta instrução não existe.

Lorenzon, o código que postou que diz estar preenchendo o ListView, na verdade esta preenchendo um ComboBox "Me.ComboBoxCampos.AddItem .Cells(linha, coluna)".

2°) "A aba é um banco de dados que possui inúmeras células com formulas"
Pela primeira imagem que postou, os Formulários de Cadastro e Pesquisa não são carregados pela coluna "Cód" de seu BD ? Você define os Codigos com Formula paraCadastrar ?

3°) De uma lida no Tópico abaixo para entender qual a função da Variável "indiceRegistro" e outras dicas sobre adaptações neste modelo :

Private indiceRegistro As Long
Nessa variável alguns teem feito confusão entendendo como sendo a Linha, mas na verdade indiceRegistro é quem define qual registro será carregado, e o índice é o número da linha na planilha, e que atraves da rotina CarregaRegistroPorIndice alimenta e define o IndiceRegistro informando em qual linha o mesmo se encontra.

Então o erro que está acontecendo não é por causa de estar selecionando uma linha vazia no ListView w sim devido ao Registro no BD
Modelo Cadastro V3 - Adaptações
http://www.tomasvasquez.com.br/forum/vi ... v02T2JdXQQ

Para inibir este erro adicione a linha abaixo :
On Error Resume Next
Set oList = lstLista.SelectedItem
Lembrando que esta instrução evitara a mensagem de erro neste ponto, mas poderá ter outros erros mais adiante, nem sempre é aconselhavel este tratamento de erro, o ideal é ir Passo a Passo utilizando a tecla "F8" e verificar qual o numero que a Variável "indiceRegistro" carregou, supondo que ela armazenou o valor "Zero", poderia estar tratando com a condição "IF", mas estariámos a merces de outros erros pelo fato de a maioria das rotinas neste Modelo de Cadastro do Tomaz estarem interligadas praticamente em todas as rotinas.

[]s

 
Postado : 13/02/2014 4:59 pm
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

O carregamento da listview acontece mediante a execução desse código:

Private Sub PreencherCabeçalhoLinhas()

Dim ws As Worksheet
Dim coluna As Integer
Dim linha As Integer
Dim itm As ListItem, n As Long, lngCol As Long
Dim vardata As Variant

Call atualizar

Set ws = ThisWorkbook.Worksheets(NomeDaPlanilha)

coluna = 1
linha = LinhaCabecalho

Me.lslista.ListItems.Clear
Me.lslista.ColumnHeaders.Clear

vardata = ws.Range("b1").CurrentRegion.Value

With ws
While .Cells(linha, coluna).Value <> Empty
With lslista
.View = lvwReport
.Gridlines = True
.ColumnHeaders.Add Text:=ws.Cells(linha, coluna), Width:=ws.Cells(linha, coluna).Width

End With
coluna = coluna + 1
Wend

'Preenche as Linhas
With lslista
For n = 2 To UBound(vardata)
Set itm = .ListItems.Add(n - 1, , vardata(n, 1))
For lngCol = 2 To UBound(vardata, 2)

'verifica se é Data e formata a Coluna
If IsDate(vardata(n, lngCol)) Then
itm.ListSubItems.Add , , vardata(n, lngCol)

' itm.ListSubItems.Add , , Format(vardata(n, lngCol), "R$ #,##0.00")
Else
itm.ListSubItems.Add , , vardata(n, lngCol)
End If

Next lngCol
Next n
End With

End With

end sub

 
Postado : 15/02/2014 9:22 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Altere as linhas conforme abaixo e faça os testes:

Dim linha, Index
Dim i As Integer
Dim oList As Object
Dim indiceRegistro As Long

    Set oList = lstLista.SelectedItem
    If oList Is Nothing Then
        MsgBox "É preciso selecionar um item válido na lista"

   Else
            
            indiceRegistro = lstLista.SelectedItem.Index + 1
            
                     If indiceRegistro <> -1 Then
                        Call UserForm9.CarregaRegistroPorIndice(indiceRegistro)
                    End If
             Unload Me
    End If

[]s

 
Postado : 16/02/2014 9:39 am
(@lorenzon)
Posts: 355
Honorable Member
Topic starter
 

Mauro,

Resolveu parcialmente a minha demanda, mas para isso, tive que retirar o unload me, pois toda vez que clicava em uma linha, independente se tinha o código de identificação ou não, a mesma fechava. Outra coisa é, deduzo que o msgbox era para surgir ao clicar em uma linha em branco, mas isso não esta acontecendo. De todo mundo resolveu, ou seja, ao clicar nas linhas sem código, não aparece o erro mencionado acima.

O problema agora é: quando eu dou duplo clique (vide o código abaixo), o erro acontece.

Private Sub lsLista_DblClick()

Dim linha, Index
Dim i As Integer
Dim oList As Object
Dim indiceRegistro As Long

Set oList = lslista.SelectedItem
If oList Is Nothing Then
MsgBox "É preciso selecionar um item válido na lista"

Else
indiceRegistro = UserForm9.ProcuraIndiceRegistroPodId(lslista.ListItems.Item(lslista.SelectedItem.Index))
If indiceRegistro <> -1 Then
Call UserForm9.CarregaRegistroPorIndice(indiceRegistro)
End If

End If
cmdCancelar.Enabled = True
cmdAlterar.Enabled = True
cmdExcluir.Enabled = False
End Sub

 
Postado : 17/02/2014 2:17 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Lorenzon, sem ver o arquivo fica dificil ter uma resposta positiva, desta forma vamos ficar somente em suposição, a parte mais dificil em programação é quando resolvemos pegar modelos que funcionam para uma determinada aplicação e querer adaptar para outra.
As rotinas que está postando funcionam corretamente no modelo original do Tomaz, e se alteramos algumas referencias temos de ter o máximo de atenção para ajustar todas, se ler o tópico que mencionei antes sobre adaptações neste modelo verá que está bem claro isto.
[]s

 
Postado : 17/02/2014 5:38 pm