본문 바로가기
VBA/VBA + 아래아한글 자동화

[한글자동화] 엑셀 문단을 한글표에 정리하기

by 일등미노왕국 2023. 9. 7.

오늘 해볼것은 엑셀의 문장들을 한글에서 문단 제목과 문장을 일정한 표에 담는 자동화를 해보려고 한다.

 

아직은 한글자동화라 보기보다는 엑셀 값들을 한글에 찍는 수준인데, 본인도 이번 기회에 한글매크로에 대해서 정리하고 있으니, 한글의 미주나 각주 또는 누름틀을 이용한 한글 고유의 매크로를 여러 방법으로 구현하여 이글을 읽는, 또는 어떤 필요에 의해서 본인의 글을 찾아보는 이들에게 더 큰 만족과 기쁨을 주려고 한다.

 

 

자 이런 글이 있을 때 우리 생각해야 한다. 

1. 전체 영역을 어떻게 잡을 건지

2. 전체 영역을 순환하면서 어떻게 엑셀의 내용을 한글로 가져올 것인지

3. 예외 처리에 대해서 어떻게 처리할 것인지

 

 

1번 전체 영역을 본인은

Set rngAll = Range([b1], Cells(rows.Count, "b").End(3))

[b1]에서 시작해서 B열의 마지막 행까지의 영역을 전체영역으로 설정하였다.

 

2번은 전체 영역을 순환하면서

For Each rngA In rngAll                    
    
   hwp.WriteText rngA.Value
        
Next rngA

hwp.WriteText 하위프로시저는

Sub WriteText(text As String, Optional numEnter As Integer = 0)
    '텍스트 쓰기
    R = HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.text = text
    R = HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
    
    '엔터 입력
    Dim i As Integer
    For i = 1 To numEnter
        Enter
    Next
End Sub

이렇게 되어 있으니... numEnter는 줄바꿈 옵션값이니 적절하게 사용하길 바란다.

 

3번 예외처리에 대해서 한번 고민해보자

문단의 소제목들은 항상 먼저 나올것이다. 그럼 소제목인지 어떻게 구분할 수 있을까 1. / 2. 이런패턴이 소제목일 것이니

 

If InStr(left(rngA, 2), ".") > 0 Then   '= 문단 제목인지 판단

엑셀을 순환하면서 왼쪽에서 2자리를 뽑아서 [.] 게 포함되어 있으면 제목으로 판단하기로 하였습니다. 허나 이건 약식으로 한자리수 일때는 문제가 없으나, 두자리수 부터는 문제가 발생하게 된다. 좀 더 범용적으로 사용하기 위해서는 정규식을 사용하거나 mid함수 + like 함수를 사용해야 하는데 여기서는 그냥 넘어가도록 하겠다.

 

또한 젤 처음 소제목과 그 이후에 나오는 소제목 사이에는 문장들을 모두 표에 담겨 나오기 때문에 소제목의 처음과 아님을 구분할 수 있는 스위치 같은 녀석이 필요한데, 본인이 늘 사용하던 boolean으로 이를 해결하였다.

If bln = False Then                 '= 문단 제목이 처음이면

참고로 불린을 토글처럼 사용하려면 bln = not bln 으로 하게 되면 True면 False가 되고, False면 True가 되니 참고 바란다.

 

엑셀의 글을 보면 셀과 셀사이에 공백들이 있으니 공백이 아닌 셀에 유의미한 글이 있을 때만 한글에 찍히면 되기에 

ElseIf rngA <> "" Then                  '= 문단의 내용이 있다면
        
    If bln = False Then
       hwp.addTable 1, 1, 9             '= 1 X 1 표를 생성 / 높이는 9
       hwp.setFont "함초롬돋움", 11
       bln = True
    End If
    hwp.WriteText "  " & rngA.Value, 3     '= 최초에 두칸을 들여쓰기 하고 문장을 추가 / 3줄 아래로


End If

이런식으로 조건식으로 예외처리를 해주면 된다.

 

장황하게 늘어났지만 정리하면

셀을 순환하면서 글이 있을 때만 한글에 출력을 하게 될거야...근데 소제목과 소제목사이의 내용을 모두 표에 담아 놓을테니  소제목과 표 사이의 예외 처리를 부탁해..뭐 이런 코드이다.

 

내 말 몽말인지 알지~~

 

더보기
Option Explicit
Sub Dinamic_Table_Height()

    Dim rngAll As Range
    Dim rngA As Range
    Dim numT&
    Dim bln As Boolean
    
    Set rngAll = Range([b1], Cells(rows.Count, "b").End(3))

    numT = rngAll.Cells.Count
    
    hwp.NewDocument                             '= 새로운 한글문서 생성
        
    For Each rngA In rngAll                     '= 엑셀에서 데이터가 있는 곳을 순환
    
        If InStr(left(rngA, 2), ".") > 0 Then   '= 문단 제목인지 판단
                    
            If bln = False Then                 '= 문단 제목이 처음이면
               hwp.setFont , 16, True           '= 제목 세팅
               hwp.WriteText rngA.Value
            Else                                '= 문단 제목이 처음이 아니라면
               hwp.BackSpace 2                  '= 줄바꿈 2번은 지우고
               hwp.select_F3                    '= 전체를 선택한후
               hwp.breaknonlatinword            '= 자간을 맞추고
               hwp.tableExit                    '= 표를 탈출해서
               hwp.MoveDocEnd                   '= 문서의 끝으로 가라
               hwp.Enter                        '= 줄바꿈하고
               hwp.setFont , 16, True           '= 제목세팅
               hwp.WriteText rngA.Value
               bln = False
            
            End If
            
        ElseIf rngA <> "" Then                  '= 문단의 내용이 있다면
        
            If bln = False Then
               hwp.addTable 1, 1, 9             '= 1 X 1 표를 생성 / 높이는 9
               hwp.setFont "함초롬돋움", 11
               bln = True
            End If
            hwp.WriteText "  " & rngA.Value, 2     '= 최초에 두칸을 들여쓰기 하고 문장을 추가 / 2줄 아래로
            
        End If
        
    Next rngA
       
    hwp.BackSpace 2                             '= 마지막 표에서 2줄을 삭제
    hwp.select_F3
    hwp.breaknonlatinword                       '= 자간 정리하기
    hwp.tableExit
    
    
End Sub

능동적표높이.xlsm
0.08MB

댓글