프로젝트 follow

엑셀에서 워드로 (Excel to Word) VBA - follow(7)

알 수 없는 사용자 2019. 7. 29. 13:03
반응형

이번 게시물은 번외 게시물이라 할 수 있다.

사실 프로젝트 follow는 마무리 되었다. 웹 상에서 출석체크도 할 수 있게 되었고, 이에 따라 특정 칸에 개인의 출석현황과 조원 들의 출석 명수가 기록된다. 또한 기도제목을 작성하면 엑셀 파일에 해당 인원의 기도제목 또한 문자열 값으로 들어간다. 이것만으로도 하나의 엑셀파일에 개인의 출석률과 기도제목을 다 담을 수 있는 결과가 나온다. 끝이다.

 

하지만 마지막으로 남은 것이 있다. 바로 엑셀로 저장된  기도제목(pray)을 사람이 보기 편한 형식으로 옮기는 것이다. 해당 프로젝트의 목적은 사람이 하는 일을 줄이는 것이었다. 매번 출석을 일일히 종이에서 엑셀로 옮겨적는 것을 없애고 싶었고, 매달 적어낸 기도제목을 일일히 타이핑하여 문서화 시키는 것을 없애고 싶었다.

 

이러한 목적에 맞추어 엑셀파일에서 특정 셀들의 값들을 빼와 word파일로 원하는 형태의 포맷으로 바꾸는 VBA코드를 작성하였다.

 

파일 자체를 올려 누구든지 코드를 따갈수 있도록 하고 싶은데, 파일에 개인정보가 너무 많아 그러지 못하는 점이 아쉽다... 정말 많은 구글링과 시도 끝에 나온 결과물 이기 때문에 이 글을 찾은 사람도 그와 같은 과정을 하고 있다고 생각한다. 해당 코드를 사용하기 위해서는 속성에서 몇가지 체크박스들을 체크하는 등의 선행작업이 있었다. 아마 엑셀에서 word 언어를 사용하기 위한 일정의 라이브러리 추가같은 개념이었던 것 같다. 아쉽게도 너무나 오래되어 기억나지 않는다.. 구글링하면 나오겠지만 귀찮달까...ㅎㅎ 이 글을 찾은 시점에서 이미 그런 정보들은 다른 곳에서 얻었을 것이라 생각한다. 그저 코드를 올리고 해석하는 것으로 해당 글은 끝내도록 하겠다. 참고용도로 사용하길..

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Sub ToWord()
 
    Dim wrdApp As Word.Application
 
    Dim wrdDoc As Word.Document
 
    Dim k As Long
``//시트의 행의 크기를 저장할 변수
    Dim name As String
``//이름을 저장할 변수
    Dim sex As String
``//성별
    Dim grade As String
``//학년
    Dim pray As String
``//기도제목 내용(없으면 null)
    Dim job As String
``//맡고있는 역활(없으면 null)
    
 
 
 
    k = ThisWorkbook.Sheets("attendance").Range("B1", ThisWorkbook.Sheets("attendance").Range("B1").End(xlDown)).Rows.Count
``//k값에 행의 크기(길이)를 저장
 
 
    Set wrdApp = CreateObject("Word.Application")
 
    wrdApp.Visible = True
 
    Set wrdDoc = wrdApp.Documents.Open(ThisWorkbook.Path & "\기도편지.docx")
 
    With wrdDoc
``//워드파일에 쓰기 시작
    
 
    For i = 2 To k
 
        If IsEmpty(Worksheets("attendance").Range("F" & i)) = False Then
 
            name = ""
 
            sex = ""
 
            grade = ""
 
            pray = ""
 
            job = ""
 
            If IsEmpty(Worksheets("attendance").Range("A" & i)) = False Then
 
                job = job & Worksheets("attendance").Range("A" & i)
 
            End If
 
            name = name & Worksheets("attendance").Range("E" & i).Value
 
            sex = " " & sex & Worksheets("attendance").Range("C" & i).Value
 
            grade = grade & Worksheets("attendance").Range("D" & i).Value
 
            pray = pray & Worksheets("attendance").Range("F" & i).Value
 
            
 
                .Content.InsertAfter job & sex & grade & " " & name
 
                .Content.Paragraphs.Last.Range.Font.Bold = True
