web-dev-qa-db-fra.com

Comment trouver une valeur dans une colonne Excel avec le code vba Cells.Find

Je dois trouver une valeur celda dans une feuille Excel. J'utilisais ce code vba pour le trouver:

Set cell = Cells.Find(What:=celda, After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=False, SearchFormat:=False)


If cell Is Nothing Then
    'do it something

Else
    'do it another thing
End If

Le problème est quand je dois trouver la valeur seulement dans une colonne Excel. Je le trouve avec le code suivant:

    Columns("B:B").Select
    Selection.Find(What:="VA22GU1", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate

Mais je ne sais pas comment l'adapter au premier code vba, car je dois utiliser la valeur nothing.

26

Juste utiliser

Columns("B:B").Select
Set cell = Selection.Find(What:="celda", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

If cell Is Nothing Then
    'do it something

Else
    'do it another thing
End If
39
Andrey Gordeev

Juste pour être complet, vous pouvez également utiliser la même technique que ci-dessus avec les tableaux Excel.

Dans l'exemple ci-dessous, je cherche un texte dans n'importe quelle cellule d'un tableau Excel nommé "tblConfig", placé dans la feuille nommée Config qui est normalement définie pour être masquée. J'accepte les valeurs par défaut de la méthode Find.

Dim list As ListObject
Dim config As Worksheet
Dim cell as Range


Set config = Sheets("Config")
Set list = config.ListObjects("tblConfig")

'search in any cell of the data range of Excel table
Set cell = list.DataBodyRange.Find(searchTerm)

If cell Is Nothing Then
    'when information is not found
Else
    'when information is found
End If
8
Mário Meyrelles
Dim strFirstAddress As String
Dim searchlast As Range
Dim search As Range

Set search = ActiveSheet.Range("A1:A100")
Set searchlast = search.Cells(search.Cells.Count)

Set rngFindValue = ActiveSheet.Range("A1:A100").Find(Text, searchlast, xlValues)
If Not rngFindValue Is Nothing Then
  strFirstAddress = rngFindValue.Address
  Do
    Set rngFindValue = search.FindNext(rngFindValue)
  Loop Until rngFindValue.Address = strFirstAddress
4
Mona

Je préférerais utiliser la méthode .Find directement sur un objet de plage contenant la plage de cellules à rechercher. Pour le code de l'affiche originale, cela pourrait ressembler à:

Set cell = ActiveSheet.Columns("B:B").Find( _
    What:=celda, _
    After:=ActiveCell _
    LookIn:=xlFormulas, _
    LookAt:=xlWhole, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, _
    MatchCase:=False, _
    SearchFormat:=False _
)

If cell Is Nothing Then
    'do something
Else
    'do something else
End If

Je préférerais utiliser plus de variables (et assurez-vous de les déclarer) et laissez beaucoup d'arguments optionnels utiliser leurs valeurs par défaut:

Dim rng as Range
Dim cell as Range
Dim search as String

Set rng = ActiveSheet.Columns("B:B")
search = "String to Find"
Set cell = rng.Find(What:=search, LookIn:=xlFormulas, LookAt:=xlWhole, MatchCase:=False)

If cell Is Nothing Then
    'do something
Else
    'do something else
End If

J'ai gardé LookIn:=, LookAt::= et MatchCase:= pour être explicite sur ce qui est mis en correspondance. Les autres paramètres facultatifs contrôlent les correspondances d’ordre renvoyées - je ne les spécifierais que si l’ordre est important pour mon application.

3
robartsd