Código VBA para localizar células num ficheiro range
O método Find
da classe Range
é utilizado para encontrar
células que contêm um determinado valor ou formato num intervalo.
Encontrar em feuille de calcul
Na sua forma básica, Find é chamado como o código abaixo, que selecciona a célula encontrada. O código só funcionará se o valor estiver efetivamente presente na folha de cálculo.
ActiveSheet.UsedRange.Find(What:="x").Select
ActiveSheet
para fornecer o método pai Worksheet
objeto cujo Range
está a ser utilizada. No código real, é preferível utilizar variáveis de objeto explicitamente declaradas e atribuídas,
no caso atual: Dim wsActiveSheet As Worksheet
: Set wsActiveSheet = ActiveSheet
muito provavelmente com outra expressão de atribuição de objeto.
O objeto de classe Range
é obtido a partir do procedimento Worksheet UsedRange
.
O procedimento devolve um objeto do tipo Range que é opcionalmente atribuído a uma variável rngFound
.
Geralmente, utiliza-se uma variável, aqui: strWhat
para atribuir o parâmetro What
.
Dim strWhat As String: strWhat =
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:=strWhat)
O método Find
devolve Nothing
se não for encontrada nenhuma correspondência.
Encontrar em range
Procurar valor na coluna
O código abaixo permite-lhe encontrar uma célula que contenha o valor numa determinada coluna.
Dim rngColumn As Range
Set rngColumn = ActiveSheet.Columns(3)
Dim rngFound As Range
Set rngFound = rngColumn.Find(What:="x").Select
Procurar valor na linha
Utilize o seguinte código para encontrar uma célula que contenha o valor numa linha.
Dim rngRow As Range
Set rngRow = ActiveSheet.Rows(8)
Dim rngFound As Range
Set rngFound = rngRow.Find(What:="x")
O quê: especificar critérios de pesquisa
Descobrir o que
Os dados a pesquisar. Pode ser uma cadeia de caracteres ou qualquer tipo de dados do Microsoft Excel. Alguns conselhos sobre valores de parâmetros adequados:
- Ao pesquisar valores numéricos utilização
Lookin:=xlFormulas
eLookAt:=xlWhole
- Ao pesquisar valores de data utilização
Lookin:=xlFormulas
eLookAt:=xlWhole
. A data fornecida deve ser do tipo25/02/2024
que pode ser obtido utilizandoFormatDateTime(dtDate, vbGeneralDate)
- Ao pesquisar valores numéricos,
LookAt:=xlPart
pode fazer com que encontre mais números do que pretende: se procurar por 1 também obterá 301, 12 e assim por diante. - Se as colunas forem mais pequenas, as células podem não apresentar o valor, mas sim ###. Pode ser mais seguro combinar com
Lookin:=xlFormulas
Depois: célula de início da pesquisa
Se After
tiver sido especificado, a pesquisa começa depois desta célula;
a célula especificada não é pesquisada até o método voltar a esta célula.
After
deve ser uma única célula no intervalo.
Caso contrário, obtém-se .
O código abaixo inicia a pesquisa após a célula ativa, imitando a caixa de diálogo Localizar
Dim rngFound As Range
Set rngFound = ws.UsedRange.Find(What:="x", After:=ActiveCell)
LookIn: Fórmulas, valores, notas, comentários
Pode ser uma das seguintes constantes XlFindLookIn: xlFormulas (Fórmulas), xlValues (Valores), xlComments (Notas) ou xlCommentsThreaded (Comentários).
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", LookIn:=xlComments)
xlFormulas vs xlValues
A diferença entre Encontrar Fórmulas ou Valores pode ser observada experimentalmente. Coloque em A1 o valor x e em B1 a fórmula =A1. Na caixa de diálogo Procurar, prima Find All. Com a opção Fórmulas selecionada, apenas A1 é encontrado, enquanto que com a opção Valores, tanto A1 como B1 são encontrados.
- As fórmulas consideram o que a célula contém como o que está disponível na Barra de fórmula ;
- Os valores correspondem ao que é apresentado como valor na célula da grelha.
LookIn
, LookAt
e SearchOrder
explicitamente cada vez que utilizar o Find
método.
Ver: Corresponder todo o conteúdo da célula
Pode ser uma das seguintes constantes XlLookAt: xlWhole ou xlPart. Utilize xlWhole se precisar de encontrar uma célula com um texto específico.
Acrescente MatchCase:=True
se for necessário encontrar uma correspondência exacta em range (sensível a maiúsculas e minúsculas).
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", LookAt:=xlWhole, MatchCase:=True)
Utilização de wildcards
No Excel, existe uma utilização limitada de caracteres curinga no argumento Localizar:
- um ponto de interrogação (?) corresponde a um carácter se estiver dentro de uma cadeia;
- colocar um ponto de interrogação no início ou no fim também corresponde se houver mais de 1 carácter.
- Um asterisco (*) corresponde a qualquer série de caracteres.
Como exemplo, o código abaixo encontra qualquer célula que corresponda a "x".
Set rngFound = ActiveSheet.UsedRange.Find(What:="?x*")
O procedimento TestFindAll (parte inferior da página) ajuda-o a determinar que resultados podem ser esperados com determinados argumentos find.
Ele escreve o Address
do range na janela Immediate: $B$1:$C$1,$C$2
SearchOrder: Linhas ou Colunas
Pode ser uma das seguintes constantes XlSearchOrder: xlByRows ou xlByColumns.
- Pesquisar por coluna significa pesquisar primeiro todas as células da coluna A, depois da coluna B, etc.
- Pesquisar por linha significa pesquisar primeiro todas as células da linha 1, depois da linha 2, etc.
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", SearchOrder:=xlByRows)
SearchDirection: Procurar próximo
A direção de pesquisa juntamente com SearchOrder determinará quais serão as células seguintes. A combinação abaixo mover-se-á para cima em colunas ascendentes, por exemplo, assumindo que a última célula de UsedRange é B6: B6, B5, B4...
Dim rngFound As Range
Set rngFound = ActiveSheet.UsedRange.Find(What:="x", SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious)
Pesquisa de intervalo com vários critérios
Para encontrar células que correspondam a padrões mais complicados, pode utilizar uma instrução For Each...Next com:
- o operador Like,
- Aplicar testes booleanos combinados com E, Ou, etc.
Por exemplo, o seguinte código procura todas as células no range A1:C5 que utilizam um tipo de letra cujo nome comece com as letras Cour. Quando o Microsoft Excel encontra uma correspondência, ele altera a fonte para Times New Roman.
Dim rngCells As Range
Set rngCells = ActiveSheet.UsedRange.Cells
Dim rngCell As Range
Dim rngFound As Range
For Each rngCell In rngCells
If rngCell.Font.Name Like "Cour*" Then
Set rngFound = rngCell
Exit For
End If
Next rngCell
PesquisarFormato: Formato...
Devolver células apenas com determinada formatação aplicada (tipo de letra, cor de fundo,...).
O exemplo abaixo mostra que pode encontrar todas as células que têm uma cor de fundo utilizando uma cadeia vazia para o parâmetro What
.
Retire o comentário .Color = 65535
para obter as células marcadas a amarelo. Em alternativa, pode filtrar as células criadas Font.Bold
ou outras propriedades da célula.
What
e FindFormat
encontra apenas as células que correspondem a ambos os critérios.
Sub Demo()
With Application.FindFormat
.Clear
' .Font.Bold = True
With .Interior
.Pattern = xlSolid
'.Color = 65535 'rgbYellow
End With
End With
ActiveSheet.UsedRange.Find(After:=ActiveCell, What:="", SearchFormat:=True).Select
Application.FindFormat.Clear
End Sub
Clear
a FindFormat
(antes e) depois de executar o Find
.
MatchByte: por exemplo, japonês e chinês
Utilizado apenas se tiver selecionado ou instalado o suporte de idioma de byte duplo. Verdadeiro para que os caracteres de byte duplo correspondam apenas a caracteres de byte duplo. Falso para que os caracteres de byte duplo correspondam aos seus equivalentes de byte único.
Autor: Mark Uildriks Referência: Range.Find(Excel) | Microsoft Learn