엑셀 워드 매크로 - egsel wodeu maekeulo

주요 콘텐츠로 건너뛰기

이 브라우저는 더 이상 지원되지 않습니다.

최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요.

Word 문서 및 Excel 통합 문서의 데이터를 사용하여 Outlook에서 메시지를 보내는 VBA 매크로

  • 아티클
  • 10/13/2022
  • 읽는 데 3분 걸림
  • 적용 대상:Outlook

이 문서의 내용

요약

이 문서에서는 Microsoft Word 문서 및 Microsoft Excel 통합 문서의 데이터를 사용하여 Microsoft Outlook에서 메시지를 보내는 Visual Basic for Applications 매크로에 대해 설명합니다.

추가 정보

중요

Microsoft에서 제공하는 프로그래밍 예제는 예시를 위한 것일 뿐이며 이와 관련하여 명시적이거나 묵시적인 어떠한 보증도 하지 않습니다. 이는 상품성이나 특정 목적에 대한 적합성의 묵시적인 보증을 포함하며 이에 제한되지 않습니다. 이 문서에서는 예제에 사용되고 있는 프로그래밍 언어와 프로시저를 만들고 디버깅하는 데 사용되는 도구를 사용자가 잘 알고 있는 것으로 가정합니다. Microsoft 지원 엔지니어는 사용자에게 도움이 되도록 특정 프로시저에 대한 기능을 설명할 수 있지만 사용자의 특정 요구 사항에 맞도록 예제를 수정하여 추가 기능을 제공하거나 프로시저를 구성하지는 않습니다.

다음 예제에서는 워크시트에 정의된 두 개의 이름이 있다고 가정합니다.

  • 첫 번째 정의된 이름인 subjectcell은 메시지 제목 줄이 포함된 셀을 나타냅니다(예: "테스트 메시지입니다.").
  • 두 번째로 정의된 이름 인 tolist는 받는 사람 목록(예: "John Doe", "Jane Doe" 등)이 포함된 가로 목록의 첫 번째 셀을 참조합니다.

Microsoft Word 문서도 있어야 합니다. 이 문서의 텍스트는 매크로에서 메일 메시지의 메시지 본문으로 사용됩니다.

Sub SendOutlookMessages()'Dimension variables.
    Dim OL As Object, MailSendItem As Object
    Dim W As Object
    Dim MsgTxt As String, SendFile As String
    Dim ToRangeCounter As Variant
    
    'Identifies Word file to send
    SendFile = Application.GetOpenFilename(Title:="Select MS Word " & _
    "file to mail, then click 'Open'", buttontext:="Send", _
    MultiSelect:=False)'Starts Word session
    Set W = GetObject(SendFile)'Pulls text from file for message body
    MsgTxt = W.Range(Start:=W.Paragraphs(1).Range.Start, _
    End:=W.Paragraphs(W.Paragraphs.Count).Range.End)'Ends Word session
    Set W = Nothing
    
    'Starts Outlook session
    Set OL = CreateObject("Outlook.Application")
    Set MailSendItem = OL.CreateItem(olMailItem)
    
    ToRangeCounter = 0
    
    'Identifies number of recipients for To list.
    For Each xCell In ActiveSheet.Range(Range("tolist"), _
    Range("tolist").End(xlToRight))
    ToRangeCounter = ToRangeCounter + 1
    Next xCell
    
    If ToRangeCounter = 256 Then ToRangeCounter = 1
    
    'Creates message
    With MailSendItem
    .Subject = ActiveSheet.Range("subjectcell").Text
    .Body = MsgTxt
    
    'Creates "To" list
    For Each xRecipient In Range("tolist").Resize(1, ToRangeCounter)
    RecipientList = RecipientList & ";" & xRecipient
    Next xRecipient
    
    .To = RecipientList
    .Send
    End With
    
    'Ends Outlook session
    Set OL = Nothing
    
End Sub

Microsoft 365용 Excel Microsoft 365용 Word Microsoft 365용 PowerPoint Excel 2021 Word 2021 PowerPoint 2021 Excel 2019 Word 2019 PowerPoint 2019 Excel 2016 Word 2016 PowerPoint 2016 Excel 2013 Word 2013 PowerPoint 2013 Excel 2010 Word 2010 PowerPoint 2010 더 보기...간단히

문서 검사관은 문서에 숨겨진 데이터를 포함할 수 있는 다음 항목 중 하나 이상을 Office(Word, Excel 또는 PowerPoint.

  • 매크로(Word 문서에 Word 문서 또는 XLM(Excel 4.0 매크로 시트)의 WordBasic 매크로를 Excel 포함)

  • VBA 모듈

  • COM 또는 ActiveX 컨트롤

  • 사용자 양식(통합 문서의 Excel 5.0 폼을 Excel 포함)

  • User-Defined 통합 문서의 UDF(Excel 함수)

문제

이러한 항목을 제거하면 문서가 제대로 작동하지 않을 수 있기 때문에 문서 검사기에서 이러한 항목을 제거할 수 없습니다.

권장 해결 방법

  1. 문서 검사를 닫습니다.

  2. 문서에서 숨겨진 데이터가 있을 수 있는 매크로, VBA 모듈, COM 또는 ActiveX 컨트롤, 사용자 양식 또는 UDF를 수동으로 제거합니다.

    문서에서 매크로 및 VBA 모듈을 찾을 수 있는 방법에는 다음과 같습니다.

    • Word 또는 Excel 에서 매크로 보기 > >클릭합니다.

      PowerPoint 매크로 보기를 > 클릭합니다.

      매크로 상자에서 제거할 매크로를 선택하고 삭제를 클릭합니다.

    • Alt+F11을 눌러 VBA 편집기에서 매크로를 찾을 수 있습니다.

  3. 문제가 해결된지 확인하려면 파일 파일 > > 확인을 클릭하고문서 검사 를 클릭합니다.

추가 도움이 필요하신가요?

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

사실 프로젝트 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)

= 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

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

엑셀 워드 매크로 - egsel wodeu maekeulo

위의 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 파일을 아무것도 작성하지 않은 빈 파일 상태로 저장해 두고 해당 매크로를 작동시켰다.

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