본문 바로가기
책상 노트 책상 노트
실무자가 실제로 굴려본 업무도구·업무 자동화 기록

엑셀 매크로 오류가 난 날, 10분짜리 일이 이틀이 됐습니다

읽는 시간 약 10분

매월 초에 법인카드 사용내역을 법인별로 나눠 정리하는 엑셀 파일이 있습니다. 시트에 버튼이 하나 있고, 그걸 누르면 카드사에서 내려받은 내역이 법인별 시트로 갈라지고 항목별 집계까지 채워집니다. 10분이면 끝나는 일이었습니다.

그 버튼이 어느 월요일 아침에 죽었습니다. 누르자마자 컴파일 오류 창이 떴습니다. 컴파일 오류란 코드를 실행하기 전 점검 단계에서 문법이나 참조 문제로 막히는 오류입니다. 엑셀 매크로 오류였던 셈이고, 그 달 취합은 결국 이틀에 걸쳐 손으로 했습니다. 이 글은 그 매크로를 살리는 과정과, 살리고 나서 매크로 자체를 절반쯤 걷어낸 판단의 기록입니다.

원인과 결과는 세 줄로 줄어듭니다.

  • 직접 원인은 두 개였습니다. 참조하던 외부 라이브러리 하나가 깨진 것, 그리고 오피스가 64비트로 바뀌면서 옛 선언문이 통째로 안 맞게 된 것입니다.
  • 고치는 데 걸린 시간보다 원인을 찾는 데 걸린 시간이 훨씬 길었습니다. 만든 지 오래된 매크로라 내부를 아는 사람이 없었기 때문입니다.
  • 다시 만들면서 확인해보니, 매크로가 하던 일의 절반은 애초에 매크로가 필요 없는 일이었습니다.
매크로가 돌 때 10분이던 월초 취합이 이틀로 늘어난 수치와 확인된 원인 두 개를 정리한 도해

그 매크로가 하던 일

제가 여러 법인의 재무 실무를 같이 보다 보니, 카드 내역 취합은 법인 수만큼 반복되는 일입니다. 매크로는 그 반복을 대신하고 있었습니다.

  • 카드사 사이트에서 내려받은 엑셀을 열어 형식을 정리합니다
  • 카드번호 뒷자리를 기준으로 법인별 시트에 나눠 붙입니다
  • 항목 분류 열을 채우고 시트별 합계를 만듭니다
  • 완성된 파일을 정해진 폴더에 날짜 이름으로 저장합니다

이 파일은 제가 처음부터 만든 게 아니라, 몇 년 전에 만들어져 손을 타지 않고 굴러온 물건이었습니다. 잘 돌아가는 자동화의 특징이 그렇습니다. 잘 돌아가는 동안에는 아무도 안을 들여다보지 않습니다.

비슷한 매크로를 오래 굴리는 사무실이라면 지금 짚어볼 게 두 가지 있습니다. 매크로가 의존하는 오피스 버전과 외부 구성 요소 목록이 어딘가에 적혀 있는지, 그리고 그 매크로를 만든 사람이 지금도 회사에 있는지입니다. 이 두 가지가 없는 상태로 몇 년을 굴리면, 이번처럼 PC 한 대 바뀌는 흔한 사건에도 원인을 찾는 데만 하루 넘게 걸립니다. 저희도 이 조건을 미리 확인하지 못한 채로 몇 년을 썼고, 그 값을 이번에 치른 셈입니다.

첫 번째 오류: 라이브러리를 찾을 수 없다는 메시지

오류 창의 문구는 프로젝트 또는 라이브러리를 찾을 수 없다는 내용이었습니다. 코드가 틀렸다는 말이 아니라, 코드가 기대던 무언가가 사라졌다는 말입니다.

편집기를 열고 도구의 참조 목록을 확인했습니다. 목록 중 한 줄 앞에 누락됐다는 표시가 붙어 있었습니다. 예전 버전의 외부 구성 요소를 참조하고 있었는데, 그 구성 요소가 지금 PC에는 없는 상태였습니다.

참조 하나가 깨지면 엉뚱한 줄에서 오류가 납니다

