Notifications
Clear all

Pintar linha do Listview com condição

5 Posts
2 Usuários
0 Reactions
1,072 Visualizações
(@depoisteconto)
Posts: 183
Reputable Member
Topic starter
 

Galera,

Tenho a rotina abaixo para pintar as linhas do listview de acordo com uma condição:

Está ocorrendo algo estranho, quando eu acompanho a execução pelo F8 tudo é executado da maneira certa, quando abro o formulário dá errado.

Anexo os arquivos excel e access.

Alguem pode ajudar?

Private Sub UserForm_Initialize()

Application.EnableEvents = False
Application.ScreenUpdating = False

Dim cx As New Classeconexao
Dim banco As ADODB.Recordset
Dim sql As String

On Error Resume Next

Set banco = New ADODB.Recordset

sql = " SELECT * FROM Tabela1 "
sql = sql & " WHERE Item1 = '" & "a" & "'"
    
cx.Conectar

Me.ListView1.View = lvwReport
Me.ListView1.Gridlines = True
Me.ListView1.ColumnHeaders.Add , , "Item 1"
Me.ListView1.ColumnHeaders.Add , , "Item 2"
Me.ListView1.ColumnHeaders.Add , , "Item 3"
Me.ListView1.ColumnHeaders(1).Width = 50
Me.ListView1.ColumnHeaders(2).Width = 50
Me.ListView1.ColumnHeaders(3).Width = 50
   
With banco
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .Source = sql
    .ActiveConnection = cx.Conn
    .Open
End With
       
Me.ListView1.FullRowSelect = True
    
Dim itens As ListItem
    
While Not banco.EOF

    Set itens = Me.ListView1.ListItems.Add(, , banco(1))
        itens.SubItems(1) = "" & banco(2)
        itens.SubItems(2) = "" & banco(3)

        If banco(3) = "c" Then
        itens.ForeColor = vbBlue
        For x = 0 To Me.ListView1.ColumnHeaders.Count - 1
        Me.ListView1.ListItems(N).ListSubItems(x).ForeColor = vbBlue
        Me.ListView1.ListItems(N).ForeColor = vbBlue
        Me.ListView1.ListItems(N).ForeColor = vbBlue
        Next
        N = N + 1
        ElseIf banco(3) = "a" Then
        itens.ForeColor = vbGreen
        For x = 0 To Me.ListView1.ColumnHeaders.Count - 1
        Me.ListView1.ListItems(N).ListSubItems(x).ForeColor = vbGreen
        Me.ListView1.ListItems(N).ForeColor = vbGreen
        Me.ListView1.ListItems(N).ForeColor = vbGreen
        Next
        N = N + 1
        Else
        itens.ForeColor = vbRed
        For x = 0 To Me.ListView1.ColumnHeaders.Count - 1
        Me.ListView1.ListItems(N).ListSubItems(x).ForeColor = vbRed
        Me.ListView1.ListItems(N).ForeColor = vbRed
        Me.ListView1.ListItems(N).ForeColor = vbRed
        Next
        N = N + 1
        End If
                
        banco.MoveNext

    Wend

cx.Desconectar

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
 
Postado : 07/08/2013 7:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Em quanto isso tente aqui:
http://www.vbaexpress.com/kb/getarticle.php?kb_id=916
http://www.vbforums.com/showthread.php? ... a-ListView

Pode te ajudar em algo..

Att

 
Postado : 07/08/2013 9:29 am
(@depoisteconto)
Posts: 183
Reputable Member
Topic starter
 

Bom dia!!

Em quanto isso tente aqui:
http://www.vbaexpress.com/kb/getarticle.php?kb_id=916
http://www.vbforums.com/showthread.php? ... a-ListView

Pode te ajudar em algo..

Att

A idéia é obter ajuda com o meu código e não mudar pra outro. Por isso postei ele aqui e criei um exemplo pra compartilhar também.

As rotinas dos links que você postou já foram dispostas aqui no fórum, eu sei disso porque pesquisei antes.

Complicada, e não se aplica diretamente a minha pergunta que, era pra ser um debug e não uma sugestão de como criar uma função pra isso.

De toda forma, obrigado por sua contribuição.

At

 
Postado : 07/08/2013 11:56 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Experimente assim:

Private Sub UserForm_Initialize()

Application.EnableEvents = False
Application.ScreenUpdating = False

Dim cx As New Classeconexao
Dim Banco As ADODB.Recordset
Dim sql As String, N As Integer

On Error Resume Next

Set Banco = New ADODB.Recordset

sql = " SELECT * FROM Tabela1 "
sql = sql & " WHERE Item1 = '" & "a" & "'"
    
cx.Conectar

Me.ListView1.View = lvwReport
Me.ListView1.Gridlines = True
Me.ListView1.ColumnHeaders.Add , , "Item 1"
Me.ListView1.ColumnHeaders.Add , , "Item 2"
Me.ListView1.ColumnHeaders.Add , , "Item 3"
Me.ListView1.ColumnHeaders(1).Width = 50
Me.ListView1.ColumnHeaders(2).Width = 50
Me.ListView1.ColumnHeaders(3).Width = 50
   
With Banco
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .Source = sql
    .ActiveConnection = cx.Conn
    .Open
End With
       
Me.ListView1.FullRowSelect = True
    
Dim itens As ListItem
While Not Banco.EOF

    Set itens = Me.ListView1.ListItems.Add(, , Banco(1))
        itens.SubItems(1) = "" & Banco(2)
        itens.SubItems(2) = "" & Banco(3)
        N = Me.ListView1.ListItems.Count
        If Banco(3) = "c" Then
            Me.ListView1.ListItems(N).ForeColor = vbBlue
            Me.ListView1.ListItems(N).ListSubItems(1).ForeColor = vbBlue
            Me.ListView1.ListItems(N).ListSubItems(2).ForeColor = vbBlue
        ElseIf Banco(3) = "a" Then
            Me.ListView1.ListItems(N).ForeColor = vbGreen
            Me.ListView1.ListItems(N).ListSubItems(1).ForeColor = vbGreen
            Me.ListView1.ListItems(N).ListSubItems(2).ForeColor = vbGreen
        Else
        itens.ForeColor = vbRed
            Me.ListView1.ListItems(N).ListSubItems(1).ForeColor = vbRed
            Me.ListView1.ListItems(N).ListSubItems(1).ForeColor = vbRed
            Me.ListView1.ListItems(N).ListSubItems(2).ForeColor = vbRed
        End If
        Banco.MoveNext

    Wend
cx.Desconectar

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
 
Postado : 07/08/2013 1:23 pm
(@depoisteconto)
Posts: 183
Reputable Member
Topic starter
 

Olá Reinaldo.

Obrigado pela resposta e sugestão, ajudou a solucionar o problema e é claro trouxe esclarecimentos adicionais.

Esqueci de colocar que no código original eu inicializava a variável "N" = 1.

Mantive o For para contagem das colunas, assim o código ficou mais enxuto, até porque o arquivo original são 12 colunas.

Agora tá ótimo.

Listview é complicado, mas dá pra levar com ajuda.

Muito Obrigado.

At

 
Postado : 08/08/2013 8:18 am