Búsqueda de cadenas muy grandes en una macro (Microsoft Excel)
En su macro, Ian necesita ubicar una cadena corta dentro de una cadena muy grande. La cadena grande es esencialmente el texto de un archivo completo, a veces más de 180.000 caracteres. Ni Buscar () ni Buscar ()
funciona, a menos que corte la cadena grande en partes más pequeñas (por ejemplo, menos de 32,000 caracteres) y busque cada parte por turno. El problema con esta disección es que Ian no sabe en qué parte del archivo puede estar su texto de destino, o incluso si está allí, y es muy posible que pueda cortar su texto de destino y nunca pueda encontrarlo.
Hay tres formas generales en las que puede buscar la instancia de una cadena dentro de otra en VBA:
Método de búsqueda Método de búsqueda * Función InStr
Los dos primeros enfoques son los que Ian menciona específicamente, por lo que sabe cómo usarlos. En realidad, son métodos que se utilizan con el objeto WorksheetFunction. Básicamente se utilizan para acceder a las funciones de la hoja de trabajo BUSCAR y BUSCAR desde VBA.
No son los mejores para encontrar información en una cadena grande y grande.
Para eso, debe usar la función InStr, una función nativa de VBA.
Esto es particularmente cierto si su cadena grande se extrae de un archivo de texto y no reside realmente dentro de un libro de trabajo.
Supongamos que tiene un archivo de texto grande en el que desea buscar un valor de texto en particular. Puede leer todo el archivo en la memoria a la vez de esta manera:
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 abre el archivo de texto especificado, rellena todo el contenido del archivo en la cadena sFullFile y muestra todas las instancias de la variable sFindText dentro de ese texto. Tenga en cuenta que el contenido del archivo se convierte a minúsculas. Esto es necesario porque la función InStr distingue entre mayúsculas y minúsculas. Si desea que su búsqueda distinga entre mayúsculas y minúsculas, no es necesario que realice la conversión.
La única limitación efectiva en un código como este es la cantidad de memoria que tiene en su sistema. VBA tiene una limitación de longitud de cadena efectiva de más de 2 mil millones de caracteres, pero pocos sistemas tienen tanta RAM. Por supuesto, la mayoría de los archivos de texto que estaría leyendo tampoco se acercan a ese tamaño de archivo. Las pruebas con sus archivos de datos reales le permitirán saber si este enfoque de leer el archivo completo funcionará para usted.
Si tiene un archivo de texto que tiene líneas individuales de texto, como la mayoría, existe una forma más eficiente de procesar el archivo y buscar su texto. (Las líneas individuales son aquellas que terminan con un retorno de carro y / o un salto de línea.)
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 este enfoque, no tiene que preocuparse realmente por la longitud del archivo de texto, ya que solo se lee y procesa una línea a la vez en la memoria.
Estoy seguro de que entiende la idea: InStr es el camino a seguir cuando desea trabajar para encontrar información en cadenas de origen increíblemente grandes.
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.
link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
ExcelTips es su fuente de formación rentable en Microsoft Excel.
Este consejo (13660) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365.