2편까지는 2줄만 비교했는데, 여러 줄의 문장을 반복적으로 비교하는 것을 구현해 보겠습니다.
다시 말해 한 문장을 다른 문장들을 돌아가면서 2줄씩 비교해서 같은 단어가 있으면 빨간색으로 표시하는 것입니다.
1. 기존 매크로와 달라진 점
기존에는 A1셀과 A2셀만을 비교했는데,
변경된 것은 행을 이동하면서 2줄씩 비교합니다.
달라진 점은 아래와 같습니다.
기존 매크로 | 변경 매크로 |
Sub compare_setence() (변수 선언 1) 문장을 공백 한 칸 기준으로 분리해서 배열에 넣은 후 반복하기 위한 counter만 선언 i As Integer, j As Integer |
Sub compare_setence() (변수 선언 1) 줄 별로 비교하기 위해 줄 별 이동을 위한 counter 추가 K As Integer, L As Integer (변수 선언 2) A열의 맨 아래줄까지 실행하기 위해 End_Row 변수 선언 및 값 추가 Dim End_Row As Integer End_Row = Range("a1").End(xlDown).Row |
' A1셀과 A2셀을 공백 기준 분리 후 testArray1, testArray2 배열에 저장 testArray1 = Split(Range("a1")) testArray2 = Split(Range("a2")) ' testArray1 배열을 하나씩 이동하면서 처리 For i = 0 To len1 ' testArray2 배열을 하나씩 이동하면서 처리 For j = 0 To len2 Next Next |
'첫번째 줄 For K = 1 To End_Row - 1 '두번째 줄 For L = K + 1 To End_Row ' A열 K행과 L행을 공백 기준 분리 후 testArray1, testArray2 배열에 저장 testArray1 = Split(Range("a" & K)) testArray2 = Split(Range("a" & L)) ' testArray1 배열을 하나씩 이동하면서 처리 For i = 0 To len1 ' testArray2 배열을 하나씩 이동하면서 처리 For j = 0 To len2 Next Next Next Next |
Sub font_black() 'A1셀과 A2셀의 글자 색을 자동으로 지정 Range("A1:A2").Font.ColorIndex = xlAutomatic End Sub |
Sub font_black() 'A1셀부터 맨 아래줄까지 글자 색을 자동으로 지정 Range(Range("A1"), Range("a1").End(xlDown)).Font.ColorIndex = xlAutomatic End Sub |
2. 코드
Option Explicit
Sub compare_setence()
'A1과 A2셀의 문장을 공백으로 구분한 문자를 저장하기 위한 배열
Dim testArray1() As String, testArray2() As String
'len1, len2는 배열의 크기를 저장,
Dim len1 As Integer, len2 As Integer
'i, j는 배열 이동을 위한 counter, K, L은 줄 이동을 위한 counter
Dim i As Integer, j As Integer, K As Integer, L As Integer
' 화면 갱신하지 않음
Application.ScreenUpdating = False
Dim End_Row As Integer
End_Row = Range("a1").End(xlDown).Row
'첫번째 줄
For K = 1 To End_Row - 1
'두번째 줄
For L = K + 1 To End_Row
' A열의 k행과 L행을 공백을 기준으로 구분해서 testArray1, testArray2 배열에 저장
testArray1 = Split(Range("a" & K))
testArray2 = Split(Range("a" & L))
' testArray1, testArray2의 요소의 최대 인덱스 값을 len1, len2에 저장
len1 = UBound(testArray1)
len2 = UBound(testArray2)
' testArray1 배열을 하나씩 이동하면서 처리
For i = 0 To len1
' testArray2 배열을 하나씩 이동하면서 처리
For j = 0 To len2
' instr(시작위치, 범위, 찾을 값)
' testArray1 자체에서 공백을 제거했더니 위치 판단이 잘못돼서
' testArray1(i)와 testArray2(j)가 공백이 아닐 경우에만 처리하는 것으로 변경
If testArray1(i) <> "" And testArray2(j) <> "" Then
' testArray1(i)가 testArray2(j)에 포함되는지 또는
' testArray2(j)가 testArray1(i)에 포함되는지 판단
If InStr(testArray2(j), testArray1(i)) > 0 Or _
InStr(testArray1(i), testArray2(j)) > 0 Then
' testArray1의 i번째 글자와 testArray2의 j번째 글자를 빨간색으로 칠함
font_red testArray1, i, Range("a" & K)
font_red testArray2, j, Range("a" & L)
End If
End If
Next
Next
Next
Next
' 화면 갱신하는 것으로 복구
Application.ScreenUpdating = True
End Sub
Function location_array_num(Array_Name, i) As Integer
Dim c As Variant
Dim num As Integer
num = -1
For Each c In Array_Name
' Array_Num배열의 i번째 인덱스에 해당하는 글자의 끝 위치를 구함
location_array_num = location_array_num + Len(c) + 1
num = num + 1
If num = i Then
Exit For
End If
Next
End Function
Sub font_red(Array_Name, num, Range_A)
Dim a1_start_address As Integer, a1_end_address As Integer
' testArray1 또는 testArray2 배열의 num - 1번째 글자의 시작 위치를 구함
If num > 0 Then
a1_start_address = location_array_num(Array_Name, num - 1)
Else
a1_start_address = 1
End If
' testArray1 또는 testArray2 배열의 num번째 글자의 끝 위치를 구함
a1_end_address = location_array_num(Array_Name, num)
' Array_Name 배열의 i번째 글자의 색을 빨간색으로 칠함
Range_A.Characters(Start:=a1_start_address, Length:=a1_end_address - a1_start_address).Font.Color = vbRed
End Sub
Sub font_black()
Range(Range("A1"), Range("a1").End(xlDown)).Font.ColorIndex = xlAutomatic
End Sub
3. 디버깅
가. 조사식 추가
2편에서 조사식 창에 testArray1을 넣었더니 지역 창에서 표시하고 있어 중복이 됐는데,
이번에는 Range("a" & K).address와 Range("a" & L).address를 조사식 창에 추가해 보겠습니다.
조사식 창에서 마우스 오른쪽 버튼을 누른
식 입력 란에 Range("a" & K).address라고 입력하고 확인 버튼을 누르고,
Range("a" & L).address도 조사식 추가 메뉴를 눌러 추가합니다.
나. 중단점 설정 후 실행
Range("a" & K)와 Range("a" & L) 아래 len1이 있는 곳 왼쪽 기둥을 클릭해서 중단점을 설정한 다음
실행(▶)(F5) 아이콘을 누르면 len1줄이 노란색으로 표시되면서 실행을 멈추는데,
중간 부분의 조사식 창을 보면 Range("a" & K).address가 $A$1이라고 표시되고,
Range("a" & L).address는 $A$2이라고 표시됩니다.
아래 지역 창에는 프로시저 안에서 Dim으로 선언한 변수 목록만이 있어서 K 변수는 있는데, Range("a" & K).address 변수는 없습니다.
물론 K를 통해 1행을 실행 중이라는 것을 알 수 있지만 Range("a" & K).address라고 하면 확실하게 A1셀을 처리하고 있다는 것을 알 수 있습니다.
다시 실행(▶)(F5) 아이콘을 누르면 len1줄에 멈추면서 처리 중인 셀이 A1, A3셀이라고 알려줍니다.
이런 식으로 A1과 A2 → A1과 A3 → A1과 A4 → A2와 A3 → A2와 A4 → A3과 A4셀 순으로 반복 처리됩니다.
4. 실행 결과
중단점을 클릭해서 지운 다운 다시 실행을 하면 중단하지 않고 실행이 완료됩니다.
표준 도구 모음의 '보기 Microsoft Excel' 아이콘을 눌러서
엑셀로 돌아가면 4행까지 같은 단어에 빨간색이 표시된 것을 알 수 있습니다.
'EXCEL - VBA' 카테고리의 다른 글
엑셀 VBA : 모든 테두리를 실선으로 (0) | 2023.06.05 |
---|---|
두 문장의 같은 단어 비교(4) - 어미, 조사 등 제거 도전 (0) | 2023.05.11 |
두 문장의 같은 단어 비교(2) - 매크로 실행, 디버그 (0) | 2023.05.09 |
두 문장의 같은 단어 비교(1) - 매크로 작성 (3) | 2023.05.08 |
DateAdd함수 - 지정된 기간만큼 떨어진 날짜를 반환(2) - 값 자동 변경 (0) | 2023.04.19 |