Página 1 de 1
Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 12 Jul 2021 às 14:22
por JCabral
Boa tarde
Precisava de ajuda para o seguinte problema:
Tenho uma Userform com uma ComboBox e uma ListaBox e precisava que os itens fossem adicionados em função de um Rank, ou seja:
- A primeira vez que abro a userform o Rank é igual para todos, conforme vou selecionado os nomes, vou adicionando (+1) ao valor existente do Rank e assim a próxima vez que abrir a userform os primeiros dados a aparecer na ComboBox e na ListBox são os que têm maior valor na coluna Rank;
O que se pretende é que os primeiros dados que aparecem na ComboBox/ListBox são os que mais são usados.
Anexo ficheiro com a Userform e com alguns dados, sendo que o Rank está a zeros para todos. O que se pretende é que na Combobox só venham os NOME COMPLETOS e Na ListBox venham os NOME COMPLETOS e a SECÇÃO.
Obrigado
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 12 Jul 2021 às 19:49
por osvaldomp
Salve, Jorge.
Considerei apenas a
ListBox, veja se é o suficiente.
Selecione um ou mais itens e clique no botão
Escolher.
Código: Selecionar todosPrivate Sub UserForm_Initialize()
Dim LR As Long
LR = Sheets("Folha1").Cells(Rows.Count, 1).End(3).Row
Sheets("Folha1").Range("A1:C" & LR).Sort Key1:=[C1], Order1:=xlDescending, Header:=xlYes
With Me.ListBox1
.ColumnCount = 3
.ColumnHeads = True
.ColumnWidths = "110;40;10"
.MultiSelect = fmMultiSelectMulti
.RowSource = "Folha1!A2:C" & LR
End With
End Sub
Código: Selecionar todosPrivate Sub CommandButton1_Click()
Dim k As Long, n As Long, LR As Long
If ListBox1.ListIndex = -1 Then Exit Sub
For k = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(k) = True Then
With Sheets("Folha1")
LR = .Cells(Rows.Count, 1).End(3).Row
n = .Range("A2:A" & LR).Find(ListBox1.List(k)).Row
.Cells(n, 3) = .Cells(n, 3) + 1
.Range("A1:C" & LR).Sort Key1:=[C1], Order1:=xlDescending, Header:=xlYes
End With
End If
Next k
End Sub
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 12 Jul 2021 às 22:04
por Strogonoff
Caro amigo , boa noite
Sempre temos mais de um caminho para chegar a um resultado, e talvez até mais rápidos que este apresentado...
Segue uma singela sugestão para o que você propôs.
Espero que ajude, e aproveite as duas resposta para criar sua própria linhas de prgramação...
Abraço
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 13 Jul 2021 às 08:01
por osvaldomp
Salve, Jorge.
Segue uma alternativa sem o uso de
Form.
Instale uma cópia do código abaixo no módulo da
Folha1 .
Para adicionar 1 ao Rank aplique duplo clique ou sobre o nome ou sobre a secção ou sobre o rank.
Código: Selecionar todosPrivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column > 3 Or Cells(Target.Row, 1) = "" Then Exit Sub
Cells(Target.Row, 3) = Cells(Target.Row, 3) + 1
Range("A1:C" & Cells(Rows.Count, 1).End(3).Row).Sort Key1:=[C1], Order1:=xlDescending, Header:=xlYes
Cancel = True
End Sub
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 14 Jul 2021 às 08:55
por JCabral
Obrigado Osvaldo / Strogonoff
Osvaldo estou a ter um "erro" quando seleciono mais do que um item na Listbox , ou seja só no primeiro item é feito o incremento. O que me parece é que depois de escrever na planilha o incremento todos os itens da Listbox são desseleccionados e por isso no loop seguinte a seleção vem "False" para todos os itens, tem como contornar este problema?
Strogonoff testei a sua solução no Excel 2013 e deu erro em:
Código: Selecionar todos ActiveWorkbook.Worksheets("Folha1").Sort.SortFields.Add2 Key:=w.Range("C2:C" & lUltLin) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
tem como contornar este problema?
Muito obrigado aos dois mais uma vez.
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 14 Jul 2021 às 10:12
por osvaldomp
Salve, Jorge.
Verdade. Falha minha.
Experimente o código abaixo no lugar do anterior, sff.
Código: Selecionar todosPrivate Sub CommandButton1_Click()
Dim k As Long, n As Long, LR As Long
If ListBox1.ListIndex = 0 Then Exit Sub
For k = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(k) = True Then
With Sheets("Folha1")
LR = .Cells(Rows.Count, 1).End(3).Row
n = .Range("A2:A" & LR).Find(ListBox1.List(k)).Row
Application.Calculation = xlCalculationManual
.Cells(n, 3) = .Cells(n, 3) + 1
End With
End If
Next k
Application.Calculation = xlCalculationAutomatic
Sheets("Folha1").Range("A1:C" & LR).Sort Key1:=[C1], Order1:=xlDescending, Header:=xlYes
End Sub
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 14 Jul 2021 às 11:09
por Strogonoff
por favor tenta agora
dei uma melhorada no código
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 14 Jul 2021 às 13:56
por JCabral
osvaldomp escreveu: ↑14 Jul 2021 às 10:12
Salve, Jorge.
Verdade. Falha minha.
Experimente o código abaixo no lugar do anterior, sff.
Código: Selecionar todosPrivate Sub CommandButton1_Click()
Dim k As Long, n As Long, LR As Long
If ListBox1.ListIndex = 0 Then Exit Sub
For k = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(k) = True Then
With Sheets("Folha1")
LR = .Cells(Rows.Count, 1).End(3).Row
n = .Range("A2:A" & LR).Find(ListBox1.List(k)).Row
Application.Calculation = xlCalculationManual
.Cells(n, 3) = .Cells(n, 3) + 1
End With
End If
Next k
Application.Calculation = xlCalculationAutomatic
Sheets("Folha1").Range("A1:C" & LR).Sort Key1:=[C1], Order1:=xlDescending, Header:=xlYes
End Sub
Tudo OK, muito obrigado
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 15 Jul 2021 às 19:26
por JCabral
Strogonoff escreveu: ↑14 Jul 2021 às 11:09
por favor tenta agora
dei uma melhorada no código
Caro Strogonoff
Continua a dar erro, incluindo quando abro o ficheiro dá-me erro "Encontrámos um problema de conteúdos em "PopulateComboBoxRank_resposta.xlsm". Pretende recuperar o máximo possível? Se a origem deste ficheiro for fidedigna, clique em Sim.
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 15 Jul 2021 às 19:41
por Strogonoff
Caro JCabral
boa noite!!
está dando essa mensagem, pois tem macros, essa mensagem que você falou realmente aparece.
você pode dar sim e não habilitar a macro, e se quiser copiar o codigo ou rodar o programa, fica a seu critério.
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 15 Jul 2021 às 20:11
por JCabral
Ok, mas continua a dar erro em:
Código: Selecionar todos w.Sort.SortFields.Add2 Key:=w.Range("C2:C" & lUltLin) _
, SortOn:=xlSortOnValues, Order:=xlDescending
ERRO: Run-time error '438': Object doesn't support this property or method
Obrigado
Re: Adicionar dados a uma Combo e ListBox baseado num Rank
Enviado: 19 Jul 2021 às 22:15
por Strogonoff
Amigo
vou passar o codigo aqui
talvez fique mais pratico para você
copiar o codigo no proprio userform
Option Explicit
Dim rg As Range
Dim lUltLin As Long
Dim w As Worksheet
Private Sub UserForm_Initialize()
Set w = Folha1
''''''''''''''''''''''''''''''''''''''''''
'CONFIGURAÇÃO INICIAL
'''''''''''''''''''''''''''''''''''''''''''
Call ClassificarLista
''''''''''''''''''''''''''''''''''''''''''
'CARREGANDO O CBO E LIST
'''''''''''''''''''''''''''''''''''''''''''
Call CarregaCboeList
End Sub
Private Sub ComboBox1_DropButtonClick()
Dim sNome As String
Dim lrank As Long
Dim lLine As Long: lLine = 1
''''''''''''''''''''''''''''''''''''''''''
'TRATAMENTO DE ERRO
'''''''''''''''''''''''''''''''''''''''''''
If Me.ComboBox1.Value = "" Then
Exit Sub
End If
sNome = Me.ComboBox1.Value
lLine = w.Range("a:A").Find(sNome).Row
''''''''''''''''''''''''''''''''''''''''''
'INCREMENTANDO O RANK
'''''''''''''''''''''''''''''''''''''''''''
lrank = w.Cells(lLine, "C").Value
lrank = lrank + 1
w.Cells(lLine, "C").Value = lrank
MsgBox " Você selecionou " & sNome & Chr(13) & _
" e foi selecionado: " & lrank & " Vez(es)"
''''''''''''''''''''''''''''''''''''''''''
'ATUALIZANDO O CBO E LIST
'''''''''''''''''''''''''''''''''''''''''''
Call ClassificarLista
End Sub
Private Sub CommandButton1_Click()
Dim sNome As String
Dim lrank As Long
Dim lLine As Long: lLine = 1
''''''''''''''''''''''''''''''''''''''''''
'TRATAMENTO DE ERRO
'''''''''''''''''''''''''''''''''''''''''''
If Me.ListBox1.Value = "" Then
Exit Sub
End If
sNome = Me.ListBox1.List(, 0)
lLine = w.Range("a:A").Find(sNome).Row
''''''''''''''''''''''''''''''''''''''''''
'INCREMENTANDO O RANK
'''''''''''''''''''''''''''''''''''''''''''
lrank = w.Cells(lLine, "C").Value
lrank = lrank + 1
w.Cells(lLine, "C").Value = lrank
MsgBox " Você selecionou " & sNome & Chr(13) & _
" e foi selecionado: " & lrank & " Vez(es)"
''''''''''''''''''''''''''''''''''''''''''
'ATUALIZANDO O CBO E LIST
'''''''''''''''''''''''''''''''''''''''''''
Call ClassificarLista
End Sub
Sub CarregaCboeList()
Dim i As Integer
Dim iDados As Integer: iDados = 0
Me.ComboBox1.Clear ' limpando a combobox
Me.ListBox1.Clear 'limpando a listbox
For i = 2 To lUltLin
With UserForm1.ListBox1
.AddItem
.List(iDados, 0) = w.Cells(i, "A")
.List(iDados, 1) = w.Cells(i, "B")
iDados = iDados + 1
End With
UserForm1.ComboBox1.AddItem w.Cells(i, "A").Value
Next i
End Sub
Sub ClassificarLista()
Set rg = w.Range("A1").CurrentRegion
lUltLin = rg.Rows.Count ' definindo a ultima linha
''''''''''''''''''''''''''''''''''''''''''
'CRIANDO O RANK DO MAIOR PARA O MENOR
'''''''''''''''''''''''''''''''''''''''''''
w.Range("C2:C" & lUltLin).Select
ActiveWorkbook.Worksheets("Folha1").Sort.SortFields.Add2 Key:=Range("C2:C" & lUltLin) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With w.Sort
.SetRange Range("A2:C" & lUltLin)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Call CarregaCboeList
End Sub