한셀 VBS로 업무 자동화하기

 

한셀은 한컴오피스에서 만든 스프레드시트이다. 마이크로소프트의 엑셀과 비슷한 것 같으면서도 다르다. 웹 사이트나 서적을 확인해보면 보통 엑셀 VBA에 대해 다루고 한셀의 VBS는 다루지 않는다. 그렇다고 엑셀 VBA책을 사자니 문법이 미세하게 다르므로 오류가 발생하기 때문에 입문하기가 쉽지 않다. 진입장벽이나 호환성, 기능 문제 등으로 한셀을 사용하는 것을 권장하지 않는다. 군부대의 인트라넷처럼 어쩔수 없이 사용해야 하는 경우를 제외하면 말이다.

한셀 VBS에 대하여

한셀 VBS는 같은 스프레드시트 소프트웨어인 엑셀 VBA와 비교될 수 밖에 없다. 우선 장단점에 대해 살펴보도록 하자. —

장점

  1. 한글로 된 변수나 프로시저를 지원한다. 가끔 충돌을 유발하므로 권장하지 않는다.
  2. 가격이 저렴하다. 그래서 공기업이나 군부대에 보급이 많이 된다.

단점

사용자 정의 폼 미지원

엑셀에서 강력하다고 생각하는 사용자 정의 폼이 한셀에는 없다. 이 기능을 활용할 수 있으면 수많은 응용이 가능해지는데(이를테면 이용자 정보를 입력하는 폼을 띄우는 기능), 이게 생산성을 극적으로 증폭시켜준다고 생각한다. 아무래도 사용자 정의 폼 이라는게 엑셀의 비주얼 베이직 기반이다보니 한컴오피스 입장에서는 애매했을수도 있다.

디버깅 미지원

한셀은 디버깅이 안된다. 아무 기능도 없고 MsgBox등을 활용해 직접 확인해보는 수 밖에 없다. 이쯤되면 왜 군대나 여타 공기업에서만 한셀을 사용하는지 알 법하다. 유일한 장점인 가격때문이다. 참고로, 엑셀에서는 한 줄씩 실행 또는 프로시저 단위 실행도 있고, 중단점 지정도 지원한다.

워크북, 워크시트 이벤트 미흡

엑셀에는 이벤트라는게 있다. 예를들어 Workbooks.Open은 엑셀파일이 실행됬을 때 작동하는 이벤트이다. 특정 셀을 더블클릭하거나 우클릭하거나 이벤트를 발생 시킬 수 있는데 한셀에서는 이게 제한적이다. 키보드 입력 이벤트는 보안상의 이유인지 아얘 막혀있고, Workbooks.Open도 작동하지 않는다.

에디터 자체의 기능 부족

찾아 바꾸기, 자동 완성 기능이 없다. 그래서 노트패드 ++ 같은 다른 소프트웨어를 활용해야한다. 그리고 최적화가 잘 안되어 있어서 코드가 몇 백, 몇 천줄로 길어지게 될 경우 많이 느려진다.

여러가지 기능 오류

겪어보았던 오류만 해도 수십가지가 된다. 한셀 2018 NEO 버전으로 들어오면서 더 그렇다. 자주 겪었던 문제를 나열해보자면 이렇다.

  1. 매크로 기록시 모듈이 생성되는데, 삭제할 수 없음.
  2. VBS 상에서 다른 엑셀파일 참조 시 켜져있는 엑셀파일과 의도치않은 충돌이 발생함.
  3. 가끔 Cells(3, "A"+변수) 와 같이 한글 이름으로 된 변수를 연산에 사용하면 에러가 나옴.
  4. 논리상 무한 루프나 수많은 연산이 나올 경우 다운됨.
  5. 2018부터 셀의 하이퍼링크 참조가 안됨. 도형으로 대체하여 개발하여야 한다.

한셀 VBA 튜토리얼

한셀 VBS 기초

위와 같은 무수한 단점이 있더라도 우회를 통하여 어느정도 원하는 한셀 프로그램을 개발할 수 있다. 물론 우회를 하려면 한셀에 존재하는 오류들을 어느정도 인지해야하고 그러기 위해서는 개발을 많이 해보는 수 밖에 없다. 이제부터 한셀 VBS에 대해 다루도록 하겠다.

실습으로 기초 다지기

특정 셀에 값 입력하기

1
2
3
Sub 프로시저()
	Range(Row, Column) = "값"
