Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
#65674
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
Você não está autorizado a ver ou baixar esse anexo.
#65689
Salve, Jorge.

Considerei apenas a ListBox, veja se é o suficiente.

Selecione um ou mais itens e clique no botão Escolher.
Código: Selecionar todos
Private 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 todos
Private 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


JCabral agradeceu por isso
#65691
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
Você não está autorizado a ver ou baixar esse anexo.
JCabral agradeceu por isso
#65700
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 todos
Private 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

JCabral agradeceu por isso
#65735
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.
#65737
Salve, Jorge.

Verdade. Falha minha.

Experimente o código abaixo no lugar do anterior, sff.
Código: Selecionar todos
Private 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
JCabral agradeceu por isso
#65752
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 todos
Private 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
osvaldomp agradeceu por isso
#65781
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.
#65850
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
JCabral agradeceu por isso
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord