[VBA]내 코드에서 엑셀 함수를 불러 사용하는 방법

엑셀 함수(정확히는 워크시트 함수)에는 분야별로 많은 함수들이 내장되어 있다. 통계, 공학, 재무, 수학/삼각, 논리 등등 많이 있다. 이것을 내 VBA코드에서 활용할 방법은 없을까?

1) VBA 코드 안에서 풍부한 워크시트 함수를 호출하는 방법
[vb]Application.WorksheetFunction.워크시트함수명(범위)[/vb]

2) A열 전체 중에서 가장 큰 값을 B1에 읽어오기
[vb]Range(“B1”)= Application.WorksheetFunction.Max(Range(“A:A”))[/vb]

3) A열 전체 중에서 가장 큰 값을 가진 셀을 활성화하기
[vb]Range(“A:A”).Find(Application.WorksheetFunction.Max(Range(“A:A”))).Activate[/vb]

[VBA]VBA 함수들

VBA함수를 정리해놓은 사이트가 있어서 소개한다. 이들 사이트에서 복사한 다음, 출처를 표기할까 하는 생각을 좀 했다. 그러나, 개인적으로 누가 원저자인지를 모르겠어서 그냥 주소만 여기에 옮겨놓는다.

 

http://www.cancould.com.ne.kr/hamsu.htm

http://pmguda.com/464

http://skql.tistory.com/127

비주얼 베이직 함수라고 하는데, VBA 함수가 더 정확한 표현인 것 같다.

DoEvents함수를 효과적으로 사용하기

DoEvents함수는 CPU-intensive code를 예방하는 방법 중의 하나이다.
수치해석과 같이 CPU계산량이 많은 응용프로그램일 경우, 계산에만 몰두하느라 다른 응용프로그램을 사용할 수 없게 된다. 해당 프로그램도 응답이 없어 마치 죽은(?) 듯한 반응을 보인다. 이를 방지하기 위해서 다른 응용 프로그램에도 CPU사용을 허락하는 것이 DoEvents함수이다.
이렇듯 좋은 취지의 함수이지만, 이 함수를 남발할 경우 오히려 계산속도가 현저히 떨어지는 상황을 맞이할 수 있다. 그럼 어떻게 할 것인가?

1)DLL 함수 선언

Public Declare Function GetInputState Lib "user32" () As Int32

2)함수 사용

If Not GetInputState() = 0 Then Application.DoEvents()

이렇게 하면 입력값이 있을 때만, DoEvents 함수를 호출한다.
그냥 DoEvents함수를 사용하는 경우보다 계산속도가 빠르다.

문자열을 읽어서 단어로 나누어 주는 함수 짜기

입력받은 문자열을 쉼표와 빈칸에 따라 단어를 나누어 준다.

Function GetWords(ByVal TextLine As String, ByVal ParamArray Separators() As Char) As String()
'
' 입력받은 문자열을 쉼표와 빈칸에 따라 단어를 나누어 준다.
' divide character string into separate words according to period and blank space.
'
'Revision History
'  Written by Yong-Yee Kim, 2005/11/25
'
Dim MySeparators() As Char = {","c, ":"c, "|"c, ";"c, """"c, "'"c} '기본 구분자 = 쉼표, 콜론, 파이프, 세미콜론, 큰따옴표, 작은따옴표
Dim Words() As String = {}
'
'1)문자열 시작과 끝의 공백을 제거한다.
TextLine = TextLine.Trim()
'
'2)문자열을 구분자(쉼표)를 통하여 분할한다.
If Separators.Length > 0 Then
MySeparators = Separators
End If
Dim Tokens() As String = TextLine.Split(MySeparators)

'
'3)얼마나 많은 단어가 존재하는가?
Dim nums As Integer = 0
For i As Integer = 0 To Tokens.Length - 1
If Tokens(i).Trim.Length > 0 Then '빈 문자열의 단어는 제외시킴
nums += 1
End If
Next i
'
'4)단어수만큼 배열을 할당
ReDim Words(nums - 1)
'
'5)단어를 반환한다.
Dim WordCount As Integer = 0
For j As Integer = 0 To Tokens.Length - 1
If Tokens(j).Trim.Length > 0 Then
Words(WordCount) = Tokens(j).Trim
WordCount += 1
End If
Next j
'
Return Words
End Function

여기서 3)과 5)가 많이 비슷하고 중복된 것으로 느낄 것이다.
그래서 어느 한 쪽을 지워버리면 어떤 일이 생길까?
시간이 되시면 한 번씩 해보면 좋을 것 같다.
결론부터 말하자면, 빈 문자열도 하나의 단어처럼 취급될 수 있다.
즉, 원하는 결과를 제대로 얻을 수 없다.

[사용법]

Dim Words() As String = Getwords("김창선, 4", ",") '문자열을 쉼표로 구분하라
'Words(0) 의 내용은 "김창선"
'Words(1)의 내용은 "4"