Suchen sehr großer Zeichenfolgen in einem Makro (Microsoft Excel)
In seinem Makro muss Ian eine kurze Zeichenfolge innerhalb einer sehr großen Zeichenfolge suchen. Die große Zeichenfolge ist im Wesentlichen der Text einer gesamten Datei, manchmal mehr als 180.000 Zeichen. Weder Search () noch Find ()
funktioniert, es sei denn, er zerhackt die große Zeichenfolge in kleinere Teile (z. B. unter 32.000 Zeichen) und durchsucht nacheinander jeden Teil. Das Problem bei dieser Dissektion ist, dass Ian nicht weiß, wo in der Datei sein Zieltext liegen könnte oder ob er sich darin befindet, und es ist durchaus möglich, dass er seinen Zieltext zerhackt und ihn nie finden kann.
Es gibt drei allgemeine Möglichkeiten, wie Sie in VBA nach der Instanz einer Zeichenfolge in einer anderen suchen können:
Suchmethode Suchmethode * InStr-Funktion
Die ersten beiden Ansätze sind diejenigen, die Ian ausdrücklich erwähnt, damit er weiß, wie man diese verwendet. Dies sind tatsächlich Methoden, die mit dem WorksheetFunction-Objekt verwendet werden. Sie werden im Wesentlichen verwendet, um über VBA auf die Arbeitsblattfunktionen FIND und SEARCH zuzugreifen.
Sie sind nicht die besten, um Informationen in einer großen, großen Zeichenfolge zu finden.
Dazu sollten Sie die InStr-Funktion verwenden, eine für VBA native Funktion.
Dies gilt insbesondere dann, wenn Ihre große, große Zeichenfolge aus einer Textdatei abgerufen wird und sich nicht in einer Arbeitsmappe befindet.
Angenommen, Sie haben eine große Textdatei, nach der Sie nach einem bestimmten Textwert suchen möchten. Sie können die gesamte Datei auf folgende Weise gleichzeitig in den Speicher einlesen:
Sub CheckFullFile() Dim sFullFile As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 lFileSize = Lof(1) sFullFile = Input(lFileSize, 1) Close 1 sFullFile = LCase(sFullFile) lStart = 0 lLoc = InStr(sFullFile, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sFullFile, sFindText) Wend MsgBox sMsg End Sub
Das Makro öffnet die angegebene Textdatei, fügt den gesamten Dateiinhalt in die Zeichenfolge sFullFile ein und zeigt alle Instanzen der Variablen sFindText in diesem Text an. Beachten Sie, dass der Dateiinhalt in Kleinbuchstaben konvertiert wird. Dies ist erforderlich, da bei der InStr-Funktion zwischen Groß- und Kleinschreibung unterschieden wird. Wenn Sie möchten, dass bei Ihrer Suche zwischen Groß- und Kleinschreibung unterschieden wird, müssen Sie die Konvertierung nicht durchführen.
Die einzige wirksame Einschränkung für Code wie diesen ist die Menge an Speicher, die Sie in Ihrem System haben. VBA hat eine effektive Beschränkung der Zeichenfolgenlänge von mehr als 2 Milliarden Zeichen, aber nur wenige Systeme verfügen über so viel RAM. Natürlich nähern sich die meisten Textdateien, die Sie lesen würden, auch nicht dieser Dateigröße. Wenn Sie mit Ihren tatsächlichen Datendateien testen, erfahren Sie, ob dieser Ansatz zum Lesen der vollständigen Datei für Sie funktioniert.
Wenn Sie wie die meisten eine Textdatei mit einzelnen Textzeilen haben, gibt es eine effizientere Möglichkeit, die Datei zu verarbeiten und nach Ihrem Text zu suchen. (Einzelne Zeilen sind solche, die entweder mit einem Wagenrücklauf und / oder einem Zeilenvorschub abgeschlossen sind.)
Sub CheckEachLine() Dim sRaw As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 Do Until Eof(1) Line Input #1, sRaw sRaw = LCase(sRaw) lStart = 0 lLoc = InStr(sTemp, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sRaw, sFindText) Wend Loop Close 1 MsgBox sMsg End Sub
Bei diesem Ansatz müssen Sie sich nicht wirklich um die Länge der Textdatei kümmern, da jeweils nur eine Zeile in den Speicher eingelesen und verarbeitet wird.
Ich bin mir sicher, dass Sie auf die Idee kommen – InStr ist der richtige Weg, wenn Sie Informationen in erstaunlich großen Quellzeichenfolgen suchen möchten.
_Hinweis: _
Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (13660) gilt für Microsoft Excel 2007, 2010, 2013, 2016, 2019 und Excel in Office 365.