``//원하는 형태의 포맷으로 맞춤
                If (StrComp("리더", job, vbTextCompare) = 0= True Then
 
                .Content.Paragraphs.Last.Range.Font.Underline = wdUnderlineSingle
``//리더면 밑줄, 아니면 밑줄 안함
                Else
 
                .Content.Paragraphs.Last.Range.Font.Underline = wdUnderlineNone
 
                End If
 
                .Content.InsertParagraphAfter
 
                .Content.InsertAfter "%%% " & pray
``//엔터를 넣고싶지 않았는데 방법을 찾다가 대안으로 생각해낸 방법. %%%를 넣어 놓고 나중에 엔터+%%%를 지우는 방법을 택함.
                .Content.Paragraphs.Last.Range.Font.Bold = False
 
                .Content.Paragraphs.Last.Range.Font.Underline = wdUnderlineNone
 
                .Content.InsertParagraphAfter
 
                
 
                
 
        End If
 
    Next i
``//For문 끝
    .Content.Find.Execute FindText:="^p%%%", ReplaceWith:="", Replace:=wdReplaceAll
``//^p는 엔터임
    .SaveAs (ThisWorkbook.Path & "\기도편지.docx")
``//같은 디렉토리 내 기도편지.docx로 저장한다.
    .Close ' close the document
 
     End With
 
     wrdApp.Quit
 
     Set wrdDoc = Nothing
 
     Set wrdApp = Nothing
    
 
End Sub
cs

해당 코드를 이해하려면 엑셀파일의 형태를 알아야 할 것이다. 엑셀파일의 형태는 다음과 같다. 

 

위의 VBA코드의 목적은 다음과 같다.

구분 : 리더, 성별 : 남, 학년 : 5, 이름 : 구르는돼지, 기도제목 : 1. 잘되게 해주세요.

구분 : (null), 성별 : 남, 학년 : 4, 이름 : 홍길동, 기도제목 : 1. 예시입니다.

라는 열이 있다면 해당 열을 word 파일에 다음과 같이 입력하는 것이다.

 

리더 남5 권민기 1. 잘되게 해주세요.

남4 홍길동 1. 예시입니다.

 

그렇다면 코드에 대한 간략한 설명을 통해 어떻게 이런 과정이 이뤄지는지 알아보자.

대략적으로 주석을 달아두었다. 참고바란다.

 

If IsEmpty(Worksheets("attendance").Range("A" & i)) = False Then

 

                job = job & Worksheets("attendance").Range("A" & i)

 

            End If

 

            name = name & Worksheets("attendance").Range("E" & i).Value

 

            sex = " " & sex & Worksheets("attendance").Range("C" & i).Value

 

            grade = grade & Worksheets("attendance").Range("D" & i).Value

 

            pray = pray & Worksheets("attendance").Range("F" & i).Value

 

해당 코드를 통해 i번째 데이터에 대해 각각의 값을 변수에 넣는다. A열은 null값을 가질 수도 있어서(비어있을 수 있다.) IsEmpty메소드를 사용하였다. 그 외에 다른 변수들에도 각각 위치에 맞게 할당해줄 수 있다.

 

.Content.InsertAfter job & sex & grade & " " & name

.Content.InsertAfter 함수는 뒤에 써진 String 값을 Word에 작성한다. 문자열의 합은 &를 통해 합칠 수 있다. 많은 언어에서의 +와 비슷한 역활을 한다.

 

.Content.Paragraphs.Last.Range.무언가

가장 마지막에 적힌 글자에 대한 설정을 할 때 사용한다.

 

.Content.Find.Execute FindText:="^p%%%", ReplaceWith:="", Replace:=wdReplaceAll

찾고 바꾸기 이다. 하나만 바꿀때는 뭘 쓰는지는 구글링을 하자.

 

블로그에 쓰다보니 replace같은거 안쓰고 .Content.InsertParagraphAfter 이걸 한줄 지웠으면 되는 일이라는 것을 깨달았다... 하지만 참고하라고 그냥 남겨두도록 하겠다. (세상에 난 바보인가...)

 

나같은 경우 기도제목.docx 파일을 아무것도 작성하지 않은 빈 파일 상태로 저장해 두고 해당 매크로를 작동시켰다.

 

질문이 있다면 댓글로 하길 바란다!!

반응형