Vídeo recomendado
https://youtu.be/diWPPPhW-9E

ComboBox Encadeado não Filtra Corretamente

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
ortegaf
Colaborador
Colaborador
Mensagens: 33
Registrado em: Sáb Out 27, 2018 2:42 pm

ComboBox Encadeado não Filtra Corretamente

Mensagem por ortegaf »

Bom dia,
Tenho um formulário encadeado que filtra em cinco níveis, com base em uma planilha de cadastros (Plan1), a sequência é a seguinte:
1º Categoria; 2º Produto; 3º Tipo; 4º Tamanho; 5º Cor;
Segue o código:

Código: Selecionar todos

'------------------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?
Anexos
Planilha WorkShop.zip
(83.57 KiB) Baixado 188 vezes


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: ComboBox Encadeado não Filtra Corretamente

Mensagem por Reinaldo »

Creio que já vi algo similar ou mesma demanda em outro fórum; porem tanto lá como aqui não entendi a necessidade.
O Título "Combo Encadeado", remete a necessidade/desejo que um combo "defina" o preenchimento do combo subsequente; porem a complementação do Título "não Filtra Corretamente" remete a necessidade/desejo diferente.
Pode descrever com maiores detalhes o que espera/almeja, e qual são as peculiaridades dessas ocorrências.
Por exemplo:
Primeiro Combo (qual é: Nome) quando selecionado fazer -->Isto<-- se não selecionado (sem valor) o que fazer (ou não)
o mesmo para os demais controles envolvidos/encadeados.

Lembrando que ao iniciar seu formulário -->"frmModelo" <-- "carrega" a combo Categorias; o que normalmente/eventualmente "dispara" o evento Change desse controle, e a seguir executa outra rotina de preenchimento -->"PreencheCombo5" que também normalmente/eventualmente "dispara" o evento Change desse outro controle; algo quedeve ser levado em consideração (ou não)

Código: Selecionar todos

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
Call PreencheCombo5


ortegaf
Colaborador
Colaborador
Mensagens: 33
Registrado em: Sáb Out 27, 2018 2:42 pm

Re: ComboBox Encadeado não Filtra Corretamente

Mensagem por ortegaf »

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.
ComboBoxCategorias: Recheios; Cama; Superior; Decorativa; Aromas; Banho ----Aparece isto (Está Correto) ----
ComboBoxProdutos: Pillow Top; Recheio de Duvet; Protetor de Colchão; Travesseiros; Protetor Travesseiros; Recheio de Almofada; Recheio de Rolinho ----Aparece isto (Está Correto) ----
ComboBoxTipo: Aloevera; Pluma de Ganso ----Aparece isto (Está Correto) ----
ComboBoxTamanho: SK; Q/K; C; S; 50x70cm; 50x90cm; ----Aparece isto (Está ERRADO) ----
Deveria aparecer:
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 deveria 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:
ComboBoxCategorias: Recheios; Cama; Superior; Decorativa; Aromas; Banho ----Aparece isto (Está Correto) ----
ComboBoxProdutos: Pillow Top; Recheio de Duvet; Protetor de Colchão; Travesseiros; Protetor Travesseiros; Recheio de Almofada; Recheio de Rolinho ----Aparece isto (Está Correto) ----
ComboBoxTipo: (vazio) ----Aparece isto (Está Correto, porém eu não seleciono na lista pq ele não permite) ----
ComboBoxTamanho: (vazio) ----Aparece isto (Está ERRADO) ----
Deveria aparecer:
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...

Então amigo, será que pode me ajudar?
Obrigado pela atenção!


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: ComboBox Encadeado não Filtra Corretamente

Mensagem por Reinaldo »

Desculpe, sei que para voce está claro e definido o que espera "receber" de seu projeto/modelo, porem; às vezes sou lerdo para entender as coisas; para mim não está.
Creio que posso auxiliar mas tentar propor ou executar algo sem saber corretamente o contexto e osso.
Então, se não se inportar, como diria Jack, vamos por parte:
Seu modelo "Planilha workshop" -->frmModelo<-- temos 6 Combobox's denominadas:
"Ambiente, Categoria, Produtos,Tipo, Tamanho e Cor"
Ao inicializar/carregar o Formulário em tela, somente o Combo Categoria e "preenchido" os demais ficam sem valores.
Pergunta: E correto/esperado isso?
Combo Ambiente não será utilizada/faze parte dessa seleção?
as demais (Categoria, Produtos,Tipo, Tamanho e Cor) serão preenchidas quando?


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


ortegaf
Colaborador
Colaborador
Mensagens: 33
Registrado em: Sáb Out 27, 2018 2:42 pm

Re: ComboBox Encadeado não Filtra Corretamente

Mensagem por ortegaf »

Sim, são seis...
A combobox Ambiente não amarra nada na sua execução, por isso não citei no problema.
Quando eu executo o formulário, primeiro eu escolho o Ambiente, depois as Categorias que são previamente definidas, depois as combos Produtos que só devem ser preenchidos depois das Categorias. Depois a combo Tipo que deveria depender da Produtos e Ambiente, mas só depende da Produtos e assim por diante até chegar nas cores...
Portanto:
Ambiente: Não depende de nada
Categorias: Não depende de nada
Produtos: Depende da categoria para ser preenchida
Tipo: Deveria depender da Categorias e Produtos, mas só depende da Produtos para ser preenchida.
Tamanho: Deveria depender da Categorias, Produtos e Tipo, mas só depende da Tipo para ser preenchida.
Cor: Deveria depender da Categorias, Produtos e Tipo, mas só depende da Tipo para ser preenchida.

EDIT: Penso que o mais grave é problema da combobox vazia, por que, ela não traz nenhum valor. Enquanto o problema acima, traz valores em excesso, mas pelo menos traz alguma coisa.
Então, tem como o código entender que vazio também é um critério ?


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder