- 최초 작성일: 2001-11-13
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 선택적 링크파일 열기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 질문을 살펴봅니다.
파일을 열때 마다 "파일이 연결되었읍니다
업데이트 하시겠읍니까?" 라고 묻는 메시지가 자꾸 나와서 번거럽고
귀찮아 죽을 지경입니다. 이 메시지를 없애는 방법좀 알려 주세요.
그럼 늘 즐거운 시간 되시길 바랍니다.
선택적 링크파일 열기
핵심 요약: 링크 파일 다루기
AskToUpdateLinks 속성으로 업데이트 확인 메시지를 끄고, LinkSources 메서드로 얻은 연결 문서 목록을 유저폼 리스트 박스에 보여 주어 선택하거나 모두 열 수 있습니다.
- 1단계: auto_open에서 AskToUpdateLinks를 False로 지정합니다.
- 2단계: 유저폼 초기화 시 LinkSources로 연결 문서 목록을 리스트 박스에 채웁니다.
- 3단계: 선택한 파일 또는 모든 연결 파일을 Workbooks.Open으로 엽니다.
Step 1: 링크 업데이트 메시지 없애기 (auto_open)
다음은 다른 워크북의 셀을 참조하도록 연결(Linking)해 둔 표입니다.
| 지점 | 금액 |
|---|---|
| 강동 | 4826 |
| 강서 | 566 |
| 강동 | 1988 |
| 강북 | 1245 |
| 계 | 8625 |
이 부분이 다른 워크북과 연결(Linking)되어 있음에도 불구하고 아마 이 파일을 여실 때 아무런 메시지도 나타나지 않았을 것입니다. 이것은 auto_open 프로시저에 아래와 같은 코드를 삽입해 주면 됩니다.
Sub auto_open()
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
'''여기서 AskToUpdateLinks 프로퍼티는 "연결"이 포함되어 있는 파일을
'''열 때, 파일을 업데이트 시킬 것인지의 여부를 지정하는 속성입니다.
'''이것을 True로 하면 파일을 열 때, 업데이트 여부를 묻는 대화 상자를
'''화면상에 나타내 주게 됩니다. 따라서 이 속성값을 False로 해 주면
'''더 이상 묻지를 않게 되는 것입니다.
End Sub
AskToUpdateLinks 속성은 엑셀 프로그램 전체에 적용되는 설정입니다. 따라서 이 코드를 실행한 뒤에 여는 다른 통합문서에도 똑같이 적용되며, 파일을 여는 순간에 뜨는 링크 확인 메시지는 매크로가 실행되기 전에 표시될 수 있습니다. 필요한 작업을 마친 뒤에는 이 속성을 True로 되돌려 두시는 것이 좋습니다.
Step 2: 링크된 파일을 골라서 열기
오늘 강좌 이것으로 끝… 하려니까 뭔가 허전하지요? 해서 이것을 조금 응용해서 다른 재미있는 것을 하나 만들어 보도록 하겠습니다. 아래의 버튼을 눌러 보세요.
대화 상자가 나타나면서 링크된 모든 파일의 목록들이 표시될 것입니다. 뿐만 아니라 해당 링크 파일을 클릭하고 "열기" 버튼을 클릭하면 지정한 링크 파일이 열릴 것입니다.
리스트 박스 오브젝트에 대해서는 그동안 여러 차례 다루었으므로 별도의 해설이 필요없을 듯도 합니다만… 어디갔다 오시는 지 이제서야 오시는 분이 요즘도 많은 듯하여 설명을 드리도록 하겠습니다. ^^ 시간이 여의치 않는 관계로 코드에 대한 최적화 작업은 하지 못했습니다. 필요한 부분은 직접 수정해 보시기 바랍니다.
(1) 유저폼 디자인
(1) 아래의 그림(또는 VB Editor 상의 유저폼)을 참고로 유저폼을 하나 삽입하고 필요한 컨트롤 들을 그려 넣습니다.
(2) UserForm_Initialize 이벤트
(2) 유저폼의 빈 공간 아무 곳이나 더블클릭하고 화면 우측 상단의 드롭다운 버튼을 눌러서 유저폼의 초기화 이벤트(Initialize)를 선택합니다. 그런 다음, 아래와 같은 코드를 작성합니다.
Private Sub UserForm_Initialize()
Dim varLink As Variant
Dim intNum As Integer
varLink = ActiveWorkbook.LinkSources(xlExcelLinks)
'''LinkSource는 연결된 문서의 배열을 반환하는 메서드입니다.
If Not IsEmpty(varLink) Then
For intNum = LBound(varLink) To UBound(varLink)
ListBox1.AddItem varLink(intNum)
Next intNum
End If
ListBox1.MultiSelect = fmMultiSelectSingle
'''연결된 문서의 수만큼 순환문을 돌면서 연결된 내용을 유저폼의 리스트 박스
'''오브젝트에 보여줍니다.
End Sub
(3) "열기" 버튼 코드
(3) Shift + <F7> 키를 눌르면 유저폼이 화면에 나타납니다. 이번에는 "열기" 버튼을 더블 클릭하면 클릭 이벤트가 나타나는데 필요한 코드를 작성합니다.
Private Sub btnOK_Click()
Dim varLink As Variant
Dim i As Integer, intNum As Integer
Dim strSeletedFile() As String, Msg As String
varLink = ActiveWorkbook.LinkSources(xlExcelLinks)
intNum = ListBox1.ListIndex + 1
If ListBox1.ListIndex = -1 Then
MsgBox "아무 것도 선택하지 않으셨군요!", , "//Exceller"
Exit Sub
'''리스트 박스의 ListIndex가 -1이라는 것은 아무 리스트도 선택되지 않았다는
'''의미입니다. 이 경우, 에러 메시지를 뿌려주고 프로시저를 종료합니다.
End If
intNum = ListBox1.ListIndex + 1
If Not IsEmpty(varLink) Then
If MsgBox("선택하신 링크 파일을 열까요?", vbYesNo, "연결 문서 열기//By Exceller") = vbYes Then
Workbooks.Open varLink(intNum)
Else
End If
'''Not IsEmpty(varLink)라는 것은 varLink가 공란이 아닌 경우, 즉 연결된 통합
'''문서가 하나라도 있다는 의미입니다.
'''리스트 박스를 통해 사용자가 파일을 선택한 경우, 열 것인지의 여부를
'''물어본 다음 파일을 Open 합니다.
Else
MsgBox "이 통합문서에는 링크된 통합문서가 없습니다", , "VB0130//By Exceller"
End If
Unload Me
End Sub
(4) "모두 열기" 버튼 코드
(4) Shift + <F7> 키를 눌러 유저폼으로 돌아간 다음, 이번에는 "모두 열기" 버튼을 더블 클릭하고 아래와 같은 코드를 작성합니다. 말 그대로 연결된 모든 문서를 한꺼번에 열기 위한 것입니다. 코드는 어려운 부분이 하나도 없을 것이므로 해설은 생략합니다.
Private Sub btnAll_Click()
Dim varLink As Variant
Dim i As Integer
varLink = ActiveWorkbook.LinkSources(xlExcelLinks)
If Not IsEmpty(varLink) Then
For i = LBound(varLink) To UBound(varLink)
Workbooks.Open varLink(i)
Next i
Else
MsgBox "이 통합문서에는 링크된 통합문서가 없습니다"
End If
Unload Me
End Sub
숙제
오랜만에 리스트 박스를 다룬 기념으로 숙제를 하나 내 드릴까요? 우선 코드를 최적화 하지 못했으므로 잘 살펴보시고 중복되는 요소를 없애고 효율화시켜 보세요. 같은 기능을 담당하는 코드가 있을 경우, 이것을 각 프로시저에 남겨 두는 것보다 하나의 프로시저에 몰아두는 편이 이해하기도 쉽고 유지 보수하기도 용이할 것입니다.
또 한 가지 숙제! 현재는 한번에 하나의 연결 문서를 선택하거나 또는 모든 연결 문서를 한꺼번에 열 수 밖에 없게 되어 있는데 리스트 박스의 MultiSelect 속성을 이용하여 사용자가 선택하는 복수 개의 연결 문서가 열리도록 코드를 수정해 보세요.
이상의 숙제를 다 하신 분은 파일을 보내주시면… 혹시 모르지요. 선물을 드릴 지도… ^^
마무리
오늘은 여기까지…
정리 — 링크 파일 다루기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 메시지 끄기 | Application.AskToUpdateLinks = False | 업데이트 확인 창 생략 |
| 연결 목록 조회 | ActiveWorkbook.LinkSources(xlExcelLinks) | 연결된 문서 배열 반환 |
| 목록 표시 | ListBox1.AddItem varLink(intNum) | 리스트 박스에 추가 |
| 선택 확인 | ListBox1.ListIndex = -1 | 선택 여부 검사 |
| 파일 열기 | Workbooks.Open varLink(i) | 연결 파일 열기 |
자주 묻는 질문 (FAQ)
Q1. 파일을 열 때 나오는 링크 업데이트 메시지를 없애려면?
Application.AskToUpdateLinks 속성을 False로 지정하면 업데이트 여부를 묻는 대화 상자가 나타나지 않습니다.
Q2. 연결된 통합문서 목록은 어떻게 얻나요?
ActiveWorkbook.LinkSources(xlExcelLinks)가 연결된 문서의 배열을 반환하며, 연결이 없으면 Empty를 반환합니다.
Q3. 리스트 박스에서 아무것도 선택하지 않았는지 어떻게 알 수 있나요?
ListIndex가 -1이면 아무 항목도 선택되지 않은 상태입니다.
마치며
AskToUpdateLinks와 LinkSources를 활용하면 링크된 통합문서를 원하는 대로 제어하는 도구를 만들 수 있습니다.