'엑셀 vba 기초'에 해당하는 글 8건

이번 강의에서는 Split 함수 사용법을 배워보겠습니다.

 

Split함수는 문자열을 쉼표(,)나 스페이스바( ) 등의 구분자로 나눠주는 유용한 함수입니다.

 

예를 들어 "Python,Java,C++" 라는 문자열을 Python과 Java, C++ 3개의 문자열로 나눌 때 이용하는 함수가 Split입니다.

 

기본적인 사용방법은 Split(문자열, 구분자)를 사용하면 구분자를 통해 나눠진 문자열 배열을 반환해 줍니다.

 

아래 예제를 통해 더 자세히 살펴보겠습니다.

 

Sub Macro()
    Dim str As String
    Dim result As Variant
    
    str = "Python,Java,C++"
    result = Split(str, ",")
    MsgBox result(1)
End Sub

매크로 실행 결과

Split(str, ",")을 통해 "Python,Java,C++"이 3개의 문자열로 나뉘어 result 변수에 3 크기의 배열로 들어갔습니다.

 

배열의 인덱스는 0부터 시작하므로 result(0)에는 "Python"이 result(1)에는 "Java"가, result(2)에는 "C++"이 들어가게 됩니다.

 

위의 매크로는 result 배열의 두번째 값인 Java를 MsgBox에 띄운 것입니다.

 

구분자로는 아무 문자열이나 사용할 수 있습니다. 여기서 꿀팁은 줄바꿈도 구분자로 사용할 수 있습니다.

 

엑셀에서는 보통 alt+Enter를 누르면 셀 내에서 줄바꿈을 하여 값을 입력할 수 있습니다.

 

vba코드에서 줄바꿈을 구분자로 사용하기 위해서는 Chr(10)을 이용합니다.

 

Chr 함수는 입력 숫자가 아스키코드에서 일치하는 문자로 변환시켜 줍니다. 아스키코드 10의 값은 NL(new line) 즉, 줄바꿈을 의미합니다.

 

아래 예제를 통해 더 자세히 알아봅시다.

 

Sub Macro()
    Dim result As Variant
    result = Split(Cells(1,1).value, Chr(10))
    Cells(2,1).value = result(0)
    Cells(3,1).value = result(1)
    Cells(4,1).value = result(2)
End Sub

매크로 실행 결과

줄바꿈도 구분자로써 잘 작동한다는 것을 볼 수 있습니다.

 

이것으로 Split함수 사용법 강의를 마치겠습니다.


WRITTEN BY
컴공학도

,

본 강의에서는 엑셀 vba에서 셀을 오름차순 또는 내림차순으로 정렬하는 법을 다루겠습니다.

 

일단 기본적으로 Sort라는 함수를 사용합니다.

 

Sort의 인자로는 기본적으로 Key와 Order가 있습니다.

 

Key는 말 그대로 정렬의 기준을 정하는 것이고 값은 Cell 또는 Range 등이 들어갈 수 있습니다.

 

Order는 오름차순 또는 내림차순을 정할 수 있습니다. 오름차순은 "xlAscending", 내림차순은 "xlDescending" 입니다.

 

아래 예제를 통해 더 자세히 알아보겠습니다.

 

Sub Macro()
	Range("A1:A9").Sort Key1:=Cells(1,1), Order1:=xlAscending
End Sub

Key1값을 1행1열로 하였고 정렬은 오름차순인 xlAscending으로 설정하여 실행한 결과입니다.

 

Cells(1,1)이 아니라 Range("A1")으로 하여도 무방합니다.

 

여기서 Key의 변수 이름이 Key1로 뒤에 숫자가 붙는 이유는 Key값과 Order의 값은 3개까지 가능하며 Key1, Key2, Key3 로 사용할 수 있습니다. Order도 동일합니다.

 

아래 예제를 통해 여러개의 키의 값으로 정렬한걸 보여드리겠습니다.

 

Sub macro2()
	Range("A1:B20").Sort Key1:=Range("B1"), Order1:=xlAscending, Key2:=Range("A1"), Order2:=xlDescending
End Sub

우선 Range("A1:B20")으로 두개의 열을 포함시켜 줍니다. 이럴경우 한 개의 열을 기준으로 정렬하면 다른 열의 값들도 따라오게 됩니다.

 

첫번째 정렬기준은 알파벳 오름차순이고, 두번째 기준을 숫자의 내림차순입니다.

 

먼저 첫번째 기준대로 알파벳 오름차순이 된 후에, 같은 알파벳을 가진 범위안에서 숫자 내림차순이 됩니다.

 

이렇듯 여러개의 기준으로 정렬을 할 수 있습니다.

 

이것으로 Sort함수 사용법을 마치겠습니다.


WRITTEN BY
컴공학도

,

엑셀에는 Sub 프로시저만이 아니라 Function 프로시저도 존재합니다.

 

Sub는 단순히 어떤 동작을 시행할 뿐이지만, Function는 Sub처럼 동작을 시행한 후 결과값을 반환하게 됩니다.

 

우리가 엑셀에서 많이 쓰는 =SUM(A1,A2)도 Function이라 할 수 있습니다.

 

사용법은 아래에 아주 간단한 예제를 통해 보여드리겠습니다.

 

Function test(num As Integer)
	test = num + 3
End Function

 

정수형 값을 하나 받아 3을 더한 뒤 반환하는 함수입니다.

 

반환하는 방법은

 

함수이름 = 반환값

 

입니다. 위의 예제에서는 t가 함수이름, num + 3 이 반환값입니다.

 

이 함수를 사용하는 방법은 두가지 있습니다.

 

1. 다른 프로시저에서 부르는 법

 

Sub callTest()
	Dim give, take As Integer
	give = 1
	take = test(give)
End Sub

위의 예제에서는 take라는 변수의 값에 test(give)의 반환값인 4가 들어오게 됩니다.

 

2. 셀에서 부르는 법

 

우리가 보통 엑셀 함수라고 하면 셀에 입력하는 =SUM() 또는 =AVERAGE() 를 떠올리실 겁니다. 이들은 엑셀의 기본 내장 함수로써 이미 Function SUM() 이나 Function AVERAGE() 같이 정의되어 있습니다.

 

우리가 만든 함수도 이와 같은 방식으로 쓸 수 있습니다.

 

=test(A1)을 입력하면 A1의 값인 4에 3을 더해 7이 된 것을 볼 수 있습니다.

 

위와 같은 방식들을 사용하여 Function을 통해 많은 기능을 직접 만들 수 있습니다.

 

Function의 괄호() 안에 들어가는 인수(argument)들도 여러방식으로 받을 수 있습니다.

 

Function test() 처럼 인수가 아예 없어도 되고,

Function test(a,b,c,d) 처럼 뒤에 As Integer 를 붙이지 않아도 됩니다. (이럴경우 컴퓨터가 자동적으로 변수의 타입을 정해야 하기 때문에 시행 속도가 아주아주 약간 느려질 수 있습니다.)

 

Function test(a,b, Optional c = 0, Optional d = 1) 처럼 변수 앞에 Optional 을 붙여 선택적으로 인수를 줄 수 있습니다.

 

아래의 예제를 통해 더 자세히 알아봅시다.

 

Sub callTest()
	Dim num1, num2, result As Integer
    num1 = 1
    num2 = 2
	result = test(num1, num2)
    MsgBox result
End Sub

Function test(a, b, Optional c = 3)
	Dim d As Integer
	d = a + b + c
	test = d
End Function

 

callTest()의 실행값

 

test 함수에서 받는 인자는 a, ,b, c로 3개이지만 callTest에서 test 함수를 부를 때에는 num1 과 num2, 2개의 인자만 넘겨주었음에도 오류가 뜨지 않습니다.

 

이는 인자 c의 성질이 Optional로써 필수적으로 받아야하는 인자가 아니기 때문입니다.

 

