在他的宏中,Ian需要在很大的字符串中找到一个短字符串。大字符串本质上是整个文件的文本,有时超过180,000个字符。 Search()和Find()都不

起作用,除非他将大字符串切成较小的部分(例如,少于32,000个字符),然后依次搜索每个部分。这种解剖的问题在于,伊恩不知道目标文本可能在文件中的位置,甚至不知道目标文件是否在其中,而且他很可能会砍断目标文本而永远找不到。

您可以通过三种通用方法在VBA中搜索另一个字符串中的一个字符串的实例:

查找方法搜索方法* InStr函数

前两种方法是Ian特别提到的方法,因此他知道如何使用这些方法。它们实际上是与WorksheetFunction对象一起使用的方法。它们本质上用于从VBA内部访问FIND和SEARCH工作表功能。

它们并不是以大而大的字符串查找信息的最佳选择。

为此,您应该使用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的有效字符串长度限制超过20亿个字符,但是很少有系统具有如此多的RAM。当然,您将要读取的大多数文本文件也不会达到该文件大小。测试您的实际数据文件将使您知道此“读取n完整文件”方法是否适合您。

如果您像大多数情况一样,在其中包含单个文本行的文本文件,则可以使用一种更有效的方式来处理文件并查找文本。 (单独的行是那些以回车和/或换行结束的行。)

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_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(13660)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。