EXCEL - VBA

소재지, 특지구분, 본번, 부번 합치기(2) - VBA

별동산 2024. 5. 23. 08:05
반응형

1. 문제

 

소재지와 특지구분, 본번, 부번이 나뉘어져 있을 경우에 이를 합치는 것을 VBA로 해결해보겠습니다.

지번주소 결합 완성(2).xlsx
0.01MB

 

 

두 가지 경우가 있는데, 

첫번째는 특지구분에 산과 빈칸이 있고, 부번이 숫자와 빈칸인 경우이고,

 

두번째는 특지구분에 산과 일반이 있고, 부번이 0과 양수로 구성된 경우입니다.

 

2. 특지 구분에 일반이 없는 경우

 

개발도구 - Visual Basic을 눌러 VBA 편집기를 엽니다.

만약 개발도구 탭이 안보인다면 파일 - 옵션 - 리본 사용자 지정에서 개발 도구 왼쪽의 체크 박스에 체크하면 됩니다.

 

왼쪽 위 프로젝트 창에서 '지번주소 결합 완성(2).xlsx)를 선택하고, 

 

삽입 - 모듈을 눌러

 

모듈을 추가합니다.

엑셀 파일 아래에 모듈과 Module1이 추가되고, 오른쪽에는 빈 코드 창이 열립니다.

 

가. 해결책 1

(1) 코드

아래와 같이 코드를 작성하고,

Sub 주소결합()

    Dim i As Integer, endRow As Integer
    
    endRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = 2 To endRow
        Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i) & _
            IIf(Range("D" & i) > 0, "-" & Range("D" & i), "")
    Next
    
End Sub

 

오른쪽 세모 모양의 실행 아이콘을 클릭한 후 왼쪽 엑셀 아이콘을 눌러 엑셀로 돌아가면

 

수식이 없이 결과값만 보입니다.

 

(2) 코드 설명

 

Dim i As Integer, endRow As Integer

i와 endRow 라는 변수를 정수 형식으로 선언하는 것입니다.

 

endRow = Cells(Rows.Count, "A").End(xlUp).Row

endRow 깂을
Cells(Rows.Count, "A") 다시 말해 A열의 맨 아래 줄 셀에서
End(xlUp) 맨 위로 올라오는데, 문자나 숫자가 있는 행에서 셀 포인터가 멈춥니다.
Row 멈춘 셀의 행 번호를 대입합니다.

결괏값은 위 파일의 경우 9가 됩니다.

 

For i = 2 To endRow
    Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i) & _
    IIf(Range("D" & i) > 0, "-" & Range("D" & i), "")
Next

For ~ Next는 반복문이며,
i값이 2부터 endRow까지 1씩 증가하면서 반복합니다.

Range("E" & i), 다시 말해 E열 i행, Ei셀에 들어갈 값을 구하는데,

Range("A" & i) & " " & Range("B" & i) & Range("C" & i) & 
A셀과 공백 한칸, 그리고 B와 C셀을 결합한 다음

IIf(Range("D" & i) > 0, "-" & Range("D" & i), "")
여기서 iif 함수는 엑셀의 if함수와 같은 것인데, 구분하기 위해 if 앞에 i를 붙인 것입니다.
D셀 값이 0보다 클 경우는 하이픈과 D셀값을 결합하고, 아니면 빈 칸을 결합하므로 결합하지 않는 것과 같습니다. 

 

 

나. 해결책 2

iif 함수를 이용하지 않고,

If ~ Then ~ Else 문을 이용할 수도 있습니다.

 

가. 구문

구문은 아래와 같습니다.

If 조건 Then 
    실행문
[ ElseIf 조건2  Then 
    실행문2 ]
[ Else
    실행문3 ]
End If


대괄호([ ]) 사이에 있는 것은 옵션이므로 반드시 있어야 하는 것은 아닙니다.

 

나. 코드

Sub 주소결합2()

    Dim i As Integer, endRow As Integer
    
    endRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = 2 To endRow
        If Range("D" & i) > 0 Then
            Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i) & _
            "-" & Range("D" & i)
        Else
            Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i)
        End If
    Next
    
End Sub

 

