none
ComboBox Encadeado Nao Filtra Corretamente RRS feed

  • Pergunta

  • Boa tarde,

    Tenho um formulário encadeado que filtra em cinco níveis, com base em uma planilha de cadastros (Plan1).

    1º Categoria; 2º Produto; 3º Tipo; 4º Tamanho; 5º Cor;

    Segue o código:

    '------------------Primeiro Nível---------------------------------------
    Private Sub ComboBoxCategorias_Change()
        Call PreencheCombo2
    End Sub
    
    Sub PreencheCombo2()
    Dim OCOLLECTION As New Collection
    Dim VARVALUE As Variant
    Dim I As Long
    Dim L As Long
    L = 2
    ComboBoxProdutos.Clear
    
    On Error Resume Next
        For Each VARVALUE In Plan1.Range("B2:B" & Plan1.Range("A65536").End(xlUp).Row)
            If ComboBoxCategorias.Value = Plan1.Range("A" & L).Value Then
                OCOLLECTION.Add VARVALUE, VARVALUE
            End If
            
            L = L + 1
        Next
    
    For I = 1 To OCOLLECTION.Count
        ComboBoxProdutos.AddItem OCOLLECTION.Item(I)
    Next I
    
    End Sub
    '-------------Segundo Nível--------------------------------------------
    Private Sub ComboBoxProdutos_Change()
        Call PreencheCombo3
    End Sub
    
    Sub PreencheCombo3()
    Dim OCOLLECTION As New Collection
    Dim VARVALUE As Variant
    Dim I As Long
    Dim L As Long
    L = 2
    ComboBoxTipo.Clear
    
    On Error Resume Next
        For Each VARVALUE In Plan1.Range("C2:C" & Plan1.Range("A65536").End(xlUp).Row)
            If ComboBoxProdutos.Value = Plan1.Range("B" & L).Value Then
                OCOLLECTION.Add VARVALUE, VARVALUE
            End If
            
            L = L + 1
        Next
    
    For I = 1 To OCOLLECTION.Count
        ComboBoxTipo.AddItem OCOLLECTION.Item(I)
    Next I
    
    End Sub
    '--------------------Terceiro Nível-------------------------------------
    Private Sub ComboBoxTipo_Change()
        Call PreencheCombo4
    End Sub
    
    Sub PreencheCombo4()
    Dim OCOLLECTION As New Collection
    Dim VARVALUE As Variant
    Dim I As Long
    Dim L As Long
    L = 2
    ComboBoxTamanho.Clear
    
    On Error Resume Next
        For Each VARVALUE In Plan1.Range("D2:D" & Plan1.Range("A65536").End(xlUp).Row)
            If ComboBoxProduto.Value = Plan1.Range("B" & L).Value Then
            If ComboBoxTipo.Value = Plan1.Range("C" & L).Value Then
                OCOLLECTION.Add VARVALUE, VARVALUE
            End If
            End If
            
            L = L + 1
            
        Next
    
    For I = 1 To OCOLLECTION.Count
        ComboBoxTamanho.AddItem OCOLLECTION.Item(I)
    Next I
    
    End Sub
    '----------------------Quarto Nível-----------------------------------
    Sub PreencheCombo6()
    Dim OCOLLECTION As New Collection
    Dim VARVALUE As Variant
    Dim I As Long
    Dim L As Long
    L = 2
    ComboBoxCor.Clear
    
    On Error Resume Next
        For Each VARVALUE In Plan1.Range("E2:E" & Plan1.Range("A65536").End(xlUp).Row)
            If ComboBoxTamanho.Value = Plan1.Range("D" & L).Value Then
                OCOLLECTION.Add VARVALUE, VARVALUE
            End If
            
            L = L + 1
            
        Next
    
    For I = 1 To OCOLLECTION.Count
        ComboBox5.AddItem OCOLLECTION.Item(I)
    Next I
    
    End Sub
    
    
    '-------------------------Quinto Nível--------------------------------
    
    Private Sub UserForm_Initialize()
    Dim OCOLLECTION As New Collection
    Dim VARVALUE As Variant
    Dim I As Long
    On Error Resume Next
    For Each VARVALUE In Plan1.Range("A2:A" & Plan1.Range("A65536").End(xlUp).Row)
    
        OCOLLECTION.Add VARVALUE, VARVALUE
    Next
    For I = 1 To OCOLLECTION.Count
        ComboBoxCategorias.AddItem OCOLLECTION.Item(I)
    Next I
    
    End Sub
    
    
    
    Esse código apresenta dois problemas na sua execução:

    PRIMEIRO: Ele não está filtrando em cadeia, ou seja, ele filtra somente com base no último critério e não com base em todos os critérios, trazendo na Combox valores em excesso, por exemplo, eu escolho:

    Categoria: Recheios;

    Produto: Pillow Top;

    Tipo: Pluma de Ganso;

    Tamanho: SK, C, S, ou Q/K  ----- Isso é o que era pra ele trazer ----- 

    Mas ele traz:

    Categoria: Recheios;

    Produto: Pillow Top;

    Tipo: Pluma de Ganso;

    Tamanho: SK, C, S,Q/K, 40x90cm, 60x90cm, 30x70cm ----- Isso é o que ele Traz ----

    Isso acontece por que o código filtra com base apenas no ultimo critério(Tipo:Pluma de Ganso) quando na verdade era pra filtrar com base em todos os critérios.

    SEGUNDO:

    Quando o critério anterior é vazio, ele não traz o posterior corretamente, por exemplo:

    Categoria: Recheios;

    Produto: Protetor de Colchão;

    Tipo: (vazio)

    Tamanho: SK, C, S OU Q/K  ----- Isso é o que era pra ele Trazer ----

    Mas ele traz:

    Categoria: Recheios;

    Produto: Protetor de Colchão;

    Tipo: (vazio)

    Tamanho: (vazio) ----- Isso é o que ele Traz ----

    Alguém pode me ajudar?

    sábado, 30 de março de 2019 13:41

