Notifications
Clear all

Corrigir filtro de palavra-chave por VBA

6 Posts
2 Usuários
0 Reactions
1,583 Visualizações
(@yatagan)
Posts: 22
Eminent Member
Topic starter
 

Boa tarde,

Consegui copiar um código vba e consegui inserir na minha planilha do jeito que eu queria, que seria pesquisar pela palavra chave (uma letra/palavra aleatoria dentro de uma célula)
Eu mexo com planilhas de Dietas e gostaria de automatiza-las, estou mandando um anexo com ela e com sugestões da alteração do meu problema

Pra mostrar o formulário de pesquisa é só clicar em uma das célula de A8:A68 duas vezes, aba "Planejamento"

1. Aparece um espaço em branco que gostaria de tirar deixar apenas a coluna com a lista dos alimentos
2. Ao clicar no alimento desejado a adicionar ele não adiciona e fica com essa faixa azul em cima, gostaria de deixar essa faixa azul e que ao clica 2 vezes o alimento fosse adicionado, caso não dê pra deixar a faixa azul, só de clicar 2 vezes no aliemnto e adicioná-lo está de bom tamanho.

qualquer coisa está aqui o código do formulário

Private Sub UserForm_Initialize()
  ListBox1.ColumnCount = 2
  ListBox1.ColumnWidths = "20"
End Sub
Private Sub TextBox1_Change()
    'Nome da planilha em que estão os registros:
  Const csPlan As String = "Alimentos"
  
  'Em qual coluna estão os registros?
  Const csCol As String = "B"
  
  Dim col As VBA.Collection
  Dim lLast As Long
  Dim lRow As Long
  Dim vKey As Variant
  Dim ws As Excel.Worksheet
  Dim l As Long
  Dim lCount As Long
  
  Do While InStr(TextBox1, "  ")
    TextBox1 = Replace(TextBox1, "  ", " ")
  Loop
  TextBox1 = Trim(TextBox1)
  
    
  Set col = New VBA.Collection
  ListBox1.Clear
  Set ws = ThisWorkbook.Worksheets(csPlan)
  With ws
    lLast = .Cells(.Rows.Count, csCol).End(xlUp).Row
    'Considerando uma linha de cabeçalho:
    For lRow = 3 To lLast
      For Each vKey In Split(TextBox1, " ")
        If UCase(.Cells(lRow, csCol)) Like "*" & UCase(vKey) & "*" Then
          On Error Resume Next
          col.Add CStr(lRow), CStr(lRow)
          On Error GoTo 0
        End If
      Next vKey
    Next lRow
  End With

  With ListBox1
    For l = 1 To col.Count
      .AddItem
      lCount = .ListCount - 1
      .List(lCount, 1) = col(1)
      .List(lCount, 1) = ws.Cells(col(l), csCol)
    Next l
  End With
End Sub

Obrigado desde já.

 
Postado : 07/01/2018 10:16 am
(@klarc28)
Posts: 971
Prominent Member
 

Resolvendo a parte 1:

Private Sub UserForm_Initialize()
'  ListBox1.ColumnCount = 1
 ' ListBox1.ColumnWidths = "20"
End Sub
Private Sub TextBox1_Change()
    'Nome da planilha em que estão os registros:
  Const csPlan As String = "Alimentos"
  
  'Em qual coluna estão os registros?
  Const csCol As String = "B"
  
  Dim col As VBA.Collection
  Dim lLast As Long
  Dim lRow As Long
  Dim vKey As Variant
  Dim ws As Excel.Worksheet
  Dim l As Long
  Dim lCount As Long
  
  Do While InStr(TextBox1, "  ")
    TextBox1 = Replace(TextBox1, "  ", " ")
  Loop
  TextBox1 = Trim(TextBox1)
  
    
  Set col = New VBA.Collection
  ListBox1.Clear
  Set ws = ThisWorkbook.Worksheets(csPlan)
  With ws
    lLast = .Cells(.Rows.Count, csCol).End(xlUp).Row
    'Considerando uma linha de cabeçalho:
    For lRow = 3 To lLast
      For Each vKey In Split(TextBox1, " ")
        If UCase(.Cells(lRow, csCol)) Like "*" & UCase(vKey) & "*" Then
          On Error Resume Next
          col.Add CStr(lRow), CStr(lRow)
          On Error GoTo 0
        End If
      Next vKey
    Next lRow
  End With

  With ListBox1
    For l = 1 To col.Count
      .AddItem (ws.Cells(col(l), csCol))
    '  lCount = .ListCount - 1
     ' .List(lCount, 1) = col(1)
    '  .List(lCount, 1) = ws.Cells(col(l), csCol)
    Next l
  End With
End Sub
 
Postado : 07/01/2018 11:19 am
(@klarc28)
Posts: 971
Prominent Member
 

Parte 2:

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim linha As Long
linha = 8

While Planilha1.Cells(linha, 1).Value <> ""

linha = linha + 1
Wend
'colocando o valor selecionado com duplo clique
'na célula da coluna A, na próxima linha em branco
Planilha1.Cells(linha, 1).Value = Me.ListBox1.Value
End Sub
 
Postado : 07/01/2018 11:45 am
(@yatagan)
Posts: 22
Eminent Member
Topic starter
 

a parte 1 ficou ótima, Obrigado.

Mas a parte 2 o quadro não some depois que seleciono e cada vez que seleciono ele vai para outra linha.
eu tenho um modelo aqui que está sem o filtro de palavra chave em que qnd eu clico no alimento escolhido o quadro sai e da certo qnd clico novamente na mesma celula o alimento só é substituindo e não vai para a linha de baixo. dá uma olhada

Essa é o código do formulário sem filtro de palavra chave, caso não seja possível ajeitar completamente aquele, só basta passar pra esse a capacidade de filtrar palavra chave.

Option Explicit
Private TextoDigitado As String


Private Sub ListBox1_Click()
    ActiveCell.Value = ListBox1.Value
    Unload Me
End Sub
Private Sub TextBox1_Change()
    TextoDigitado = TextBox1.Text
    Call PreencheLista
End Sub
Private Sub UserForm_Initialize()
    Call PreencheLista
End Sub
Private Sub PreencheLista()
    Dim ws As Worksheet
    Dim i As Integer
    Dim TextoCelula As String
    Set ws = ThisWorkbook.Worksheets(2)
    i = 3
    ListBox1.Clear
    With ws
        While .Cells(i, 2).Value <> Empty
            TextoCelula = .Cells(i, 2).Value
            If UCase(Left(TextoCelula, Len(TextoDigitado))) = UCase(TextoDigitado) Then
                ListBox1.AddItem .Cells(i, 2)
            End If
            i = i + 1
        Wend
    End With
End Sub

ah, e não precisa add código vinculado as células pq já configurei isso e coloquei na planilha1 "Planejamento"

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 1 Then
If Target.Row >= 8 Then
If Target.Row <= 68 Then UserForm1.Show
End If
End If
End Sub
 
Postado : 07/01/2018 12:11 pm
(@klarc28)
Posts: 971
Prominent Member
 

Parte 3:

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim linha As Long
linha = ActiveCell.Row

'colocando o valor selecionado com duplo clique
'na célula ativa
Planilha1.Cells(linha, 1).Value = Me.ListBox1.Value

Unload Me
End Sub
 
Postado : 07/01/2018 12:24 pm
(@yatagan)
Posts: 22
Eminent Member
Topic starter
 

MUITO OBRIGADO!

 
Postado : 07/01/2018 12:47 pm