Notifications
Clear all

Organizar os ítens de um Combobox em ordem alfabética

9 Posts
3 Usuários
0 Reactions
3,424 Visualizações
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Amigos, pesquisando aqui no fórum e em outros fóruns, encontrei o seguinte código para ordenar os ítens de uma combobox em ordem alfabética:

    Dim iForsta, iSista As Integer
    Dim i, j As Integer
    Dim sTemp As String
    
    iForsta = 0
    iSista = ComboBox1.ListCount - 1
        
    For i = iForsta To iSista - 1
        For j = i + 1 To iSista
            If ComboBox1.List(i) > ComboBox1.List(j) Then
                sTemp = ComboBox1.List(j)
                ComboBox1.List(j) = ComboBox1.List(i)
                ComboBox1.List(i) = sTemp
            End If
        Next j
    Next i

Só que tem um porém... Não consigo fazer ele rodar.
Ele trava na linha ComboBox1.List(j) = ComboBox1.List(i) dizendo: "Não foi possível definir a propriedade List. Permissão negada"

Esse é apenas um exemplo que eu encontrei. Se alguém souber de uma outra maneira de organizar os ítens de uma combobox sem mexer na sua planilha fonte.
Estou anexando um exemplo fictício para os amigos darem uma olhada.

Quem puder ajudar, agradeço demais!
Forte abraço!

 
Postado : 24/06/2013 11:48 am
(@betorubini)
Posts: 57
Trusted Member
 

Olá

veja se é isso.
Adicionei a rotina de preencher o combobox quando inicia o form.

 
Postado : 24/06/2013 12:23 pm
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Beto, cara, sou novato em VBA e não consegui aplicar seu exemplo ao meu projeto.
Deixa eu ver se entendi, vc criou uma função para chamar os ítens lá da plan1 para o combobox1 certo?
Olha, aqui no projeto eu estou usando a seguinte chamada para preencher a combobox:

ComboBox1.RowSource = "Cadastro_produtosth!A2:A" & limite_produtos

Será que tem como adaptar a função de organizar alfabeticamente com esse meu código?
Só não posto meu arquivo aqui pq ele ultrapassa o tamanho máximo permitido pelo fórum.

Muito obrigado man!

 
Postado : 24/06/2013 1:22 pm
(@betorubini)
Posts: 57
Trusted Member
 

Fica mais fácil se você postar teu modelo aqui
também não sou expert, mas o até onde apurei o erro no modelo que você enviou anteriormente acontecia porque o combobox estava sendo preenchido pelo rowsource

 
Postado : 24/06/2013 1:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

wolneypk, quando definimos Rowsource direto no Combo, a única maneira de classificar é classificar os dados na aba antes de carregar.

No exemplo do Beto nao é utilizado a Propriedade RowSource, e para carregar o Combo com uma lista de outra aba, tem de ajustar o nome na linha :
With Sheets("plan1")

Na minha opinião, dependendo da qde de itens que irá carregar no combo, para termos uma melhor performance o ideal é classificar a coluna na aba e depois definir o Rowsource.

Segue um outro modelo onde adaptei para carregar os dados da aba "Cadastro_produtost" a partir da linha 2 col A.

Existem algumas outras formas de classificarmos, como eu disse, dependendo da qde de itens, temos de avaliar qual se adaptara melhor em questão de performance.

Uma outra forma, seria o que chamamos de "onFly",ou seja carregamos os itens em memoria, classificamos e só depois jogamos os resultado no Combo, adicione um novo botão em seu form e coloque a rotina abaixo,só ajuste o nome do botao na rotina

Classifica antes e só depois carrega o combo

Private Sub CommandButton3_Click()
    Dim i As Long, j As Long, v As Variant
    Dim tmp As Variant
    
    v = Range("A1:A5").Value
    
    For i = 1 To UBound(v, 1) - 1
        For j = i + 1 To UBound(v, 1)
            If v(i, 1) > v(j, 1) Then
                tmp = v(i, 1)
                v(i, 1) = v(j, 1)
                v(j, 1) = tmp
            End If
        Next
    Next
    
    ComboBox1.List = v
    
End Sub

[]s

 
Postado : 24/06/2013 6:03 pm
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Fala Mauro!
Obrigado pela explicação meu caro!
Foi muito esclarecedora! Obrigado mesmo!

Meu camarada, hoje, com a cabeça mais fria, consegui aplicar os três exemplos aqui mostrados por vocês.
E realmente, como vc mesmo mencionou, devido a quantidade de itens, ficou super lenta a classificação alfabética.
Tenho cerca de 1700 itens nessa minha tabela e o método que ficou um pouco mais rápido foi o Onfly.
Me diga uma coisa: quando você disse: "Na minha opinião, dependendo da qde de itens que irá carregar no combo, para termos uma melhor performance o ideal é classificar a coluna na aba e depois definir o Rowsource." você disse para eu classificar alfabeticamente os itens na própria planilha e depois chamá-los por rowsource lá no form, certo?

Meus caros, muito obrigado pela força de sempre!
Um forte abraço!

 
Postado : 25/06/2013 6:49 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Wonwy,

Me diga uma coisa: quando você disse: "Na minha opinião, dependendo da qde de itens que irá carregar no combo, para termos uma melhor performance o ideal é classificar a coluna na aba e depois definir o Rowsource." você disse para eu classificar alfabeticamente os itens na própria planilha e depois chamá-los por rowsource lá no form, certo?

É isto mesmo, classificar antes os dados na planilha e depois carregar no combo pelo rowsource, vou procurar entre os meus arquivos, depois anexo um modelo onde alem de classificar add a referencia dinamicamente e setamos o RowSource.

[]s

 
Postado : 25/06/2013 10:26 am
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Entendi Mauro, boa dica meu camarada!
Vou testar aqui e ver qual fica mais viável em termos de velocidade.

Valeu pela dica mestre!
Estou marcando o tópico como resolvido!

Forte abraço!
Wolney K.

 
Postado : 25/06/2013 11:08 am
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Mauro, o método que ficou mais rápido aqui foi o OnFly!
Realmente muito bom meu amigo!

Cara, agora ele só tem um defeito:
Vamos supor que eu tenha esse ítens:

ÁGUA
AZUL
ARROZ

O correto seria eles ficarem nessa ordem:

ÁGUA
ARROZ
AZUL

Mais ele organiza assim:

ARROZ
AZUL
ÁGUA

Eu estudei o caso e ele joga tudo que inicia com acentos gráfico para o final da classificação
Isso tb acontece com o "Ç"
Existe alguma maneira de driblar isso man?

 
Postado : 25/06/2013 1:31 pm