End Sub
  1. VBS에서는 프로시저 단위로 매크로를 지정할 수 있다. 뒤에 괄호를 붙여야 도형이나 버튼에 참조시킬 수 있다.
  2. Range(Row, Column)은 Range 뜻 그대로 범위를 선택하는 것이다. 물론 범위 말고도 Cells(1, “A”) 로도 선택이 가능하다. 여기서 알아둬야 할 것은 Range는 Range(“A1:C2”)와 같이 범위를 지정할 수 있는 반면에, Cells는 하나의 셀만 선택이 가능하다는 것이다.
  3. 프로시저를 끝낸다는 의미이다.

변수 선언하기

1
2
3
4
5
Sub 프로시저()
	Dim 변수
	변수 = "VBS"
	MsgBox(변수)
End Sub
  1. Dim 으로 변수를 선언해준다. 엑셀은 Dim 변수 As Range, Dim 변수 As Integer와 같이 변수형을 지정해 주지만. 한셀의 경우 오류가 날 우려가 있다. 그냥 Dim 변수로 쓰면 된다.
  2. 변수에 “VBS”라는 값을 저장한다.
  3. MsgBox로 변수를 출력한다. MsgBox(“텍스트”&변수) 이런식으로 응용도 가능하다.

여기서 MsgBox를 사용했는데, 이 기능은 유용하지만 사용하다보면 한셀의 고질적인 문제가 나타난다. 예를들면, MsgBox(“앞으로 “&변수&” 언어를 배워볼거에요.”) 같은 코드는 에러가 난다. 그냥 에러도 아니고 런타임 에러, 혹은 문장의 끝을 알 수 없다 등등.. 만약 같은 문제에 봉착한다면 아래와 같이 우회하면 된다.

1
2
3
4
5
6
7
	' 생략 ..
	Dim 변수
	Dim 변수2
	변수 = "VBS"
	변수2 = "앞으로 "&변수
	MsgBox(변수2&" 언어를 배워볼거에요..")
	' 생략 ..

이런식으로 우회하면 되는데, 이마저도 오류날 경우. 문장을 다른식으로 재구성하는 수 밖에 없다.

이제 프로시저 생성은 생략하고 진행하겠다.

조건문을 사용해서 입력하기

1
2
3
4
5
Sub 프로시저()
	If Cells(1, "A").Value = "" Then
		Cells(2, "A").Value = "A1 셀에 값이 없습니다."
	End If
End Sub
  1. Cells(1, “A”) 즉 A1 셀에 값이 없을 경우를 의미한다.
  2. A2 셀에 “A1 셀에 값이 없습니다.” 를 출력한다.

VBS에서 자주 사용하는 연산자로는 =(같음), <(미만), >(이상), <>(Not)이 있다. 보통은 <>를 사용해서 입력 값이 유효한지 검증할 때 사용한다.

AND, OR, NOT 사용하기

1
2
3
4
5
6
If Cells(1, "A").Value="" and Cells(1, "B").Value = "" Then
End If
If Cells(1, "A").Value="" or Cells(1, "B").Value = "" Then
End If
If Cells(1, "A").Value="" not Cells(1, "B").Value = "" Then
End If

반복문 사용해서 출력하기

1
2
3
4
5
6
	' 생략 ..
	Dim counter
	For counter = 1 To 10
		Cells(counter, "A") = counter
	Next For
	' 생략 ..
  1. A1부터 A10셀까지 counter의 값을 넣는다. 왠만한 VBS 스크립트는 If문과 For문으로 구현이 가능하다, 하지만 비효율적인 코드가 될 우려가 있다. 예를들어 A1부터 수직으로 데이터가 입력되어있을때 이 데이터들의 갯수를 파악할 때. image 위부터 아래로 For문을 100회 반복하여도 되지만 이 경우에는 아래와 같은 코드가 효율적이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
	' 생략..
	Dim 총데이터
	Dim counter
	
	총데이터 = 0
	counter = 5
	
	Do Until Cells(counter, "C").Value = "" 
		counter = counter + 1
		총데이터 = 총데이터 + 1	
	Loop
	' 이런식으로 변수를 두개 선언해도 좋고, 총 데이터 대신 counter에서 -5를 하여 메모리 소모를 줄여도 된다.
	' 생략 ..

이 글의 저작권은 Attribution-NonCommercial 4.0 International 라이센스를 따릅니다. Attribution-NonCommercial 4.0 International