В своем макросе Иену нужно найти короткую строку внутри очень большой строки. Большая строка — это, по сути, текст всего файла, иногда более 180 000 символов. Ни Search (), ни Find ()

работает, если только он не разбивает большую строку на более мелкие части (например, до 32 000 символов) и ищет каждую часть по очереди. Проблема с этим разбиением в том, что Ян не знает, где в файле может находиться его целевой текст, и даже есть ли он там, и вполне возможно, что он может разрезать свой целевой текст и никогда не сможет его найти.

Существует три основных способа поиска экземпляра одной строки внутри другой в VBA:

Метод поиска Метод поиска * Функция InStr

Ян специально упоминает первые два подхода, поэтому он знает, как их использовать. На самом деле это методы, используемые с объектом WorksheetFunction. В основном они используются для доступа к функциям рабочего листа FIND и SEARCH из VBA.

Они не подходят для поиска информации в большой, большой строке.

Для этого вы должны использовать функцию InStr, встроенную в VBA.

Это особенно верно, если ваша большая, большая строка извлекается из текстового файла и фактически не находится в книге.

Допустим, у вас есть большой текстовый файл, в котором вы хотите найти определенное текстовое значение. Вы можете прочитать весь файл в памяти за один раз следующим образом:

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

Макрос открывает указанный текстовый файл, вставляет все содержимое файла в строку sFullFile и отображает все экземпляры переменной sFindText в этом тексте. Обратите внимание, что содержимое файла преобразовано в нижний регистр. Это необходимо, потому что функция InStr чувствительна к регистру. Если вы хотите, чтобы ваш поиск был чувствителен к регистру, вам не нужно выполнять преобразование.

Единственное эффективное ограничение для такого кода — это объем памяти в вашей системе. VBA имеет эффективное ограничение длины строки где-то более 2 миллиардов символов, но немногие системы имеют такой объем оперативной памяти. Конечно, большинство текстовых файлов, которые вы читаете, также не подходят к этому размеру. Тестирование с вашими фактическими файлами данных позволит вам узнать, подойдет ли вам подход «чтение и заполнение файла».

Если у вас есть текстовый файл, в котором есть отдельные строки текста, как в большинстве случаев, то есть более эффективный способ обработки файла и поиска вашего текста. (Отдельные строки заканчиваются либо символом возврата каретки, либо переводом строки.)

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

При таком подходе вам не нужно особо беспокоиться о длине текстового файла, так как только одна строка за раз считывается в память и обрабатывается.

Я уверен, что вы уловили идею: InStr — это то, что вам нужно, когда вы хотите работать с поиском информации в удивительно больших исходных строках.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (13660) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365.