① If Range("D" & i) > 0 Then : Di셀 값이 0보다 크다면 

 

② Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i) & _
            "-" & Range("D" & i) : Ei셀 값을 Ai셀값에 공백 한 칸과 Bi와 Ci셀 값 그리고, 하이픈과 Di셀 값을 결합해서 표시합니다.

 

③ Else : Di셀 값이 0이하라면, 다시 말해 0이거나 빈칸이라면

 

④ Range("E" & i) = Range("A" & i) & " " & Range("B" & i) & Range("C" & i) : : Ei셀 값을 Ai셀값에 공백 한 칸과 Bi와 Ci셀 값으로 하는 것입니다.

 

⑤ End If : If문을 닫는 것입니다.

 

다. 코드 실행

Sub 프로시저가 2개이므로

주소결합2 Sub 프로시저안에 커서를 놓고 실행한 후

엑셀로 돌아가 확인해보면

같은 결과가 나옵니다.

 

3. 특지 구분에 일반이 있는 경우

가. 해결책 3

해결책 2를 기본으로 하되,

산이 아닌 일반인 경우는 Bi셀 값을 연결하면 안되므로 이에 대한 if문을 추가해야 합니다.

 

코드는 아래와 같습니다.

Sub 주소결합3()

    Dim i As Integer, endRow As Integer
    
    endRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = 2 To endRow
        If Range("i" & i) = "산" Then
            If Range("K" & i) > 0 Then
                Range("L" & i) = Range("H" & i) & " " & Range("i" & i) & Range("J" & i) & _
                "-" & Range("K" & i)
            Else
                Range("L" & i) = Range("H" & i) & " " & Range("i" & i) & Range("J" & i)
            End If
        Else
            If Range("K" & i) > 0 Then
                Range("L" & i) = Range("H" & i) & " " & Range("J" & i) & _
                "-" & Range("K" & i)
            Else
                Range("L" & i) = Range("H" & i) & " " & Range("J" & i)
            End If
        End If
        
    Next
        
End Sub

 

If Range("i" & i) = "산" Then과 Else 아래 부분을 추가하고, 열이 A부터가 아니라 H열부터이므로 이에 맞게 열 이름을 변경했습니다.

 

If Range("i" & i) = "산" Then : i열 i행의 값이 "산"이라면

Else : i열 i행의 값이 "산"이 아니라면

 

If Range("i" & i) = "산" Then안의 if ~ then ~ else 문은 해결책2와 같고,

Else 문의 아래 코드만 특지구분("일반")인 i열 i행의 값을 결합하지 않도록 했습니다.

 

다. 코드 실행

Sub 프로시저가 3개이므로

주소결합3 Sub 프로시저안에 커서를 놓고 실행한 후

엑셀로 돌아가 확인해보면

일반인 경우는 일반을 빼고 결합됐고, 산인 경우만 "산"을 결합해서 표시하고 있고,

부번도 0보다 큰 경우만 하이픈과 연결해 부번을 표시하고 있습니다.

 

라. 부번 등 데이터를 변경하는 경우

아래와 같이 K9셀의 값을 0에서 1로 바꿔도 함수를 이용한 수식과는 달리 L9셀의 값이 자동으로 바뀌지 않습니다.

 

따라서, 해당 매크로를 실행해야 합니다.

 

개발도구 - 매크로를 누른 후

매크로 목록에서 주소결합3을 클릭하고,

오른쪽 실행 버튼을 클릭하면

 

L9셀의 주소가 산64에서 산64-1로 바뀝니다.

 

4. 파일 형식 변경

매크로가 포함된 경우 xlsx로 저장하면 작성된 매크로가 저장되지 않으므로

xlsm(매크로 사용 통합 문서) 형식으로 저정해야 합니다.

 

파일 - 다른 이름으로 저장을 누른 다음

파일 형식 오른쪽을 눌러 파일 형식 목록을 표시한 후 

Excel 매크로 사용 통합 문서(*.xlsm)을 클릭하고,

저장 버튼을 누릅니다.

 

확장자가 xlsm으로 바뀌었습니다.

 

지번주소 결합 완성(2).xlsm
0.02MB

반응형