여기서 하루를 반쯤 버렸습니다. 오류가 멈춰 세운 줄은 날짜를 다루는 평범한 코드였고, 저는 그 줄만 계속 들여다봤습니다. 나중에 알게 된 사실인데, 참조가 하나라도 깨져 있으면 그 참조와 무관한 기본 함수들까지 연쇄적으로 인식이 안 되면서 아무 데서나 오류가 납니다. 멈춘 자리와 원인의 자리가 다른 겁니다.

이 성질을 몰랐던 탓에 멀쩡한 코드를 계속 의심했습니다. 참조 목록의 누락 표시를 해제하는 것으로 첫 번째 오류는 끝났습니다. 고치는 조작 자체는 1분이었습니다.

두 번째 오류: 오피스가 64비트로 바뀌어 있었습니다

참조를 고치고 다시 버튼을 눌렀더니 이번에는 다른 컴파일 오류가 떴습니다. 오류 문구는 이 코드를 64비트 시스템에 맞게 갱신해야 한다는 내용이었습니다.

확인해보니 얼마 전 PC를 바꾸면서 오피스가 64비트로 설치되어 있었습니다. 이전 PC는 32비트였습니다. 매크로 안에는 파일 대화상자를 띄우려고 시스템 기능을 직접 끌어다 쓰는 오래된 선언문이 몇 줄 있었고, 이 선언문이 32비트 시절 방식 그대로였습니다.

이 부분은 제가 원인을 특정하고도 바로 고치지 못했습니다. 선언문에 붙여야 하는 예약어와 자료형을 바꿔야 한다는 것까지는 검색으로 알았지만, 몇 줄을 고치자 다른 줄에서 또 오류가 나는 식으로 꼬리를 물었습니다. 결국 그 달은 복구를 포기하고 수작업으로 취합을 끝냈습니다. 법인 네 곳 분량을 손으로 가르고 검산하는 데 이틀이 들어갔습니다.

손으로 가른 이틀과 매크로가 돌 때의 10분을 나란히 놓으면 차이가 큽니다. 이 이틀에는 원인을 못 찾아 헤맨 시간도 섞여 있습니다. 그걸 빼더라도 법인 네 곳을 손으로 가르고 검산하는 일은 매크로 없이 매달 반복할 만큼 가벼운 일이 아니었습니다.

라이브러리 누락에서 64비트 오류를 거쳐 수작업 마감으로 끝난 복구 시도 네 단계를 정리한 도해

복기: 이 매크로는 언제든 깨질 수 있는 상태였습니다

수작업으로 급한 불을 끄고 나서, 왜 이 지경이 됐는지를 따져봤습니다.

항목상태
만든 사람특정 안 됨, 문서 없음
내부 구조를 아는 사람없음
외부 구성 요소 의존있음, 목록화 안 됨
동작 환경 전제32비트 오피스, 명시 안 됨
깨졌을 때 대체 절차없음

표로 적고 보니 명확했습니다. 이 매크로는 그동안 안 깨진 게 아니라, 깨질 계기를 아직 안 만난 것뿐이었습니다. PC 교체라는 흔한 사건 하나로 전제가 무너졌고, 전제가 어디에도 적혀 있지 않았으니 무너진 자리를 찾는 데 시간이 들 수밖에 없었습니다.

자동화가 시간을 벌어주는 동안, 그 자동화가 무엇에 기대고 있는지는 아무도 세지 않고 있었던 겁니다.

다른 방법도 검토했습니다

매크로를 되살리는 대신 아예 다른 도구로 갈아타는 방법도 생각해봤습니다. 협업 도구나 회계 프로그램 쪽에 카드 내역 취합 기능이 있는지 알아봤는데, 법인마다 쓰는 카드사가 다르고 내려받는 파일 형식도 제각각이라 그 기능을 그대로 쓰려면 결국 또 다른 변환 작업이 하나 더 필요했습니다. 지금 있는 문제를 새 도구로 옮기는 것뿐이지 없애는 게 아니었습니다. 그래서 이 방향은 접었고, 있던 매크로를 고치고 줄이는 쪽을 택했습니다.

다시 만들면서 바꾼 것

다음 달이 오기 전에 매크로를 다시 만들었습니다. 다만 그대로 복원하지 않고, 하던 일을 한 줄씩 뜯어서 지금도 매크로가 필요한 일인지부터 다시 물었습니다.

절반은 매크로가 필요 없는 일이었습니다

