在宏中搜索非常大的字符串(Microsoft Excel)
在他的宏中,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。