인자를 넘겨준다면 그 인자의 값대로 설정이 되겠지만, 위의 예제처럼 인자를 넘겨주지 않는다면 기본값인 3이 됩니다.

 

여기서 주의할 점은 Optional 설정의 변수는 가장 오른쪽에 와야됩니다.

 

Function test(Optional a, b, c) 이런 식으로 왼쪽에 위치하게 되면 오류가 뜨게 됩니다.

 

Optional 성질의 인자를 여러개 생성할 수 있지만 배열을 이용해 무한대로 생성할 수도 있습니다. 이는 전달할 변수의 개수가 미정일 때 이용합니다.

 

Function test(ParamArray list()) 식으로 ParamArray설정을 이용합니다.

 

Sub Main()
	Dim result As Integer
	result = sum(1,2,3,4,5,6,7,8,9,10)
	MsgBox result
End Sub

Function sum(ParamArray nums())
	Dim temp As Integer
	temp = 0
    
	For Each num in nums
		temp = temp + num
	Next num
    
	sum = temp
End Function

 

Main()의 실행값

숫자 1부터 10까지 인수로 주었을 때, sum 함수의 num() 배열에 들어가게 됩니다.

 

그 후 For 반복문에서 차례차례 더한 후 반환하게 됩니다.

 

이상으로 Function 사용법을 마치겠습니다.


WRITTEN BY
컴공학도

,

Sleep(x)

 

시간 지연은 반복문 실행시 너무 빠르게 지나가 진행 과정을 볼 수 없거나,

엑셀을 통한 시각적 효과(게임 등)를 만들 때 사용합니다.

 

여러가지 방법이 있지만 필자는 가장 편한 Sleep(x) 함수를 사용합니다. (x는 1000분의 1초)

 

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Macro()
      For i=5 To 0 Step -1
            Cells(1,1).value = i
            Sleep(1000)
      Next i
End Sub

위의 예제는 3초의 시간을 재는 매크로입니다.

 

첫번째 줄의 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 은 Sleep함수를 쓰기위해 필요한 코드입니다.

 

Sleep()함수는 Cells()나 Range()같은 vba의 기본 내장함수가 아닙니다.

 

따라서 내가 Sleep함수를 쓰겠다~ 하고 선언을 해 주어야 쓸 수 있습니다. 

 

구체적으로는 살펴보면 "kernel32"라는 라이브러리(Lib)에서 Sleep이라는 함수를 Private형식(다른 모듈에서는 사용할 수 없는 선언방법)으로 선언한다는 것입니다. ByVal dwMilliseconds As Long은 Sleep함수를 쓰기 위해 넘겨주어야 하는 dwMilliseconds라는 이름의 인자입니다. 위의 코드에서는 1000이 됩니다.

 

일반적인 사무용도의 엑셀 매크로를 만들겠다고 하시는 분들은 Sleep함수가 그닥 필요가 없을 수 있습니다.

하지만 엑셀 매크로로 사무용도 이외의 알고리즘 구현 연습을 할 때에는 알고리즘의 작동 과정을 눈으로 볼 수 있고, 간단한 미니게임을 만들 때에는 게임화면에 시각적 효과를 줄 수 있습니다.

 

아래에는 필자가 만든 미로만들기 알고리즘에서 미로가 만들어지는 과정을 자세히 보기위해 Sleep함수를 사용한 예입니다.

Sleep함수를 쓰지 않았을 때

Sleep함수를 쓰지 않아 컴퓨터의 빠른 연산속도 때문에 미로가 만들어지는 과정을 볼 수가 없습니다.

Sleep함수를 썼을 때

하지만 Sleep함수를 쓴다면 미로가 만들어지는 과정을 볼 수 있어서 알고리즘에 오류가 있을 경우 찾기 쉽습니다.

 

이것으로 엑셀 vba시간지연(딜레이)넣는 법을 마치겠습니다.


WRITTEN BY
컴공학도

,