Ich muss einen Wert celda in einer Excel-Tabelle finden. Ich habe diesen VBA-Code verwendet, um ihn zu finden:
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
Das Problem ist, wenn ich den Wert finden muss nur in einer Excel-Spalte. Ich finde es mit dem nächsten Code:
Columns("B:B").Select
Selection.Find(What:="VA22GU1", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Aber ich weiß nicht, wie ich es an den ersten vba-Code anpassen soll, weil ich den Wert nothing
verwenden muss.
Benutz einfach
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
Der Vollständigkeit halber können Sie dieselbe Technik auch für Excel-Tabellen verwenden.
Im folgenden Beispiel suche ich nach einem Text in einer beliebigen Zelle einer Excel-Tabelle mit dem Namen "tblConfig", der sich in dem Blatt "Config" befindet, das normalerweise ausgeblendet ist. Ich akzeptiere die Standardeinstellungen der Find-Methode.
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
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
Ich würde es vorziehen, die .Find
Methode direkt auf ein Bereichsobjekt, das den Bereich der zu durchsuchenden Zellen enthält. Für den Code des ursprünglichen Posters könnte dies so aussehen:
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
Ich würde es vorziehen, mehr Variablen zu verwenden (und sie unbedingt zu deklarieren) und viele optionale Argumente ihre Standardwerte verwenden zu lassen:
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
Ich behielt LookIn:=
, LookAt::=
, und MatchCase:=
explizit angeben, was abgeglichen wird. Die anderen optionalen Parameter steuern, in welcher Reihenfolge Übereinstimmungen zurückgegeben werden. Ich würde diese nur angeben, wenn die Reihenfolge für meine Anwendung wichtig ist.