- 최초 작성일: 2000-10-10
- 최종 수정일: 2026-09-30
- 조회수: 20 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 파일을 열지않고 값 읽어오기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
"명상(Meditation)"이라고 하면 여러분은 어떤 것이 떠오르십니까? 보통 명상 하면 수염이 허연 도사같은 사람들이 벽을 보고 앉은 채, 미동도 없이, 삼매경에 빠져있는 것을 떠올리게 될 것입니다. 그런데 진정한 의미의 명상은 몰입, 즉 어떤 한 가지 일에 심취하는 것이 아닌가 생각합니다.
여러분은 지금 어떤 것에 미쳐(죄송합니다 이런 과격한 표현을 써서 ^^) 계십니까? 어떤 일에 미친다는 것, 곧 (좋은 것에) 중독된다는 것이 바로 명상, 그 자체이고 마음의 평정을 얻는 가장 좋은 방법이라고 생각합니다. 부디 여러분들도 무언가 한 가지 것에 몰입해 보시기 바랍니다. 사무실에서 많은 시간을 보내는 분은 몸을 많이 쓰는 일에, 쓰는 일에, 육체를 많이 쓰는 분은 그 반대되는 것에 말입니다.
역설적으로 들리실 지 모르겠지만 Exceller는 달리기를 하는 도중에 명상에 잠기곤 합니다. 숨이 턱에까지 차서 당장 때려치고 싶은 순간, 이것을 Dead Point(사점)라고 하는데 이 고비를 잘 넘기면 다시 새로운 기운이 샘솟게 됩니다. 이 때를 Second Wind라고 하며, 이 단계에 들어가면 내가 뛰는 것인지, 아니면 그저 주위의 풍경들이 다가왔다가 다시 뒤로 밀려나고 나는 그저 팔만 앞뒤로 흔드는 것인지 헷갈리게 됩니다. 또한 이 상태가 되면 여러 가지 좋은 생각들이 주마등처럼 스쳐 지나갑니다. 좋은 아이디어는 몸을 많이 움직이면 움직일수록 솟아납니다.
사설은 이쯤에서 접겠습니다. 더 나가면 곁길로 새니까(이미 반 정도는 샌 듯… ^^;).
파일을 열지않고 값 읽어오기
핵심 요약: 닫힌 파일 값 읽기
경로와 파일명, 시트명, R1C1 주소를 조합한 문자열을 ExecuteExcel4Macro로 실행해 열지 않은 통합 문서의 값을 읽어옵니다.
- 1단계: 읽을 파일의 경로, 파일명, 시트명을 변수에 담습니다.
- 2단계: 사용자 정의 함수 ReadValue에서 참조 문자열을 만듭니다.
- 3단계: ExecuteExcel4Macro로 실행해 값을 받아 셀에 채웁니다.
Step 1: 닫혀있는 파일의 값 읽어오기
강좌 제목이 아주 흥미롭군요(자기가 지어 놓고 흥미롭다니… 웬 나르시시즘?!@#). 오늘은 또 Exceller가 어떤 신통한(?) 것을 보여 드리려고 하나… 궁금하시지요? 하긴 어떤 분은 Exceller가 독심술을 배웠느냐고 질문하시는 분도 있었답니다.
"파일을 열지않은 상태에서 값을 읽어오는 방법이 없을까요?"라고 질문을 하시는 분이 가끔 계십니다. 이번 강좌에서 사용되는 파일은 지금 보시는 이 강좌 파일과 "지점별실적.xls" 파일입니다. 이 두 개의 파일을 반드시 같은 폴더에 압축해제를 하신 다음 아래 버튼을 눌러 보시기 바랍니다.
이 강좌에서 읽어올 지점별실적.xls 파일의 Sheet1은 아래와 같은 형태입니다.
| 지점명 | 1월 | 2월 | 3월 | 1분기계 |
|---|---|---|---|---|
| 강동 | 43 | 96 | 37 | 176 |
| 강서 | 61 | 78 | 72 | 211 |
| 강남 | 66 | 63 | 76 | 205 |
| 강북 | 16 | 57 | 96 | 169 |
| 부산 | 40 | 58 | 7 | 105 |
| 대구 | 17 | 30 | 64 | 111 |
| 대전 | 75 | 81 | 57 | 213 |
| 광주 | 45 | 67 | 6 | 118 |
| 제주 | 77 | 65 | 53 | 195 |
| 지점계 | 440 | 595 | 468 | 1503 |
Step 2: XLM 매크로란?
VBA로는 닫혀있는 파일의 값을 읽어오는 방법이 없습니다만 XLM 매크로를 사용하면 이것이 가능합니다(실제로는 "파일연결하기" 기능을 사용한 것입니다). XLM 매크로에 대해 간략하게 설명을 드리자면, 초기의 Excel(Excel 95이전까지)에서 매크로는 XLM이라는 확장자명을 갖는 별도의 파일에 코드를 따로 저장했었습니다. 이것을 XLM 매크로 또는 Excel4Macro라고도 불렀습니다.
XLM 매크로는 배우기가 엄청나게 어렵고 함수의 종류도 많았다고 합니다. (Exceller도 직접 사용해 보지는 않았고 오늘 강좌처럼 필요한 부분만 그때그때 참고를 하곤 합니다)
Excel 5.0 버전이 되면서부터 VBA 엔진을 장착하게 되었는데 VBA는 XLM보다 훨씬 배우기가 쉽고 막강한 성능을 자랑합니다. Excel에 VBA 엔진을 탑재할 것이냐 말것이냐를 두고 Microsoft社 내부에서도 의견이 분분했다고 전해집니다만 VBA를 Excel에 장착하면서부터 Excel은 그야말로 날개를 달게되었지요(그래서 본 강좌의 제목도 "Excel에 날개달기"랍니다 ^^).
하여튼 XLM 매크로는 앞으로 VBA가 버전업 됨에 따라 점점 자취를 감출 것으로 예상됩니다. 코드를 보도록 하지요.
ExecuteExcel4Macro는 옛 XLM(Excel 4.0) 매크로 함수를 실행하는 메서드로, 지금도 동작합니다. 다만 XLM 매크로는 보안 정책상 제한되는 경우가 있고, 최근에는 닫힌 통합 문서의 값을 읽을 때 외부 참조 수식, Power Query, ADO(ActiveX Data Objects) 등을 사용하는 방법도 많이 쓰입니다.
Step 3: 값을 불러오는 프로시저 작성하기
Sub CallReadValue()
Dim strPath As String
Dim strFile As String
Dim strSheet As String
Dim strAddress As String
Dim sht As Worksheet
Dim r As Long
Dim c As Integer
'//언제나처럼 필요한 변수를 먼저 선언해 줍니다.
Application.ScreenUpdating = True
Set sht = Worksheets.Add
ActiveWindow.DisplayGridlines = False
strPath = ThisWorkbook.Path
strFile = "지점별실적.xls"
strSheet = "Sheet1"
'//ScreenUpdating은 작업중 화면 갱신여부를 지정하는 것입니다.
'//strPath 변수에는 현재 파일이 위치한 경로를, strFile은 불러올 파일 이름을, strSheet는
'//불러올 파일의 대상 시트 이름을 각각 담아 둡니다.
For r = 1 To 11
For c = 1 To 5
strAddress = Cells(r, c).Address
If ReadValue(strPath, strFile, strSheet, strAddress) = 0 Then Exit For
Cells(r, c) = ReadValue(strPath, strFile, strSheet, strAddress)
'//순환문을 돌면서 불러올 자료가 있는 셀의 위치를 저장합니다. 여기서 ReadValue가
'//바로 XLM 매크로를 사용한 사용자 정의 함수입니다.
'//이 함수는 경로명, 파일이름, 시트이름, 셀주소 이렇게 4개의 요소를 넘겨 받습니다.
Next c
Next r
Selection.AutoFormat Format:=xlRangeAutoFormatList1, Number:=True, Font:= _
True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
Rows("1:2").Insert shift:=xlDown
'//이 부분은 "자동 서식"을 설정하는 것입니다. 그러면 Exceller 당신은 이걸 다 외워서
'//적었느냐? 절대 그렇지 않겠지요? 자동 서식 설정을 하는 과정을 매크로 기록기를 통해
'//기록한 다음, 수정/복사해서 붙여넣기를 하면 됩니다.
With ActiveCell
ActiveSheet.Buttons.Add(.Left, .Top, .Width * 2, .Height).Select
With Selection
.Caption = "<<돌아가기"
.OnAction = "GoBack"
End With
End With
'//자료 불러오기가 끝난 다음에 원래 위치로 돌아가기 위한 과정으로, 버튼을 하나 만들고
'//여기에 GoBack이라는 프로시저를 지정합니다.
Range("a1").Select
MsgBox "자료를 모두 읽어들였습니다", vbInformation, "작업 종료//Exceller"
End Sub
버튼에 연결된 GoBack 프로시저는 원래의 강좌 시트로 돌아가는 역할을 합니다.
Sub GoBack()
Sheets("Preface").Select
End Sub
Step 4: XLM 매크로를 이용한 사용자 정의 함수
이제 XLM 매크로를 사용해서 닫힌 파일의 내용을 불러오는 사용자 정의 함수를 작성합니다. 이 부분이 오늘의 핵심입니다.
Function ReadValue(Path, File, sht, Rng) As Variant
'//이 함수는 경로명, 파일명, 시트명, 범위명(셀주소) 이렇게 4가지 요소를 받습니다.
Dim Msg As String
Dim strTemp As String
If Trim(Right(Path, 1)) <> "\" Then Path = Path & "\"
'//지정한 경로명 마지막 부분에 \ 표시가 없으면 \표시를 추가합니다.
If Dir(Path & File) = "" Then
ReadValue = "해당 파일이 없습니다"
Exit Function
'//지정한 경로명내에 파일이 없으면 "해당 파일이 없습니다"라는 문자열을 결과값으로
'//돌려주고 함수를 종료합니다.
End If
Msg = "'" & Path & "[" & File & "]" & sht & "'!" & Range(Rng).Range("a1") _
.Address(, , xlR1C1)
ReadValue = ExecuteExcel4Macro(Msg)
'//다른 파일이나 워크시트의 내용을 연결할 때, 파일의 경우에는 '를, 워크시트의 경우에는
'//!표시가 붙습니다. 이것에 착안하여 Msg라는 문자열 변수에 경로명 & 파일명 & 셀주소 등의
'//정보를 저장합니다.
'//그런 다음에 Excel4Macro(XLM의 다른 이름!)를 실행시키고 결과값을 넘겨 받습니다.
End Function
마무리
오늘은 여기까지…
정리 — 닫힌 파일 값 읽기 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 파일 확인 | Dir(Path & File) = "" | 파일 존재 여부 확인 |
| 참조 문자열 | "'" & Path & "[" & File & "]" & sht & "'!" & 주소 | 외부 참조 형식 만들기 |
| 주소 형식 | .Address(, , xlR1C1) | R1C1 형식 주소 |
| 값 읽기 | ExecuteExcel4Macro(Msg) | XLM 매크로로 값 가져오기 |
| 돌아가기 버튼 | .OnAction = "GoBack" | 원래 시트로 이동 |
자주 묻는 질문 (FAQ)
Q1. VBA로 닫혀있는 파일의 값을 읽을 수 있나요?
VBA만으로는 어렵지만 XLM 매크로인 ExecuteExcel4Macro를 사용하면 파일을 열지 않고 값을 읽을 수 있습니다.
Q2. XLM 매크로는 무엇인가요?
Excel 95 이전에 사용하던 매크로 방식으로, Excel4Macro라고도 부릅니다.
Q3. 참조 문자열은 어떤 형식인가요?
'경로[파일명]시트명'!R1C1 형식으로 만듭니다.
마치며
XLM 매크로를 활용하면 파일을 열지 않고도 다른 통합 문서의 값을 읽어올 수 있습니다.