Nella sua macro, Ian ha bisogno di individuare una breve stringa all’interno di una stringa molto grande. La stringa grande è essenzialmente il testo di un intero file, a volte più di 180.000 caratteri. Né Cerca () né Trova ()

funziona, a meno che non tagli la stringa grande in parti più piccole (ad esempio, meno di 32.000 caratteri) e cerchi ogni parte a turno. Il problema con questa dissezione è che Ian non sa dove all’interno del file potrebbe trovarsi il suo testo di destinazione, o anche se è lì, ed è del tutto possibile che tagli il testo di destinazione e non sia mai in grado di trovarlo.

Ci sono tre modi generali per cercare l’istanza di una stringa all’interno di un’altra in VBA:

Metodo di ricerca Metodo di ricerca * Funzione InStr

I primi due approcci sono quelli menzionati specificamente da Ian, quindi sa come usarli. In realtà sono metodi, utilizzati con l’oggetto WorksheetFunction. Sono essenzialmente utilizzati per accedere alle funzioni del foglio di lavoro TROVA e RICERCA dall’interno di VBA.

Non sono i migliori per trovare informazioni in una stringa grande e grande.

Per questo dovresti usare la funzione InStr, una funzione nativa di VBA.

Ciò è particolarmente vero se la stringa grande e grande viene estratta da un file di testo e non risiede effettivamente in una cartella di lavoro.

Supponiamo che tu abbia un file di testo di grandi dimensioni che desideri cercare un particolare valore di testo. Puoi leggere l’intero file in memoria in una sola volta in questo modo:

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

La macro apre il file di testo specificato, inserisce l’intero contenuto del file nella stringa sFullFile e visualizza tutte le istanze della variabile sFindText all’interno di quel testo. Notare che il contenuto del file viene convertito in minuscolo. Ciò è necessario perché la funzione InStr distingue tra maiuscole e minuscole. Se desideri che la tua ricerca faccia distinzione tra maiuscole e minuscole, non è necessario eseguire la conversione.

L’unica limitazione effettiva su un codice come questo è la quantità di memoria che hai nel tuo sistema. VBA ha una limitazione effettiva della lunghezza delle stringhe di oltre 2 miliardi di caratteri, ma pochi sistemi hanno così tanta RAM. Ovviamente, la maggior parte dei file di testo che leggeresti non si avvicina nemmeno a quella dimensione. Il test con i tuoi file di dati effettivi ti consentirà di sapere se questo approccio di lettura completa del file funzionerà per te.

Se si dispone di un file di testo contenente singole righe di testo, come la maggior parte delle volte, esiste un modo più efficiente per elaborare il file e cercare il testo. (Le singole righe sono quelle che terminano con un ritorno a capo e / o un avanzamento riga.)

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

Con questo approccio, non devi preoccuparti veramente della lunghezza del file di testo poiché solo una singola riga alla volta viene letta in memoria ed elaborata.

Sono sicuro che hai capito: InStr è la strada da percorrere quando vuoi lavorare con la ricerca di informazioni in stringhe sorgente incredibilmente grandi.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (13660) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 e Excel in Office 365.