マクロ内の非常に大きな文字列の検索(Microsoft Excel)
彼のマクロでは、イアンは非常に大きな文字列内で短い文字列を見つける必要があります。大きな文字列は基本的にファイル全体のテキストであり、180,000文字を超えることもあります。 Search()もFind()もありません
彼が大きな文字列を小さな部分(たとえば、32,000文字未満)に切り刻み、各部分を順番に検索しない限り、機能します。この解剖の問題は、イアンがファイル内のどこにターゲットテキストがあるのか、あるいはそこにあるのかさえわからないことです。また、ターゲットテキストを切り刻んで、見つけることができない可能性があります。
VBAで別の文字列内のある文字列のインスタンスを検索する一般的な方法は3つあります。
検索メソッド検索メソッド* InStr関数
最初の2つのアプローチは、イアンが具体的に言及しているアプローチであるため、彼はこれらの使用方法を知っています。これらは実際にはメソッドであり、WorksheetFunctionオブジェクトで使用されます。これらは基本的に、VBA内からFINDおよびSEARCHワークシート関数にアクセスするために使用されます。
大きな文字列で情報を見つけるのに最適ではありません。
そのためには、VBAにネイティブな関数であるInStr関数を使用する必要があります。
これは、大きな文字列がテキストファイルから取得されていて、実際にはブック内に存在しない場合に特に当てはまります。
特定のテキスト値を検索する大きなテキストファイルがあるとします。次の方法で、ファイル全体を一度にメモリに読み込むことができます。
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を搭載しているシステムはほとんどありません。もちろん、あなたが読んでいるほとんどのテキストファイルもそのファイルサイズに近づいていません。実際のデータファイルを使用してテストすると、このファイル全体を読み取るアプローチが機能するかどうかがわかります。
ほとんどの場合と同様に、テキストの個々の行を含むテキストファイルがある場合は、ファイルを処理してテキストを探すためのより効率的な方法があります。 (個々の回線は、キャリッジリターンまたはラインフィード、あるいはその両方で終了する回線です。)
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
このアプローチでは、一度に1行だけがメモリに読み込まれて処理されるため、テキストファイルの長さについて実際に心配する必要はありません。
InStrは、驚くほど大きなソース文字列で情報を検索する場合に役立つ方法です。
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(13660)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice365のExcelに適用されます。