그의 매크로에서 Ian은 매우 큰 문자열 내에서 짧은 문자열을 찾아야합니다. 큰 문자열은 기본적으로 전체 파일의 텍스트이며 때로는 180,000 자 이상입니다. Search ()도 Find ()도

큰 줄을 작은 부분 (예 : 32,000 자 미만)으로 자르고 각 부분을 차례로 검색하지 않는 한 작동합니다. 이 해부에서 문제는 Ian이 파일 내에서 대상 텍스트가 어디에 있는지 또는 그 안에 있는지조차 알지 못하며, 대상 텍스트를 잘라내어 찾을 수 없을 가능성이 높다는 것입니다.

VBA에서 다른 문자열 내에서 한 문자열의 인스턴스를 검색 할 수있는 세 가지 일반적인 방법이 있습니다.

찾기 방법 검색 방법 * InStr 함수

처음 두 가지 접근 방식은 Ian이 구체적으로 언급 한 접근 방식이므로 사용 방법을 알고 있습니다. 실제로는 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

이 접근 방식을 사용하면 한 번에 한 줄만 메모리로 읽고 처리되므로 텍스트 파일의 길이에 대해 실제로 걱정할 필요가 없습니다.

나는 당신이 아이디어를 얻었을 것이라고 확신합니다. InStr은 놀랍도록 큰 소스 문자열에서 정보를 찾는 작업을 할 때 사용할 수있는 방법입니다.

_ 참고 : _

이 페이지 (또는 ExcelTips 사이트의 다른 페이지)에 설명 된 매크로를 사용하는 방법을 알고 싶다면 유용한 정보가 포함 된 특별 페이지를 준비했습니다.

link : / excelribbon-ExcelTipsMacros [새 브라우저 탭에서 특별 페이지를 열려면 여기를 클릭하세요].

_ExcelTips_는 비용 효율적인 Microsoft Excel 교육을위한 소스입니다.

이 팁 (13660)은 Office 365의 Microsoft Excel 2007, 2010, 2013, 2016, 2019 및 Excel에 적용됩니다.