내려받은 파일의 형식 정리와 법인별 분리, 집계는 엑셀에 이미 들어 있는 데이터 가져오기 기능으로 대체했습니다. 원본 파일을 폴더에 넣고 새로 고침을 누르면 정리된 표가 갱신되는 방식입니다. 코드가 아니라 설정이라서, 제가 없어도 화면을 보면 무엇을 하는지 따라갈 수 있습니다.

시스템 기능을 직접 부르던 문제의 선언문은 통째로 없앴습니다. 파일 선택 대화상자를 띄우는 게 목적이었는데, 폴더를 고정해버리니 대화상자 자체가 필요 없었습니다. 몇 줄의 까다로운 코드가 실은 없어도 되는 편의 기능을 위해 존재하고 있었습니다.

남긴 매크로에는 설명서를 붙였습니다

날짜 이름으로 저장하는 마지막 단계만 짧은 매크로로 남겼습니다. 대신 파일 첫 시트에 설명 시트를 하나 만들어 세 가지를 적었습니다. 이 파일이 하는 일, 기대는 전제(오피스 버전, 원본 폴더 위치), 그리고 깨졌을 때 손으로 처리하는 순서입니다.

수작업 절차를 적어두는 게 이상하게 들릴 수 있는데, 이번에 이틀이 걸린 이유 중 하나는 매크로가 없으면 어떤 순서로 해야 하는지조차 정리돼 있지 않았기 때문입니다. 자동화의 비상구는 수작업 절차서입니다.

깨지기 전의 매크로와 다시 만든 뒤의 구성을 네 항목씩 대응시켜 비교한 도해

설명 시트를 붙인 뒤에 생긴 것

설명 시트를 넣고 나서 좋아진 점만 있지는 않았습니다. 파일을 열 때마다 시트가 하나 더 뜨니 번거롭다는 말을 들은 적이 있습니다. 그래도 이 시트를 지우자는 이야기는 나오지 않았습니다. 다음에 이 파일을 열어볼 사람이 저 말고 또 있을 수 있고, 그 사람이 참조나 오피스 버전을 저처럼 하루 반 걸려 찾아내는 일은 없었으면 하기 때문입니다. 번거로움 하나를 감수하고 찾는 시간 하나를 줄이는 거래라고 생각하고 있습니다.

매크로 파일 안에 적어둘 네 가지

  • 자동화가 기대고 있는 전제를 파일 안에 적어둡니다. 만든 날, 동작 환경, 외부 의존이 최소한입니다. 안 적힌 전제는 깨진 날 밤에 찾게 됩니다.
  • 오류가 멈춘 줄과 원인의 자리는 다를 수 있습니다. 참조나 환경처럼 코드 바깥부터 확인하고 코드 안으로 들어가는 순서가 시간을 아낍니다.
  • 코드로 짜인 자동화를 복원할 일이 생기면, 복원 전에 설정으로 대체할 수 있는지 먼저 봅니다. 설정은 다음 사람도 화면에서 읽을 수 있고, 오피스 버전과 원본 폴더 위치 같은 전제만 적어두면 환경이 바뀌어도 복원이 쉽습니다.
  • 깨졌을 때의 수작업 절차를 자동화와 같은 자리에 둡니다. 이게 있으면 장애가 나도 순서를 찾는 데 시간을 쓰지 않습니다.

다른 자동화 파일도 같은 기준으로 훑어봤습니다

이 일을 겪은 뒤로 회사에 남아 있는 다른 매크로 파일과 자동 실행 스크립트도 같은 기준으로 한 번씩 열어봤습니다. 설명 시트가 있는지, 만든 사람과 만든 시점이 적혀 있는지부터 확인했는데, 이 파일과 사정이 비슷한 파일이 두 개 더 나왔습니다. 전부 오래전에 만들어져 문제없이 돌아가고 있었고, 그래서 아무도 안을 열어본 적이 없었습니다. 당장 다 고치지는 못했지만, 이번 장애를 계기로 우선순위 목록에는 올려뒀습니다.

버튼은 다시 살아났지만, 이 일 이후로 저는 잘 돌아가는 자동화를 볼 때마다 한 가지를 묻게 됐습니다. 이게 무엇에 기대고 있는지 지금 말할 수 있는가입니다. 말할 수 없다면 그건 자동화가 아니라 시한이 안 적힌 부채에 가깝습니다.

이어서 읽을 기록

책상 노트 운영자
함께 보면 좋은 글
error: Content is protected !!