Todas as Respostas

  • Olá, Guilas!

    Como estão dispostos os dados na sua planilha?


    “First do it, then do it right, then do it better.” - Addy Osmani

    sábado, 30 de março de 2019 18:04
  • Estão organizados em colunas na sequencia que citei acima:

    Categoria     Produto    Tipo    Tamanho    Cor  Valor Unitário

    Recheios      Protetor               SK            Branca   0000

    E por ai vai....

    sábado, 30 de março de 2019 18:50
  • Desculpa, achei que tinha sido claro quando exemplifiquei o problema, vou tentar de novo:
    PRIMEIRO PROBLEMA:
    Tenho cinco ComboBox que deveriam filtrar a Combobox subsequente com base nas ultimas escolhidas, ou seja, a intenção é que o código "amarre" uma condição a outra bom base em vários critérios, por exemplo, quando eu escolho:
    Negrito são as opções que eu escolhi dentre as opções que apareceu na list.
    1º ComboBoxCategorias: Recheios; Cama Superior; Decorativa; Aromas; Banho ----Aparece isto (Está Correto) ----
    2º ComboBoxProdutos: Pillow Top; Recheio de Duvet; Protetor de Colchão; Travesseiros; Protetor Travesseiros; Recheio de Almofada; Recheio de Rolinho ----Aparece isto (Está Correto) ----
    3º ComboBoxTipo: Aloevera; Pluma de Ganso ----Aparece isto (Está Correto) ----
    4º ComboBoxTamanho: SK; Q/K; C; S; 50x70cm; 50x90cm; ----Aparece isto (Está ERRADO) ----
    Deveria aparecer:
    4º ComboBoxTamanho: SK; Q/K; C; S
    Eu acredito que isso acontece porque o código amarra a próxima combobox com base na anterior, quando na verdade ele deveraia amarrar com base em todas as escolhidas anteriormente, não somente na anterior(Como se vc fosse na tabela de cadastros e filtrasse as condições que eu escolhi)
    Então, para gerar a ComboBoxTamanho o código tem como critério a ComboBoxTipo quando na verdade deveria ter como critério a ComboBoxTipo, ComboBoxProdutos e ComboBoxCategorias.

    SEGUNDO PROBLEMA:
    1º ComboBoxCategorias: Recheios; Cama Superior; Decorativa; Aromas; Banho ----Aparece isto (Está Correto) ----
    2º ComboBoxProdutos: Pillow Top; Recheio de Duvet; Protetor de Colchão; Travesseiros; Protetor Travesseiros; Recheio de Almofada; Recheio de Rolinho ----Aparece isto (Está Correto) ----
    3º ComboBoxTipo: (vazio) ----Aparece isto (Está Correto, porém eu não seleciono na lista pq ele não permite) ----
    4º ComboBoxTamanho: (vazio) ----Aparece isto (Está ERRADO) ----
    Deveria aparecer:
    4º ComboBoxTamanho: SK; Q/K; C; S

    Ou seja, se eu tenho uma combo vazia, a combo subsequente não aparece corretamente. Por mais que esteja vazio, mas vazio também é um critério neste caso...
    • Editado Guilas segunda-feira, 1 de abril de 2019 01:43 Erro de formato
    segunda-feira, 1 de abril de 2019 01:40