반복작업을 미리 기억시켰다가 키 하나로 즉시 실행하는 '매크로'기능을 익혀보자.
그동안 연재를 통해 로터스의 활용법을 어느 정도 살펴보았다. 로터스를 사용한다는 것은 결국 메뉴를 불러내어 특정기능을 수행하고 커서를 이동시키며 자료를 입력하는 작업이다. 이런 반복적인 작업을 미리 기억시켰다가 키 하나만 누르면 즉시 실행되도록 할 수 있는데, 이런 기능을 매크로(macro)기능이라고 한다. 이것을 이용해서 보다 편리하게 로터스를 사용하는 방법을 알아보자.
매크로란 영어로 '크다'는 의미지만 어셈블리 언어(assembly language)라는 프로그래밍 언어에서 사용되는 전문 용어이기도 하다. 어셈블리 언어에서 매크로는 여러 명령어로 구성된 부분을 함축하여 새로운 명령어로 등록한 것으로 프로그램을 간결하게 작성할 수 있도록 해준다.
이것과 비슷하게 여러 개의 키입력을 하나의 키에 함축시키는 것을 키매크로(key macro)라고 부르며, 로터스에서는 간단하게 매크로라고 부른다.
매크로의 작성
좀 더 정확하게 말하면 로터스에서 매크로는 특별하게 이름을 붙인, 그리고 미리 약속된 형식대로 작성된 문자열을 가진 셀(cell)이다. 무슨 이야기인지 잘 모르겠다면(그림1)을 보자. 먼저 셀 포인터를 A1 셀에 위치시킨 뒤 \a를 입력한다. 이것은 별다른 의미는 없고 B1 셀에 있는 매크로의 이름이 \a임을 기억하기 쉽도록 하기 위한 것이다. 다음에는 셀 포인터를 B1 셀로 옮겨 This is the first macro!~를 입력한다. 이때 마지막의 ~는 키보드에 있는 물결무늬 모양의 키를 말하는 것인데, 매크로에 사용된 ~는 키보드에서 Enter키를 나타낸다. 그리고 /키를 눌러 메뉴를 호출하고 계속하여 Range Name Create 메뉴를 불러낸다. 이것은 현재 셀 포인터가 위치해 있으며 매크로가 들어 있는 B1 셀에 이름을 부여하기 위함이다. 이름은 \a로 입력한다. 이 이름을 부여하면 나중에 B1 셀의 매크로를 Alt+A키를 눌러 실행할 수 있다. 범위를 묻는 질문에는 그냥 Enter키를 눌러 B1 셀을 지정한다. 만약 셀 포인터가 다른 셀에 있었다면 Esc 키를 한번 누르고 셀 포인터를 B1 셀로 옮긴 다음 Enter키를 누른다.
자, 이제 준비가 되었다. 셀 포인터를 A5 셀로 옮겨서 Alt키를 누른 상태에서 A 키를 눌러보라. (그림1)처럼 B1 셀의 내용이 순식간에 복사될 것이다. 단지 ~만 빼고 말이다. ~는 Enter키를 의미하는 것이니 보이지 않게 된다. 셀 포인터를 다른 셀로 옮기면서 Alt+A키를 10번 누르면 2백50번의 키입력이 자동으로 이루어진다는 계산이 나온다.
특수키를 나타내려면
매크로가 그리 어려운 것은 아니다. 우리가 누를 키들을 미리 기억시켰다가 한꺼번에 실행시키는 것이다. 마치 녹음을 했다가 재생하는 것과 같다. 그런데 알파벳이나 한글이 아닌 특수 키들은 어떻게 나타낼 수 있을까.
앞에서 ~가 Enter키를 의미한 것처럼 미리 약속된 기호를 사용해야 한다. (표1)에 매크로에서 특수 키를 나타내는 기호들의 예를 보였다. 화살표 키나 다른 특수키들은 키의 이름과 연관성이 있는 이름을 사용하며, 펑션키(function key)의 경우에는 해당 키가 가지고 있는 기능의 이름을 따랐다.
그렇다면 ~, {, }자체를 입력해야 하는 것은 어떻게 처리할까. 간단하다. 모두 { }로 둘러 쌓아서 {~}, {{}, {}}로 나타내면 된다.
지금까지 배운 것으로 셀 포인터가 위치한 열의 폭을 20으로 지정하는 매크로를 작성한 것이 (그림2)다. (그림2)에서처럼 매크로로 등록된 B1 셀의 밑에 있는 셀들은 공백 셀이 있기 전까지는 모두 연결된 매크로로 간주된다.
(그림2)와 같은 상황에서 우리가 Alt+A키를 누르면 /Worksheet Column Set Width의 메뉴를 차례로 부른 다음 20을 입력하고 Enter키를 누르고 오른쪽 화살표 키를 한 번 눌러준 것과 같아진다. 이 매크로를 사용하면 열의 폭을 20으로 지정하는 일을 간단하게 할 수 있다.
매크로에서만 가능한 명령
그런데 (그림2)의 매크로는 열의 폭을 일정한 크기로만 지정할 뿐이다. 이것을 경우에 따라서 다르게 할 수는 없을까? 그렇게 하려면 매크로를 실행할 때마다 사용자에게 입력을 받아야 한다. 바로 {?}가 그런 기능을 수행한다. 따라서 (그림2)에서 20을 {?}로 바꿔주면 된다. 그 후에는 Alt+A키를 누르고 열의 폭을 숫자로 입력해주면 된다. {?}는 매크로를 실행할 때마다 사용자가 그 값을 결정할 수 있는 변수인 셈이다.
{?}처럼 우리가 누르는 키가 아닌, 매크로에서 필요한 어떤 기능을 나타내는 명령들이 있다. 이런 명령들이 있음으로 해서 로터스의 매크로는 사용자가 생각할 수 있는 거의 모든 일을 할 수 있는 것이다. (표2)는 로터스의 매크로에서 사용할 수 있는 일부 명령들과 그 기능을 보인 것이다.
자, 그렇다면 이 명령어를 사용해서 작성한 두 개의 매크로 (그림3)를 보자. A1, D1, E1, E2셀을 입력할 때는 그 내용이 문자열이라는 사실을 로터스에게 확실하게 전달하기 위해서 \를 먼저 입력해야 한다. 그리고 셀 포인터를 E1에 갖다 놓고 /Range Name Create 메뉴를 불러내서 매크로 이름인 \s를 입력하고 범위를 E1 셀로 지정하는 것을 잊지 않아야 한다.
이제 셀 포인터를 A4 셀에 위치시키고 Alt+A키를 누른다. NumLock키를 누른 다음 키보드의 오른쪽에 있는 숫자 키패드를 이용하여 숫자를 입력하고 Enter키를 누른다. 그러면 셀 포인터는 자동으로 한 칸 아래로 이동할 것이다. 다시 숫자를 입력하면 셀 포인터는 한 칸 아래로 움직인다.
이 매크로는 숫자를 입력한 다음 아래 화살표 키를 눌러 셀 포인터를 아래로 움직이는 수고를 덜어주기 위한 것이다. 특히 숫자를 계속 입력해야 하는 경우 키보드의 오른쪽에 있는 숫자 키패드를 쓰면 편리한데, 일반적인 키보드에서는 이 키들이 화살표 키로도 사용되니까 매우 불편하다. 그럴 때 이 매크로를 입력해서 사용하면 아주 좋다. 숫자를 오른쪽으로 이동하면서 입력하고 싶다면 {down}을 {right}로 바꾸면 된다.
\a매크로로 숫자를 연달아 입력한 다음에 Alt+S키를 눌러보자. 어떤 일이 일어나는가. (그림3)에서 보는 것처럼 현재 셀 포인터가 있던 셀에 줄이 그어지고 그 밑에 합계가 나타날 것이다.
줄이 그어진 것은 간단하다. \를 입력하면 \의 특수 기능에 의해 그 뒤에 오는 -문자를 셀의 폭에 가득차게 표시해준다. 그 다음 {down}에 의해 셀 포인터가 한 칸 밑으로 옮겨지고 합계를 내기 위해 @sum(이 입력된다. 이제 입력되어야 할 것은 합계를 낼 부분의 범위이다.
사용자가 숫자를 입력한 범위는 그야말로 사용자 마음인데 그것을 어떻게 알 수 있을까. 한 가지 확실한 것은 범위의 한 쪽 끝은 줄이 그어진 셀이란 점이다. 따라서 {up}으로 한 칸 올라가면 셀 포인터를 움직여 범위를 지정하는 Point mode로 바뀌게 되며(화면의 우측 상단에 나타난다), 줄이 그어진 셀이 범위의 시작위치로 지정된다. 범위의 시작위치를 성공적으로 찾아냈으므로 마침표(.)를 찍는다. 문제는 범위가 끝나는 위치를 찾는 방법이다.
여기에서 우리는 이 합계 매크로의 사용자가 한 가지 약속을 지킨다는 가정을 해야 한다. 숫자를 입력하기 시작할 셀의 위에는 아무것도 입력되지 않은 빈 셀을 두어야 한다는 것이다. 이 약속이 지켜진다면(지켜지지 않는다면 합계 매크로가 효력을 발휘하지 못하므로 당연히 지켜질 것이다) 범위의 다른 끝으로 이동할 수 있는 방법이 있다. End키를 누르고 ↑키를 누르면 비어 있는 셀이 발견될 때까지 거슬러 올라가서 그 전의 셀에 셀 포인터가 놓이게 된다.
이미 독자들은 B1 셀에 있는 매크로의 의미를 알아차렸을 것이다. {?}에 의해 사용자가 숫자를 입력할 때까지 기다리게 되고, 입력이 되면 {down}에 의해 셀 포인터가 한 칸 아래로 이동한다. 그 다음 {branch} 명령에 의해 \a 위치로 이동을 해서 계속 매크로를 수행하게 된다. \는 무엇인가. 이 매크로를 실행하기 위해서 B1 셀의 범위 이름으로 \를 입력하지 않았던가. 즉 \는 B1 셀을 가리키는 것이다. 물론 직접 B1 셀의 이름을 사용해도 되지만 매크로의 위치가 변경될 가능성이 있으므로 매크로의 이름을 쓰는 것이 틀림없다.
바로 이 셀이 우리가 원하는 범위의 반대편 끝이다.
결과적으로 \a 매크로의 의미를 정리해보면 현재의 셀에 줄을 긋고, 아래 셀로 내려와서 그 위에 있는 연속된 숫자들의 합을 구해주는 매크로인 것이다. 로터스로 하는 일의 많은 부분이 숫자를 입력해서 그 합을 구하는 것임을 생각해볼 때 이 두 개의 매크로(숫자를 계속 입력하고 그 합계를 내주는)의 효용가치는 매우 높다.
석차를 가리는 매크로 기능
지난달 로터스 강좌의 마지막을 기억하는지. 예제로 다룬 성적 데이터베이스에서 학생들의 석차를 내는데 평균과 국어 성적이 모두 같은 경우가 있다면 로터스가 기본적으로 제공하는 기능으로는 처리할 수 없다고 했다. 그렇다면 매크로를 이용하면 가능할까.(그림4)에 있는 매크로가 그 답이다.
(그림4)의 매크로를 (그림5)에서도 살짝 보이는 것처럼 A14 셀부터 아래에 입력한다. 그리고 /Range Name Create를 눌러 메뉴를 호출한 다음 매크로 이름으로 \을 입력하고 Enter키를 누른다.
이 매크로를 사용하려면 몇가지 약속이 지켜져야 한다. 우선 Alt+R키를 눌러 매크로를 호출할 때 셀 포인터가 석차가 시작되는 위치인 F4 셀에 있어야 하고, A13과 B13 셀은 매크로가 숫자를 보관하기 위해서 사용하므로 이 셀들을 다른 용도로 사용하지 않아야 하는 것이다. 그리고 이 매크로는 성적 레코드를 재정렬하는 기능이 없으므로 먼저 지난호에서 설명한 대로 로터스의 데이터베이스 기능을 이용하여 소트(sort)를 하고 석차를 일렬로 매겨 놓아야 한다. 그 이유는 매크로가 완벽하려면 꽤 긴 프로그램을 작성해야 하는데 로터스가 제공하는 기본적인 기능을 이용하여 기초적인 작업을 하는 것이 더 경제적이기 때문이다.
(그림4)에 매크로가 동작하는 원리에 대해서 자세하게 설명했으므로 (그림5)와 연관시켜 잘 해석해보면 이해가 되리라 믿는다. 이 매크로의 논리구조는 다음과 같다.
① 평균을 비교한다.
② 앞 등수의 평균이 더 크면 다음으로 넘어간다.
③ 평균이 같으면 국어 성적을 비교한다.
④ 앞 등수의 국어 점수가 더 크면 다음으로 넘어간다.
⑤ 국어 점수가 같으면 산수 성적을 비교한다.
⑥ 앞 등수의 산수 점수가 더 크면 다음으로 넘어간다.
⑦ 산수 점수가 같으면 등수를 같게 만든다.
⑧ 현재 등수의 산수 점수가 더 크면 에러임을 표시하여 사용자각 수정하도록 만든다.
(그림5)에서는 2등과 3등이 평균과 국어 점수가 같지만 3등의 산수 성적이 더 커 에러로 처리된 것이다. 사용자가 두 자료의 위치를 바꾸고 등수를 제대로 입력하면 된다. 이 작업까지 매크로로 할 수 없는 것은 아니나 실제 상황에서 이런 경우가 발생할 확률이 극히 적고, 프로그램이 너무 커져 그것을 개발하는 시간이 아깝다.
이상으로 로터의 고급 기능인 매크로까지 총6회에 걸친 로터스에 대한 강좌를 마친다. 로터스는 꽤 방대한 기능을 가지고 있기에 필자가 다룬 내용은 그 입문에 지나지 않음을 기억하기 바란다. 이번호에서 다룬 매크로만 해도 단행본 한 권으로 설명해도 모자랄 정도다. 따라서 로터스를 실제로 배우려고 하는 독자는 몇권의 참고 도서가 필요할 것이다. 특히 매크로를 제법 쓰려면 많은 시간을 책을 읽는데 투자해야 한다.
컴퓨터가 그러하듯이 로터스도 인간이 하는 일을 편하고 빠르게 한 수 있도록 도와주는 도구다. 단지 그것이 좀 복잡하고 생각을 많이 해야 사용할 수 있을 따름이다. 아마 대부분의 컴퓨터 사용자는 로터스의 대가가 될 필요는 없을 것이다. 필요한 만큼만 배워서 잘 이용하면 그것이 현명한 사람의 컴퓨터 활용기술이 아닐까.