[ 기초 강좌 ]
제 46강
Find매서드에 대하여
Find매서드에 대해 알아봅니다.
이럴 때 필요해요
엄청난 양들의 데이터들중에서 원하는 데이터의 개수를 빨리찾고싶을때 유용하게사용됩니다.
이렇게 사용해요
이번 시간에는 데이터(셀)에 보다 빨리 접근하는 방법에 대해 알아 보도록 하겠습니다.
현실 세계에서 낯선 찾아가려면 지도나 주소가 있어야 하듯이 컴퓨터도 마찬가지입니다.
워크시트의 모든 셀에도 셀 주소가 있듯이 컴퓨터의 메모리에도 주소가 있고 하드디스크에도 수없이 많은
주소가 있습니다.
해서, 컴퓨터는 주소를 찾아 다니다가 시간을 다 보내는 물건이라고 해도 과언이 아닐 듯 합니다. ^^
따라서 데이터를 가공/분석/출력을 하려면 우선, 데이터가 어디에 들어 있는 지를 알아야 그 다음 작업을해도 하겠지요?
즉, 서울에서 광주까지 가는 방법은 수도 없이 많듯이 프로그래밍을 할 때에도 마찬가지입니다.
수만가지의 숫자가 적혀있는 데이터표 사이에서 원하는 숫자 갯수를 세워볼겁니다.
아래의 B31 셀에 10~99 사이의 적당한 숫자(예: 35, 77, 93… 등)를 입력한 다음,
ForEach_Next 버튼과 Find_FindNext 버튼을 각각 눌러, 수행 속도를 비교해 보겠습니다.
현재는 데이터의 량이 그다지 많지 않아 큰 차이를 보이지 않습니다만, 검색할 데이터의 양이 많으면
많을수록 그 격차는 더욱 벌어 집니다.
그럼, 코드를 살펴 보도록 하지요.
먼저, 'ForEach_Next' 버튼에 연결된 코드부터 볼까요?
Sub ForEach_NextAccess()
Dim rngCell As Range, rngSource As Range
Dim i As Integer, intWhatNum As Integer
'''먼저, 필요한 등장 인물(변수)들을 선언합니다.
Set rngSource = [Source]
rngSource.Interior.ColorIndex = xlNone
intWhatNum = [Target]
'''데이터가 들어 있는 부분에 미리 Source라는 이름을 붙여 두었습니다.
'''워크시트에 이름을 정의해 두면 프로그래밍시 접근하기가 훨씬 용이합니다.
'''데이터가 있는 영역, 즉 rngSource 의 배경색을 지운 다음, 변수 intWhatNum 의
'''값이 Target 이라는 이름으로 정의된 셀, 즉 B31 셀에 입력된 값으로 정의합니다.
If intWhatNumber > 99 Or intWhatNumber < 10 Then
MsgBox "유효하지 않은 값입니다!", vbCritical, " //입력 오류"
Exit Sub
End If
''' 변수 intWhatNumber의 값이 10~99 사이의 값만 유효한 것으로 설정합니다.
For Each rngCell In rngSource
If rngCell = intWhatNumber Then
rngCell.Interior.ColorIndex = 38
i = i + 1
End If
'''만약에 Find라는 메서드(방법)가 없었다면, 위와 같이 순환문을 신나게(?) 돌려야만
'''합니다. 그렇기 때문에 수행 속도도 떨어 지게 되는 것이지요.
Next rngCell
[Target].Select
MsgBox "모두 " & i & "개의 셀이 발견되었습니다. ", vbInformation, "// 작업 완료"
End Sub
이 코드를 아래의 ' Find_FindNext' 코드와 비교해 보세요.
Sub Find_FindNextAccess()
Dim rngCell As Range, rngSource As Range
Dim i As Integer, intWhatNum As Integer
Dim strAddress As String
Set rngSource = [Source]
rngSource.Interior.ColorIndex = xlNone
intWhatNum = [Target]
If intWhatNumber > 99 Or intWhatNumber < 10 Then
MsgBox "유효하지 않은 값입니다!", vbCritical, " // 입력 오류"
Exit Sub
End If
'''변수를 선언하고, 사용자로 부터 데이터를 받은 다음, 유효한 지 여부를 판단하는
'''과정은 위의 'ForEach_Next'의 버튼에 연결된 코드와 같습니다.
Set rngCell = rngSource.Find(intWhatNumber)
'''여기서부터 차이가 있습니다. 먼저 Find 메서드를 사용하여 검색 대상 영역 중에서
'''사용자가 입력한 데이터가 있는지를 파악합니다.
If Not rngCell Is Nothing Then
strAddress = rngCell.Address
'''Not rngCell Is Nothing 이라는 것은 해당되는 데이터가 있다는 의미이지요?
'''즉, 사용자로부터 입력받은 데이터와 같은 것이 있을 경우, 아래로 내려가서
'''Do~Loop 문을 수행하게 됩니다.
'''여기서 한 가지 주의할 점!
'''Find 또는 FindNext 메서드는 해당 셀의 값이 아닌 Range 오브젝트를 돌려 준다는
'''사실입니다. 따라서 Range 오브젝트 변수의 값을 strAddress 라는 문자열 변수에
'''담아 두었습니다.
Do
Set rngCell = Columns(1).FindNext(after:=rngCell)
rngCell.Interior.ColorIndex = 4
i = i + 1
'''같은 데이터가 계속 있을 경우, FindNext 메서드를 사용하여 계속 검색을
'''진행 합니다. 언제까지 하느냐 하면, rngCell의 주소가 strAddress의 값과
'''다를 때까지, 그러니까 같은 값이 없을 때 Do~Loop 문을 탈출하게 됩니다.
Loop While rngCell.Address <> strAddress
End If
[Target].Select
MsgBox "모두 " & i & "개의 셀이 발견되었습니다. ", vbInformation, "// 작업 완료"
End Sub
보신 바와 같이, 어떤 도구를 사용하느냐에 따라 많은 차이가 있습니다.
Find 또는 FindNext 라는 훌륭한 도구가 있는데, 그걸 몰라서 오로지 For Each~Next 나
For~Next 하고만 친하게 지내다 보면 그만큼 경쟁력이 떨어 지게 되는 것이지요.
// 많이들 연구해 보시기 바라며, 그럼 오늘도 여기까지!!
2. 다운로드 받은 콘텐츠는 본인(본인회사)만 사용할 수 있습니다.
3. 다른 사람과 공유하거나 원본 또는 수정 후 무단전제,무단배포,무단판매,무단 공유할 수 없습니다.
4. 웹상에서 배포는 상업,비상업적 목적을 불문하고, 손해배상등 가중처벌됩니다.