Jump to content
dlemos

Procurar palavras-chave em coluna do Excel

Recommended Posts

dlemos

Boas

Tenho uma coluna de frases no Excel, e pretendo saber quais delas contêm algumas palavras chave. A lista de palavras-chave está presente no array palavras

Segue o código:


Option Compare Text

Public pedido(), descricao(), qtd(), obs()
Public palavras() As String
Public contador As Long, counter As Long
Public auxiliar

Public Sub armazenar()

'inicializaçao
ReDim palavras(1)

ReDim pedido(1)
ReDim descricao(1)
ReDim qtd(1)
ReDim obs(1)

counter = 1

For i = 1 To Module3.xlLastRow("palavrasChave")
    
    palavras(counter) = Sheets("palavrasChave").Cells(i + 1, 1)
    ReDim Preserve palavras(UBound(palavras) + 1)
    counter = counter + 1
    
Next i

're-inicializaçao do contador
contador = 1

    For i = 1 To Module3.xlLastRow("Chargeback")
            
        'Sheets(1).Cells(i + 1, 6)
        
        For j = 1 To UBound(palavras)
     
            If Sheets(1).Cells(i + 1, 6) Like "*" & palavras(j) Then
            
                descricao(contador) = Sheets(1).Cells(i + 1, 6)
                pedido(contador) = Sheets(1).Cells(i + 1, 7)
                qtd(contador) = Sheets(1).Cells(i + 1, 11)
                obs(contador) = Sheets(1).Cells(i + 1, 16)
                
                
                ReDim Preserve pedido(UBound(pedido) + 1)
                ReDim Preserve descricao(UBound(descricao) + 1)
                ReDim Preserve qtd(UBound(qtd) + 1)
                ReDim Preserve obs(UBound(obs) + 1)
                
                'MsgBox pedido(contador) & " " & descricao(contador)
                
                contador = contador + 1
                Exit For
            End If
            
        Next j
        
    Next i
    

End Sub

Public Sub escrever()

For i = 1 To UBound(descricao)

    Sheets(4).Cells(i + 1, 1) = pedido(i)
    Sheets(4).Cells(i + 1, 2) = descricao(i)
    Sheets(4).Cells(i + 1, 3) = qtd(i)
    'Sheets(4).Cells(i + 1, 4) = obs(i)
    
Next i

For i = 1 To UBound(palavras)
    Sheets(4).Cells(i + 1, 5) = palavras(i)
Next i

End Sub

A função main:

Public Sub main()

    armazenar
    escrever

End Sub

Resultado: todas as linhas da coluna a pesquisar aparecem. Penso que o que está a falhar é esta linha:

If Sheets(1).Cells(i + 1, 6) Like "*" & palavras(j) Then

Mas não sei bem porquê...alguma ideia?

Obrigado.

Share this post


Link to post
Share on other sites
jpaulino

If Sheets(1).Cells(i + 1, 6) Like "*" & palavras(j) Then

Dessa forma procuras todas as palavras que começem por qualquer coisa e que terminem na tua palavra (array palavras). Penso que queres procurar em qualquer lado da célula, tipo:

If Sheets(1).Cells(i + 1, 6).Value Like "*" & palavras(j) & "*" Then

Share this post


Link to post
Share on other sites
dlemos

Peço descukpa, copiei mal para aqui o código, eu realmente estava a usar:


auxiliar = Sheets(1).Cells(i + 1, 6)
If auxiliar Like "*" & palavras(j) & "*" Then

independentemente do que coloco no array palavras, são apresentadas todas as linhas da coluna de pesquisa

:(

Share this post


Link to post
Share on other sites
jpaulino

Atenção que o operador Like é case sensitive ... tenta assim.

auxiliar = ucase(Sheets(1).Cells(i + 1, 6))
If auxiliar Like "*" & ucase(palavras(j)) & "*" Then

Share this post


Link to post
Share on other sites
dlemos

Descobri o problema

A maneira como estava a construir o array palavras faz com que nas últimas 2 posições ele tenha valores nulos...

Quando comparados com a coluna de pesquisa (onde há algures obrigatoriamente um caracter nulo, porque a coluna consiste essencialmente de expressões/frases), ele encontra sempre correspondência.

acrescentei a seguir à leitura do array palavras


Redim preserve palavras(ubound(palavras)-2

para eliminar as posições nulas e já dá certo :(

jpaulino obrigado mais uma vez pela sempre útil ajuda, abraço!

Share this post


Link to post
Share on other sites
jpaulino

Ainda bem que está resolvido :(

Mas já agora .... porque a solução não me agrada nada:

1) Porque defines ReDim palavras(1) ? Isto está a criar duas posições no array (a zero e a um). Devias fazer ReDim palavras(0)

2) Porque não usas uma colecção em vez de arrays?

Dim col As New Collection

col.Add 1

Share this post


Link to post
Share on other sites
dlemos

Redim (1) cria 2? pensei que criasse 1..

Colecções  não sei utilizar...qual é a vantagem das colecções ?

Share this post


Link to post
Share on other sites
jpaulino

Redim (1) cria 2? pensei que criasse 1..

Colecções  não sei utilizar...qual é a vantagem das colecções ?

Os arrays são base 0, ou seja, se quiseres 5 posições defines palavras(4) porque podes fazer:

palavras(0) = "qualquer coisa"

As colecções não têm o problema dos arrays (de ultrapassares o indice superior) e são mais fáceis/flexiveis. Experimenta e vais ver que é fácil :(

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.