Ver3.5 ๐ง ์์ ์ฌ์ฉ์ ์ ์ ํจ์(UDF)์ ์ ๋์ธ(Add-in) ๊ฐ๋ฐ ์ค์ ๊ฐ์ด๋

๐ง ์์ ์ฌ์ฉ์ ์ ์ ํจ์(UDF)์ ์ ๋์ธ(Add-in) ๊ฐ๋ฐ ์ค์ ๊ฐ์ด๋
VBA๋ก ๋๋ง์ ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ ๋์ธ์ผ๋ก ๋ฐฐํฌ๊น์ง! ์์ ์ ์ง์ง ๋ด ๋๊ตฌ๋ก ๋ง๋๋ ๋ฒ ๐
์ผ, ์์งํ ๋งํด๋ด. ์์
์ฐ๋ค๊ฐ "์ ์ด๋ฐ ํจ์ ์์ผ๋ฉด ์ผ๋ง๋ ์ข์๊น..." ๋ผ๊ณ ์๊ฐํด๋ณธ ์ ์์ด? ๐
SUM, VLOOKUP, IF... ๊ธฐ๋ณธ ํจ์๋ค์ ํ๋ฅญํ์ง๋ง, ์
๋ฌด๋ง๋ค ๋ฑ ๋ง๋ ํจ์๊ฐ ์์ด์ ๋ณต์กํ ์์์ ๋ช ์ค์ฉ ์์๋ณธ ๊ฒฝํ, ๋ค๋ค ์์์.
๊ทธ๋ฐ๋ฐ ์์์, ์์
์๋ ์ฌ์ฉ์ ์ ์ ํจ์(UDF, User Defined Function)๋ผ๋ ๊ฒ ์์ด. ๋ง ๊ทธ๋๋ก ๋ด๊ฐ ์ง์ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ! ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ ํ ๋ฐ ๋ ๋์๊ฐ์ ์ ๋์ธ(Add-in)์ผ๋ก ๋ง๋ค๋ฉด, ์ด๋ค ์์
ํ์ผ์์๋ ๋ด ํจ์๋ฅผ ์ธ ์ ์๊ฒ ๋ผ.
์ด ๊ธ์์๋ VBA๋ฅผ ์ด์ฉํด์ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ๋ถํฐ, ๊ทธ๊ฑธ ์ ๋์ธ์ผ๋ก ํจํค์งํด์ ๋ฐฐํฌํ๋ ๊ฒ๊น์ง ์ฒ์๋ถํฐ ๋๊น์ง ์ค์ ์์ฃผ๋ก ๋ค๋ค๋ณผ ๊ฑฐ์ผ. ์ฝ๋ฉ ๊ฒฝํ์ด ๋ง์ง ์์๋ ๊ด์ฐฎ์. ๊ฐ์ด ์ฐจ๊ทผ์ฐจ๊ทผ ํด๋ณด์! ๐ช
1. VBA ํธ์ง๊ธฐ ์ด๊ธฐ & ๊ธฐ๋ณธ ์ธํ ๐ ๏ธ
์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋จผ์ VBA ํธ์ง๊ธฐ(Visual Basic for Applications Editor)์ ์ ๊ทผํด์ผ ํด. ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํด!
ํ์ผ โ ์ต์ โ ๋ฆฌ๋ณธ ์ฌ์ฉ์ ์ง์ โ '๊ฐ๋ฐ ๋๊ตฌ' ์ฒดํฌ๋ฐ์ค ํ์ฑํ
๊ฐ๋ฐ ๋๊ตฌ ํญ โ Visual Basic ํด๋ฆญ (๋๋ ๋จ์ถํค Alt + F11)
VBA ํธ์ง๊ธฐ์์ ์ฝ์ (Insert) โ ๋ชจ๋(Module) ํด๋ฆญ โ ์ ๋ชจ๋ ์ฐฝ์ด ์ด๋ฆผ
VBA ํธ์ง๊ธฐ๊ฐ ์ด๋ฆฌ๋ฉด ์ผ์ชฝ์ ํ๋ก์ ํธ ํ์๊ธฐ๊ฐ ๋ณด์ด๊ณ , ์ค๋ฅธ์ชฝ์ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ ์ฝ๋ ์ฐฝ์ด ์์ด. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ํจ์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ผ.
์ค์ํ ๊ฑด ๋ชจ๋(Module)์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ๊ฒ! Sheet1์ด๋ ThisWorkbook์ ์์ฑํ๋ฉด UDF๋ก ๋์ํ์ง ์์. ๋ฐ๋์ ์ผ๋ฐ ๋ชจ๋์ ์์ฑํด์ผ ํด.
2. ์ฌ์ฉ์ ์ ์ ํจ์(UDF) ๊ธฐ๋ณธ ๊ตฌ์กฐ ๐
VBA์์ ํจ์๋ฅผ ๋ง๋๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ์ด๋ ๊ฒ ์๊ฒผ์ด:
Function ํจ์์ด๋ฆ(๋งค๊ฐ๋ณ์1 As ๋ฐ์ดํฐํ์
, ๋งค๊ฐ๋ณ์2 As ๋ฐ์ดํฐํ์
) As ๋ฐํํ์
' ์ฌ๊ธฐ์ ๋ก์ง ์์ฑ
ํจ์์ด๋ฆ = ๊ฒฐ๊ณผ๊ฐ ' ์ด ์ค์ด ๋ฐํ๊ฐ์ ์ง์ ํ๋ ๋ถ๋ถ!
End Function
Sub์ Function์ ์ฐจ์ด๊ฐ ๋ญ๋๊ณ ? ํต์ฌ ์ฐจ์ด๋ ์ด๊ฑฐ์ผ:
| ๊ตฌ๋ถ | Sub ํ๋ก์์ | Function ํ๋ก์์ |
|---|---|---|
| ๋ฐํ๊ฐ | ์์ | ์์ (๊ฐ์ ๋๋ ค์ค) |
| ์ ์์ ํธ์ถ | โ ๋ถ๊ฐ | โ ๊ฐ๋ฅ |
| ์ฉ๋ | ๋งคํฌ๋ก, ์๋ํ ์์ | ์ฌ์ฉ์ ์ ์ ํจ์(UDF) |
| ์์ | Sub ๋ฐ์ดํฐ์ ๋ฆฌ() | Function ์ธ๊ธ๊ณ์ฐ(๊ธ์ก) |
UDF๋ ๋ฐ๋์ Function์ผ๋ก ์์ํด์ผ ํ๊ณ , ํจ์ ์ด๋ฆ์ ๊ฒฐ๊ณผ๊ฐ์ ๋์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฐํ๊ฐ์ ์ง์ ํด. ์ด๊ฒ ์ฒ์์ ์ข ๋ฏ์ค ์ ์๋๋ฐ, ๋ช ๋ฒ ์จ๋ณด๋ฉด ๊ธ๋ฐฉ ์ต์ํด์ ธ!
๐ ์ฒซ ๋ฒ์งธ UDF: ๋ถ๊ฐ์ธ ๊ณ์ฐ ํจ์
๊ฐ์ฅ ๊ฐ๋จํ ์์ ๋ถํฐ ์์ํด๋ณด์. ๊ธ์ก์ ์ ๋ ฅํ๋ฉด ๋ถ๊ฐ์ธ(10%)๋ฅผ ํฌํจํ ๊ธ์ก์ ๋ฐํํ๋ ํจ์์ผ:
Function ๋ถ๊ฐ์ธํฌํจ(๊ธ์ก As Double) As Double
๋ถ๊ฐ์ธํฌํจ = ๊ธ์ก * 1.1
End Function
์ด๊ฑธ ๋ชจ๋์ ์
๋ ฅํ๊ณ ์์
์
๋ก ๋์๊ฐ์ =๋ถ๊ฐ์ธํฌํจ(A1)์ด๋ผ๊ณ ์
๋ ฅํ๋ฉด A1 ์
๊ฐ์ 110%๊ฐ ๋ฐํ๋ผ. ์ง์ง์ผ! ๐
ํจ์ ์ด๋ฆ์ ํ๊ธ๋ก ์จ๋ ์์ ํ ๋์ํด. ๋ค๋ง ์๋ฌธ ์ด๋ฆ์ ์ฐ๋ ๊ฒ ๋์ค์ ์ ๋์ธ ๋ฐฐํฌํ ๋ ํธํ์ฑ ๋ฉด์์ ๋ ์์ ํ๊ธด ํด.
๐ ๋ฐ์ดํฐ ํ์ ์ข ๋ฅ
VBA์์ ์์ฃผ ์ฐ๋ ๋ฐ์ดํฐ ํ์ ๋ค์ด์ผ. ์์๋๋ฉด ์ฝ๋ ์์ฑ์ด ํจ์ฌ ์์ํด:
| ํ์ | ์ค๋ช | ์์ |
|---|---|---|
Long |
์ ์ (ํฐ ์) | 1, 100, -50 |
Double |
์ค์ (์์์ ํฌํจ) | 3.14, 1.5 |
String |
๋ฌธ์์ด | "์๋ ", "ABC" |
Boolean |
์ฐธ/๊ฑฐ์ง | True, False |
Variant |
๋ชจ๋ ํ์ ํ์ฉ | ๋ญ๋ OK |
Range |
์ ๋ฒ์ | A1:C10 ๊ฐ์ ๋ฒ์ |
3. ์ค์ UDF ์์ ๋ชจ์ ๐ผ
์ด๋ก ์ ์ถฉ๋ถํด! ์ด์ ์ค์ ๋ก ์ ๋ฌด์์ ๋ฐ๋ก ์ธ ์ ์๋ UDF๋ค์ ๋ง๋ค์ด๋ณด์. ๊ฐ ์์ ๋ง๋ค ์ฝ๋์ ์ฌ์ฉ๋ฒ์ ๊ฐ์ด ์ค๋ช ํ ๊ฒ.
๐ ์์ 1: ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๋ก ๋์ด ๊ณ์ฐ
์ฃผ๋ฏผ๋ฒํธ ์ 6์๋ฆฌ์์ ์๋ ์์ผ์ ์ถ์ถํด์ ํ์ฌ ๋์ด๋ฅผ ๊ณ์ฐํ๋ ํจ์์ผ. ์ค๋ฌด์์ ์ง์ง ๋ง์ด ์ฐ์ฌ!
Function ๋์ด๊ณ์ฐ(์ฃผ๋ฏผ๋ฒํธ As String) As Integer
Dim ์๋
As Integer
Dim ์์ As Integer
Dim ์์ผ As Integer
Dim ํ์ฌ๋
๋ As Integer
' ์ฃผ๋ฏผ๋ฒํธ ์ 6์๋ฆฌ์์ ์ถ์ถ
์๋
= CInt(Left(์ฃผ๋ฏผ๋ฒํธ, 2))
์์ = CInt(Mid(์ฃผ๋ฏผ๋ฒํธ, 3, 2))
์์ผ = CInt(Mid(์ฃผ๋ฏผ๋ฒํธ, 5, 2))
' 2000๋
๋์ vs 1900๋
๋์ ๊ตฌ๋ถ (7๋ฒ์งธ ์๋ฆฌ๋ก)
If Len(์ฃผ๋ฏผ๋ฒํธ) >= 7 Then
Dim ์ฑ๋ณ์ฝ๋ As Integer
์ฑ๋ณ์ฝ๋ = CInt(Mid(์ฃผ๋ฏผ๋ฒํธ, 7, 1))
If ์ฑ๋ณ์ฝ๋ >= 3 Then
์๋
= 2000 + ์๋
Else
์๋
= 1900 + ์๋
End If
End If
ํ์ฌ๋
๋ = Year(Now())
๋์ด๊ณ์ฐ = ํ์ฌ๋
๋ - ์๋
' ์์ผ์ด ์์ง ์ ์ง๋ฌ์ผ๋ฉด 1 ๋นผ๊ธฐ
If Month(Now()) < ์์ Then
๋์ด๊ณ์ฐ = ๋์ด๊ณ์ฐ - 1
ElseIf Month(Now()) = ์์ And Day(Now()) < ์์ผ Then
๋์ด๊ณ์ฐ = ๋์ด๊ณ์ฐ - 1
End If
End Function
์ฌ์ฉ๋ฒ: =๋์ด๊ณ์ฐ(A1) (A1์ ์ฃผ๋ฏผ๋ฒํธ๊ฐ ์์ ๋)
๐ ์์ 2: ์ ์์ ์ฝ๋ ๋ฐํ
์ ์ ๋ฐฐ๊ฒฝ์ RGB ์ฝ๋๋ฅผ ๋ฐํํ๋ ํจ์์ผ. ์์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ ๋ ์ ์ฉํด!
Function ๋ฐฐ๊ฒฝ์์ฝ๋(์
As Range) As Long
๋ฐฐ๊ฒฝ์์ฝ๋ = ์
.Interior.Color
End Function
Function ๋ฐฐ๊ฒฝ์RGB(์
As Range) As String
Dim ์์ฝ๋ As Long
์์ฝ๋ = ์
.Interior.Color
' RGB ๋ถ๋ฆฌ
Dim R As Integer, G As Integer, B As Integer
R = ์์ฝ๋ Mod 256
G = (์์ฝ๋ \ 256) Mod 256
B = (์์ฝ๋ \ 65536) Mod 256
๋ฐฐ๊ฒฝ์RGB = "R:" & R & " G:" & G & " B:" & B
End Function
๐ ์์ 3: ํ๊ธ ์์/๋ชจ์ ๋ถ๋ฆฌ (์ด์ฑ ์ถ์ถ)
ํ๊ธ ํ ์คํธ์์ ์ด์ฑ๋ง ์ถ์ถํ๋ ํจ์์ผ. ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํํ ๋ ์ง์ง ์ ์ฉํด!
Function ์ด์ฑ์ถ์ถ(ํ
์คํธ As String) As String
Dim ๊ฒฐ๊ณผ As String
Dim i As Integer
Dim ์ฝ๋ As Long
Dim ์ด์ฑ๋ชฉ๋ก As String
์ด์ฑ๋ชฉ๋ก = "ใฑใฒใดใทใธในใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
"
๊ฒฐ๊ณผ = ""
For i = 1 To Len(ํ
์คํธ)
์ฝ๋ = AscW(Mid(ํ
์คํธ, i, 1))
' ํ๊ธ ๋ฒ์ ์ฒดํฌ (๊ฐ=44032, ํฃ=55203)
If ์ฝ๋ >= 44032 And ์ฝ๋ <= 55203 Then
Dim ์ด์ฑ์ธ๋ฑ์ค As Integer
์ด์ฑ์ธ๋ฑ์ค = Int((์ฝ๋ - 44032) / 588)
๊ฒฐ๊ณผ = ๊ฒฐ๊ณผ & Mid(์ด์ฑ๋ชฉ๋ก, ์ด์ฑ์ธ๋ฑ์ค + 1, 1)
Else
๊ฒฐ๊ณผ = ๊ฒฐ๊ณผ & Mid(ํ
์คํธ, i, 1)
End If
Next i
์ด์ฑ์ถ์ถ = ๊ฒฐ๊ณผ
End Function
์ฌ์ฉ๋ฒ: =์ด์ฑ์ถ์ถ("๋ํ๋ฏผ๊ตญ") โ "ใทใ
ใ
ใฑ" ๋ฐํ!
๐ ์์ 4: ๋ฒ์ ๋ด ์์๋ณ ํฉ๊ณ
ํน์ ๋ฐฐ๊ฒฝ์์ ๊ฐ์ง ์ ๋ค์ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ํจ์์ผ. ์์์ผ๋ก ๊ตฌ๋ถ๋ ๋ฐ์ดํฐ ์ง๊ณํ ๋ ์ต๊ณ ์ผ!
Function ์์ํฉ๊ณ(๋ฒ์ As Range, ๊ธฐ์ค์
As Range) As Double
Dim ์
As Range
Dim ๊ธฐ์ค์ As Long
Dim ํฉ๊ณ As Double
๊ธฐ์ค์ = ๊ธฐ์ค์
.Interior.Color
ํฉ๊ณ = 0
For Each ์
In ๋ฒ์
If ์
.Interior.Color = ๊ธฐ์ค์ Then
If IsNumeric(์
.Value) Then
ํฉ๊ณ = ํฉ๊ณ + ์
.Value
End If
End If
Next ์
์์ํฉ๊ณ = ํฉ๊ณ
End Function
์ฌ์ฉ๋ฒ: =์์ํฉ๊ณ(A1:A100, C1) (C1 ์
๊ณผ ๊ฐ์ ์์์ธ ์
๋ค์ ํฉ๊ณ)
๐ ์์ 5: ๋ค์ค ์กฐ๊ฑด ํ ์คํธ ํฉ์น๊ธฐ
TEXTJOIN์ ๊ฐํ ๋ฒ์ ! ์กฐ๊ฑด์ ๋ง๋ ์ ๋ค๋ง ๊ณจ๋ผ์ ํฉ์น๋ ํจ์์ผ:
Function ์กฐ๊ฑดํ
์คํธํฉ์น๊ธฐ(๋ฒ์ As Range, ๊ตฌ๋ถ์ As String, _
์กฐ๊ฑด๋ฒ์ As Range, ์กฐ๊ฑด๊ฐ As Variant) As String
Dim ์
As Range
Dim ๊ฒฐ๊ณผ As String
Dim i As Long
๊ฒฐ๊ณผ = ""
i = 1
For Each ์
In ๋ฒ์
If ์กฐ๊ฑด๋ฒ์.Cells(i, 1).Value = ์กฐ๊ฑด๊ฐ Then
If ๊ฒฐ๊ณผ <> "" Then ๊ฒฐ๊ณผ = ๊ฒฐ๊ณผ & ๊ตฌ๋ถ์
๊ฒฐ๊ณผ = ๊ฒฐ๊ณผ & ์
.Value
End If
i = i + 1
Next ์
์กฐ๊ฑดํ
์คํธํฉ์น๊ธฐ = ๊ฒฐ๊ณผ
End Function
Application.ScreenUpdating = False์ Application.Calculation = xlCalculationManual์ ์ถ๊ฐํ๋ฉด ์๋๊ฐ ํจ์ฌ ๋นจ๋ผ์ ธ!
4. ๊ณ ๊ธ UDF ๊ธฐ๋ฒ โ ์ด๊ฑธ ์๋ฉด ์ง์ง ํ๋ก! ๐ฏ
๐ฅ ์ ํ์ ๋งค๊ฐ๋ณ์ (Optional)
์์
๋ด์ฅ ํจ์์ฒ๋ผ ์ผ๋ถ ์ธ์๋ฅผ ์๋ต ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ด. Optional ํค์๋๋ฅผ ์ฐ๋ฉด ๋ผ!
Function ๋ฐ์ฌ๋ฆผํ๋ฌ์ค(์ซ์ As Double, Optional ์๋ฆฟ์ As Integer = 0, _
Optional ๋ฐฉํฅ As String = "๋ฐ์ฌ๋ฆผ") As Double
Select Case ๋ฐฉํฅ
Case "์ฌ๋ฆผ"
๋ฐ์ฌ๋ฆผํ๋ฌ์ค = Application.WorksheetFunction.RoundUp(์ซ์, ์๋ฆฟ์)
Case "๋ด๋ฆผ"
๋ฐ์ฌ๋ฆผํ๋ฌ์ค = Application.WorksheetFunction.RoundDown(์ซ์, ์๋ฆฟ์)
Case Else ' ๊ธฐ๋ณธ๊ฐ: ๋ฐ์ฌ๋ฆผ
๋ฐ์ฌ๋ฆผํ๋ฌ์ค = Application.WorksheetFunction.Round(์ซ์, ์๋ฆฟ์)
End Select
End Function
์ฌ์ฉ ์์:
=๋ฐ์ฌ๋ฆผํ๋ฌ์ค(3.567) โ 4 (๊ธฐ๋ณธ ๋ฐ์ฌ๋ฆผ, 0์๋ฆฌ)
=๋ฐ์ฌ๋ฆผํ๋ฌ์ค(3.567, 2) โ 3.57 (์์ 2์๋ฆฌ ๋ฐ์ฌ๋ฆผ)
=๋ฐ์ฌ๋ฆผํ๋ฌ์ค(3.567, 1, "์ฌ๋ฆผ") โ 3.6 (์์ 1์๋ฆฌ ์ฌ๋ฆผ)
๐ฅ ๋ฐฐ์ด ๋ฐํ UDF (๋์ ๋ฐฐ์ด)
Excel 365/2019 ์ด์์์๋ UDF๊ฐ ๋ฐฐ์ด์ ๋ฐํํด์ ์ฌ๋ฌ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฟ๋ฆด ์ ์์ด!
Function ๋ ์ง๋ฒ์์์ฑ(์์์ผ As Date, ์ข
๋ฃ์ผ As Date) As Variant
Dim ๋ ์ง์ As Long
Dim ๊ฒฐ๊ณผ() As Date
Dim i As Long
๋ ์ง์ = DateDiff("d", ์์์ผ, ์ข
๋ฃ์ผ) + 1
ReDim ๊ฒฐ๊ณผ(1 To ๋ ์ง์, 1 To 1)
For i = 1 To ๋ ์ง์
๊ฒฐ๊ณผ(i, 1) = ์์์ผ + (i - 1)
Next i
๋ ์ง๋ฒ์์์ฑ = ๊ฒฐ๊ณผ
End Function
์ด ํจ์๋ฅผ ์ ์ ์ ๋ ฅํ๋ฉด ์์์ผ๋ถํฐ ์ข ๋ฃ์ผ๊น์ง์ ๋ชจ๋ ๋ ์ง๊ฐ ์๋ ์ ๋ค์ ์๋์ผ๋ก ์ฑ์์ ธ! ๐คฉ
๐ฅ Application.WorksheetFunction ํ์ฉ
VBA ์์์ ์์ ๋ด์ฅ ํจ์๋ฅผ ๊ทธ๋๋ก ์ธ ์ ์์ด. ์ด๊ฑธ ํ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ ํจ์ฌ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ด:
Function ๊ฐ์คํ๊ท (๊ฐ๋ฒ์ As Range, ๊ฐ์ค์น๋ฒ์ As Range) As Double
' ์์
์ SUMPRODUCT์ SUM์ VBA์์ ์ง์ ํธ์ถ
Dim ๋ถ์ As Double
Dim ๋ถ๋ชจ As Double
๋ถ์ = Application.WorksheetFunction.SumProduct(๊ฐ๋ฒ์, ๊ฐ์ค์น๋ฒ์)
๋ถ๋ชจ = Application.WorksheetFunction.Sum(๊ฐ์ค์น๋ฒ์)
If ๋ถ๋ชจ = 0 Then
๊ฐ์คํ๊ท = 0
Else
๊ฐ์คํ๊ท = ๋ถ์ / ๋ถ๋ชจ
End If
End Function
๐ฅ ์๋ฌ ์ฒ๋ฆฌ (On Error)
UDF์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ #VALUE! ๊ฐ์ ์๋ฌ๊ฐ ํ์๋ผ. ์ด๊ฑธ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด์ผ:
Function ์์ ๋๋๊ธฐ(๋ถ์ As Double, ๋ถ๋ชจ As Double, _
Optional ์๋ฌ์๋ฐํ๊ฐ As Variant = 0) As Variant
On Error GoTo ์๋ฌ์ฒ๋ฆฌ
If ๋ถ๋ชจ = 0 Then
์์ ๋๋๊ธฐ = ์๋ฌ์๋ฐํ๊ฐ
Exit Function
End If
์์ ๋๋๊ธฐ = ๋ถ์ / ๋ถ๋ชจ
Exit Function
์๋ฌ์ฒ๋ฆฌ:
์์ ๋๋๊ธฐ = ์๋ฌ์๋ฐํ๊ฐ
End Function
On Error Resume Next๋ ์๋ฌ๋ฅผ ๋ฌด์ํ๊ณ ๋ค์ ์ค๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ด์ผ. ๊ฐ๋จํ ๊ฒฝ์ฐ์ ํธ๋ฆฌํ์ง๋ง, ์ค์ํ ์๋ฌ๋ฅผ ๋์น ์ ์์ผ๋ ์ฃผ์ํด์ ์จ์ผ ํด!
๐ฅ ํจ์ ์ค๋ช ์ถ๊ฐ (Application.MacroOptions)
๋ด์ฅ ํจ์์ฒ๋ผ ํจ์ ๋ง๋ฒ์ฌ์์ ์ค๋ช ์ด ๋์ค๊ฒ ํ ์ ์์ด! ์ด๊ฑฐ ์๋ฉด ์ง์ง ํ๋ก์ฒ๋ผ ๋ณด์ฌ ๐
' ์ด ์ฝ๋๋ ์ํฌ๋ถ์ด ์ด๋ฆด ๋ ์คํ๋๋๋ก ThisWorkbook์ ๋ฃ์ด์ผ ํด
Private Sub Workbook_Open()
Application.MacroOptions _
Macro:="๋ถ๊ฐ์ธํฌํจ", _
Description:="๊ธ์ก์ ๋ถ๊ฐ์ธ(10%)๋ฅผ ํฌํจํ ๊ธ์ก์ ๋ฐํํฉ๋๋ค.", _
Category:="์ฌ์ฉ์ ์ ์", _
ArgumentDescriptions:=Array("๋ถ๊ฐ์ธ๋ฅผ ๊ณ์ฐํ ๊ธ์ก์ ์
๋ ฅํ์ธ์.")
End Sub
์ด๋ ๊ฒ ํ๋ฉด ํจ์ ๋ง๋ฒ์ฌ(fx ๋ฒํผ)์์ ํจ์๋ฅผ ๊ฒ์ํ ๋ ์ค๋ช ์ด ํ์๋ผ. ํ์๋ค์ด ํจ์๋ฅผ ์ธ ๋ ํจ์ฌ ํธํด์ง์ง!
5. ์ ๋์ธ(Add-in) ๊ฐ๋ฐ โ ๋๋ง์ ์์ ํ์ฅํฉ ๋ง๋ค๊ธฐ ๐ฆ
UDF๋ฅผ ์ ๋ง๋ค์๋ค๋ฉด ์ด์ ๊ทธ๊ฑธ ์ ๋์ธ์ผ๋ก ๋ง๋ค ์ฐจ๋ก์ผ! ์ ๋์ธ์ผ๋ก ๋ง๋ค๋ฉด ์ด๋ค ์ ์ด ์ข๋๊ณ ?
์ด๋ค ์์ ํ์ผ์ ์ด์ด๋ ๋ด ํจ์๋ฅผ ๋ฐ๋ก ์ธ ์ ์์ด. ํ์ผ๋ง๋ค ์ฝ๋๋ฅผ ๋ณต์ฌํ ํ์ ์์!
VBA ์ฝ๋๋ฅผ ์จ๊ธฐ๊ณ ๋น๋ฐ๋ฒํธ๋ก ๋ณดํธํ ์ ์์ด. ์์คํ ๋ก์ง์ ์งํฌ ์ ์์ง!
.xlam ํ์ผ ํ๋๋ง ๋ฐฐํฌํ๋ฉด ํ ์ ์ฒด๊ฐ ๊ฐ์ ํจ์๋ฅผ ์ธ ์ ์์ด. ํ์คํ ์์ฑ!
๐ ์ ๋์ธ ๋ง๋๋ ๋จ๊ณ๋ณ ๊ฐ์ด๋
์ ์์ ํ์ผ์ ์ด๊ณ , VBA ํธ์ง๊ธฐ์์ ๋ชจ๋์ ์ฝ์ ํ ํ ๋ชจ๋ UDF ์ฝ๋๋ฅผ ์์ฑํด.
ํ์ผ โ ์ ๋ณด โ ์์ฑ โ ์ ๋ชฉ, ์์ฑ์, ์ค๋ช ๋ฑ์ ์ ๋ ฅํด. ์ ๋์ธ ๊ด๋ฆฌ์์์ ํ์๋ ์ ๋ณด์ผ.
ํ์ผ โ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ โ ํ์ผ ํ์์ "Excel ์ถ๊ฐ ๊ธฐ๋ฅ(*.xlam)"์ผ๋ก ์ ํ โ ์ ์ฅ!
ํ์ผ โ ์ต์ โ ์ถ๊ฐ ๊ธฐ๋ฅ โ ๊ด๋ฆฌ: Excel ์ถ๊ฐ ๊ธฐ๋ฅ โ ์ด๋ โ ์ฐพ์๋ณด๊ธฐ โ .xlam ํ์ผ ์ ํ โ ํ์ธ
์ ํตํฉ ๋ฌธ์๋ฅผ ์ด๊ณ ๋ด UDF๋ฅผ ์ ์ ์ ๋ ฅํด๋ด. ์ ์ ๋์ํ๋ฉด ์ฑ๊ณต! ๐
C:\Users\[์ฌ์ฉ์๋ช
]\AppData\Roaming\Microsoft\AddIns\์ผ. ์ด ํด๋์ ์ ์ฅํ๋ฉด ์ถ๊ฐ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ์๋์ผ๋ก ๋ํ๋!
๐ VBA ์ฝ๋ ๋ณดํธํ๊ธฐ
์ ๋์ธ์ ๋ฐฐํฌํ ๋ ์ฝ๋๋ฅผ ๋ณดํธํ๊ณ ์ถ๋ค๋ฉด:
6. ๋ฆฌ๋ณธ UI ์ปค์คํฐ๋ง์ด์ง โ ์ง์ง ํ๋ก ์ ๋์ธ ๋ง๋ค๊ธฐ ๐จ
์ ๋์ธ์ ์ปค์คํ
๋ฆฌ๋ณธ ํญ์ ์ถ๊ฐํ๋ฉด ์์ ํ ๋ค๋ฅธ ๋ ๋ฒจ์ด ๋ผ! ์ฌ์ฉ์๊ฐ ๋ฒํผ ํด๋ฆญ ํ ๋ฒ์ผ๋ก ๋งคํฌ๋ก๋ฅผ ์คํํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ์ธ ์ ์๊ฒ ๋๊ฑฐ๋ .
๋ฆฌ๋ณธ UI๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ค๋ฉด XML ๊ธฐ๋ฐ์ RibbonX๋ฅผ ์ฌ์ฉํด์ผ ํด. ์กฐ๊ธ ๋ณต์กํ์ง๋ง ํ ๋ฒ ๋ฐฐ์๋๋ฉด ์ง์ง ๊ฐ๋ ฅํด!
๐ ๏ธ Custom UI Editor ์ค์น
๋ฆฌ๋ณธ XML์ ํธ์งํ๋ ค๋ฉด Custom UI Editor for Microsoft Office ๋๊ตฌ๊ฐ ํ์ํด. ๋ง์ดํฌ๋ก์ํํธ ๊ณต์ ์ฌ์ดํธ๋ GitHub์์ ๋ฌด๋ฃ๋ก ๋ค์ด๋ฐ์ ์ ์์ด.
๐ ๊ธฐ๋ณธ ๋ฆฌ๋ณธ XML ๊ตฌ์กฐ
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="myTab" label="๋์ ๋๊ตฌ">
<group id="myGroup" label="์ฌ์ฉ์ ์ ์ ํจ์">
<button id="btn1"
label="๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ"
imageMso="CalculatorInsert"
size="large"
onAction="๋ฒํผ1ํด๋ฆญ"/>
<button id="btn2"
label="๋ฐ์ดํฐ ์ ๋ฆฌ"
imageMso="TableStylesGallery"
size="normal"
onAction="๋ฒํผ2ํด๋ฆญ"/>
<separator id="sep1"/>
<button id="btn3"
label="๋์๋ง"
imageMso="Help"
size="normal"
onAction="๋์๋ง๋ณด๊ธฐ"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
๐ VBA์์ ๋ฒํผ ์ด๋ฒคํธ ์ฒ๋ฆฌ
' ๋ฆฌ๋ณธ ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ
' ๋งค๊ฐ๋ณ์ control As IRibbonControl ์ ๋ฐ๋์ ์์ด์ผ ํด!
Sub ๋ฒํผ1ํด๋ฆญ(control As IRibbonControl)
' ๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ ํผ ์ด๊ธฐ
MsgBox "๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ๋ฅผ ์คํํฉ๋๋ค!", vbInformation, "๋์ ๋๊ตฌ"
End Sub
Sub ๋ฒํผ2ํด๋ฆญ(control As IRibbonControl)
' ๋ฐ์ดํฐ ์ ๋ฆฌ ๋งคํฌ๋ก ์คํ
Call ๋ฐ์ดํฐ์ ๋ฆฌ๋งคํฌ๋ก
End Sub
Sub ๋์๋ง๋ณด๊ธฐ(control As IRibbonControl)
' ๋์๋ง URL ์ด๊ธฐ
Shell "explorer.exe https://www.jaenung.net", vbNormalFocus
End Sub
๐ฏ ๋๋กญ๋ค์ด ๋ฉ๋ด ์ถ๊ฐ
<dropDown id="myDropDown"
label="ํจ์ ์ ํ"
onAction="๋๋กญ๋ค์ด์ ํ">
<item id="item1" label="๋ถ๊ฐ์ธ ๊ณ์ฐ"/>
<item id="item2" label="๋์ด ๊ณ์ฐ"/>
<item id="item3" label="์ด์ฑ ์ถ์ถ"/>
</dropDown>
Sub ๋๋กญ๋ค์ด์ ํ(control As IRibbonControl, id As String, index As Integer)
Select Case index
Case 0: MsgBox "๋ถ๊ฐ์ธ ๊ณ์ฐ ์ ํ๋จ"
Case 1: MsgBox "๋์ด ๊ณ์ฐ ์ ํ๋จ"
Case 2: MsgBox "์ด์ฑ ์ถ์ถ ์ ํ๋จ"
End Select
End Sub
7. UserForm์ผ๋ก GUI ๋ง๋ค๊ธฐ ๐ฅ๏ธ
์ ๋์ธ์ UserForm์ ์ถ๊ฐํ๋ฉด ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ด. ๋ง์น ๋ฏธ๋ ํ๋ก๊ทธ๋จ์ฒ๋ผ!
๐ UserForm ๋ง๋๋ ๋ฒ
UserForm1.Show
๐ป ๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ UserForm ์์
' UserForm1์ ์ฝ๋ ์ฐฝ์ ์์ฑ
Private Sub CommandButton1_Click()
' ๊ณ์ฐ ๋ฒํผ ํด๋ฆญ ์
Dim ๊ธ์ก As Double
If Not IsNumeric(TextBox1.Value) Then
MsgBox "์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์!", vbExclamation
Exit Sub
End If
๊ธ์ก = CDbl(TextBox1.Value)
Label_๋ถ๊ฐ์ธ.Caption = "๋ถ๊ฐ์ธ: " & Format(๊ธ์ก * 0.1, "#,##0") & "์"
Label_ํฉ๊ณ.Caption = "ํฉ๊ณ: " & Format(๊ธ์ก * 1.1, "#,##0") & "์"
End Sub
Private Sub CommandButton2_Click()
' ๋ซ๊ธฐ ๋ฒํผ
Unload Me
End Sub
Private Sub UserForm_Initialize()
' ํผ์ด ์ด๋ฆด ๋ ์ด๊ธฐํ
Me.Caption = "๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ v1.0"
TextBox1.SetFocus
End Sub
Private Sub TextBox1_Change()
' ์ค์๊ฐ ๊ณ์ฐ (์
๋ ฅํ ๋๋ง๋ค)
If IsNumeric(TextBox1.Value) Then
Dim ๊ธ์ก As Double
๊ธ์ก = CDbl(TextBox1.Value)
Label_๋ถ๊ฐ์ธ.Caption = "๋ถ๊ฐ์ธ: " & Format(๊ธ์ก * 0.1, "#,##0") & "์"
Label_ํฉ๊ณ.Caption = "ํฉ๊ณ: " & Format(๊ธ์ก * 1.1, "#,##0") & "์"
End If
End Sub
UserForm1.Show๋ ๋ชจ๋ฌ(Modal) ๋ฐฉ์์ผ๋ก ํผ์ด ์ด๋ ค ์๋ ๋์ ๋ค๋ฅธ ์์
์ ๋ชป ํด. UserForm1.Show vbModeless๋ฅผ ์ฐ๋ฉด ํผ์ ์ด์ด๋๊ณ ์์
์์
๋ ๋์์ ํ ์ ์์ด!
8. UDF ์ฑ๋ฅ ์ต์ ํ โ ๋น ๋ฅธ ํจ์ ๋ง๋ค๊ธฐ โก
UDF๊ฐ ๋๋ฆฌ๋ฉด ์์ ์ ์ฒด๊ฐ ๋๋ ค์ ธ. ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์์ผ!
โก ํต์ฌ ์ต์ ํ ๊ธฐ๋ฒ๋ค
| ๊ธฐ๋ฒ | ์ฝ๋ | ํจ๊ณผ |
|---|---|---|
| ํ๋ฉด ์ ๋ฐ์ดํธ ๋๊ธฐ | Application.ScreenUpdating = False |
ํ๋ฉด ๊ฐฑ์ ์ค๋จ์ผ๋ก ์๋ ํฅ์ |
| ์๋ ๊ณ์ฐ ๋๊ธฐ | Application.Calculation = xlCalculationManual |
๋ถํ์ํ ์ฌ๊ณ์ฐ ๋ฐฉ์ง |
| ์ด๋ฒคํธ ๋๊ธฐ | Application.EnableEvents = False |
์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ ๋ฐฉ์ง |
| ๋ฐฐ์ด ํ์ฉ | ๋ฒ์๋ฅผ ๋ฐฐ์ด๋ก ์ฝ์ด์ ์ฒ๋ฆฌ | ์ ์ ๊ทผ ํ์ ์ต์ํ |
| Volatile ์ ํ | Application.Volatile False |
๋ถํ์ํ ์ฌ๊ณ์ฐ ๋ฐฉ์ง |
๐ ๋ฐฐ์ด ํ์ฉ ์ต์ ํ ์์
์ ์ ํ๋์ฉ ์ฝ๋ ๊ฒ๋ณด๋ค ๋ฐฐ์ด๋ก ํ ๋ฒ์ ์ฝ๋ ๊ฒ ํจ์ฌ ๋นจ๋ผ. ๋น๊ตํด๋ณผ๊ฒ:
' โ ๋๋ฆฐ ๋ฐฉ๋ฒ: ์
์ ํ๋์ฉ ์ ๊ทผ
Function ๋๋ฆฐํฉ๊ณ(๋ฒ์ As Range) As Double
Dim ์
As Range
Dim ํฉ๊ณ As Double
For Each ์
In ๋ฒ์
ํฉ๊ณ = ํฉ๊ณ + ์
.Value ' ๋งค๋ฒ ์
์ ์ ๊ทผ โ ๋๋ฆผ!
Next ์
๋๋ฆฐํฉ๊ณ = ํฉ๊ณ
End Function
' โ
๋น ๋ฅธ ๋ฐฉ๋ฒ: ๋ฐฐ์ด๋ก ํ ๋ฒ์ ์ฝ๊ธฐ
Function ๋น ๋ฅธํฉ๊ณ(๋ฒ์ As Range) As Double
Dim ๋ฐ์ดํฐ() As Variant
Dim i As Long, j As Long
Dim ํฉ๊ณ As Double
๋ฐ์ดํฐ = ๋ฒ์.Value ' ํ ๋ฒ์ ๋ฐฐ์ด๋ก ์ฝ๊ธฐ โ ๋น ๋ฆ!
For i = 1 To UBound(๋ฐ์ดํฐ, 1)
For j = 1 To UBound(๋ฐ์ดํฐ, 2)
If IsNumeric(๋ฐ์ดํฐ(i, j)) Then
ํฉ๊ณ = ํฉ๊ณ + ๋ฐ์ดํฐ(i, j)
End If
Next j
Next i
๋น ๋ฅธํฉ๊ณ = ํฉ๊ณ
End Function
๋ฐ์ดํฐ๊ฐ 10๋ง ํ์ด๋ผ๋ฉด ๋ฐฐ์ด ๋ฐฉ์์ด ์์ญ ๋ฐฐ ๋น ๋ฅผ ์ ์์ด. ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ ๋๋ ๋ฐ๋์ ๋ฐฐ์ด ๋ฐฉ์์ ์จ!
โก Application.Volatile ์ดํดํ๊ธฐ
UDF์ Application.Volatile์ ์ถ๊ฐํ๋ฉด ์ด๋ค ์
์ด ๋ณ๊ฒฝ๋์ด๋ ์ด ํจ์๊ฐ ์ฌ๊ณ์ฐ๋ผ. ๊ธฐ๋ณธ์ ์ผ๋ก UDF๋ ๊ด๋ จ ์
์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ฌ๊ณ์ฐ๋๋๋ฐ, Volatile์ ์ฐ๋ฉด ํญ์ ์ฌ๊ณ์ฐํด.
Function ํ์ฌ์๊ฐํ์() As String
Application.Volatile True ' ํญ์ ์ฌ๊ณ์ฐ
ํ์ฌ์๊ฐํ์ = Format(Now(), "yyyy-mm-dd hh:mm:ss")
End Function
Application.Volatile True๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ค ์ ์์ด. ์ ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๊ณ , ๋๋ถ๋ถ์ UDF์๋ ์ฐ์ง ์๋ ๊ฒ ์ข์!
9. ์ค์ ํ๋ก์ ํธ: ์ ๋ฌด ์๋ํ ์ ๋์ธ ๋ง๋ค๊ธฐ ๐๏ธ
์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฑธ ์ข ํฉํด์ ์ค์ ๋ก ์ธ ์ ์๋ ์ ๋ฌด ์๋ํ ์ ๋์ธ์ ๋ง๋ค์ด๋ณด์! ์ด ์ ๋์ธ์๋ ์ฌ๋ฌ ์ ์ฉํ ๊ธฐ๋ฅ๋ค์ด ๋ค์ด๊ฐ ๊ฑฐ์ผ.
๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
MyOfficeTools.xlam
โโโ Module1: ํ
์คํธ ์ฒ๋ฆฌ ํจ์๋ค
โ โโโ Function ์ด์ฑ์ถ์ถ()
โ โโโ Function ์ ํ๋ฒํธ์ ๋ฆฌ()
โ โโโ Function ์ด๋ฉ์ผ๊ฒ์ฆ()
โโโ Module2: ๋ ์ง/์๊ฐ ํจ์๋ค
โ โโโ Function ์์
์ผ๊ณ์ฐ()
โ โโโ Function ๋ถ๊ธฐ๋ฐํ()
โ โโโ Function ์ฃผ์ฐจ๊ณ์ฐ()
โโโ Module3: ์์น ๊ณ์ฐ ํจ์๋ค
โ โโโ Function ๋ถ๊ฐ์ธํฌํจ()
โ โโโ Function ๊ฐ์คํ๊ท ()
โ โโโ Function ์์ํฉ๊ณ()
โโโ Module4: ์ ํธ๋ฆฌํฐ ๋งคํฌ๋ก
โ โโโ Sub ์ค๋ณต์ ๊ฑฐ()
โ โโโ Sub ๋นํ์ญ์ ()
โ โโโ Sub ์ํธ์ ๋ฆฌ()
โโโ UserForm1: ๋ถ๊ฐ์ธ ๊ณ์ฐ๊ธฐ UI
โโโ UserForm2: ๋ ์ง ๊ณ์ฐ๊ธฐ UI
โโโ ThisWorkbook: ์ด๊ธฐํ ์ฝ๋
๐ ์ ํ๋ฒํธ ์ ๋ฆฌ ํจ์
Function ์ ํ๋ฒํธ์ ๋ฆฌ(์ ํ๋ฒํธ As String) As String
Dim ์ซ์๋ง As String
Dim i As Integer
Dim ๊ธ์ As String
' ์ซ์๋ง ์ถ์ถ
์ซ์๋ง = ""
For i = 1 To Len(์ ํ๋ฒํธ)
๊ธ์ = Mid(์ ํ๋ฒํธ, i, 1)
If ๊ธ์ >= "0" And ๊ธ์ <= "9" Then
์ซ์๋ง = ์ซ์๋ง & ๊ธ์
End If
Next i
' ๊ธธ์ด์ ๋ฐ๋ผ ํ์ ์ ์ฉ
Select Case Len(์ซ์๋ง)
Case 10 ' 02-XXXX-XXXX ๋๋ 0XX-XXX-XXXX
If Left(์ซ์๋ง, 2) = "02" Then
์ ํ๋ฒํธ์ ๋ฆฌ = Left(์ซ์๋ง, 2) & "-" & Mid(์ซ์๋ง, 3, 4) & "-" & Right(์ซ์๋ง, 4)
Else
์ ํ๋ฒํธ์ ๋ฆฌ = Left(์ซ์๋ง, 3) & "-" & Mid(์ซ์๋ง, 4, 3) & "-" & Right(์ซ์๋ง, 4)
End If
Case 11 ' 010-XXXX-XXXX
์ ํ๋ฒํธ์ ๋ฆฌ = Left(์ซ์๋ง, 3) & "-" & Mid(์ซ์๋ง, 4, 4) & "-" & Right(์ซ์๋ง, 4)
Case Else
์ ํ๋ฒํธ์ ๋ฆฌ = ์ซ์๋ง ' ํ์ ๋ถ๋ช
ํ ์ ์ซ์๋ง ๋ฐํ
End Select
End Function
๐ ์์ ์ผ ๊ณ์ฐ ํจ์
Function ์์
์ผ๊ณ์ฐ(์์์ผ As Date, ์์
์ผ์ As Integer, _
Optional ๊ณตํด์ผ๋ฒ์ As Range = Nothing) As Date
Dim ํ์ฌ์ผ As Date
Dim ์นด์ดํธ As Integer
Dim ๊ณตํด์ผ As Range
Dim ๊ณตํด์ผ์ฌ๋ถ As Boolean
ํ์ฌ์ผ = ์์์ผ
์นด์ดํธ = 0
Do While ์นด์ดํธ < ์์
์ผ์
ํ์ฌ์ผ = ํ์ฌ์ผ + 1
' ์ฃผ๋ง ์ฒดํฌ (ํ =7, ์ผ=1)
If Weekday(ํ์ฌ์ผ) <> 1 And Weekday(ํ์ฌ์ผ) <> 7 Then
' ๊ณตํด์ผ ์ฒดํฌ
๊ณตํด์ผ์ฌ๋ถ = False
If Not ๊ณตํด์ผ๋ฒ์ Is Nothing Then
For Each ๊ณตํด์ผ In ๊ณตํด์ผ๋ฒ์
If CDate(๊ณตํด์ผ.Value) = ํ์ฌ์ผ Then
๊ณตํด์ผ์ฌ๋ถ = True
Exit For
End If
Next ๊ณตํด์ผ
End If
If Not ๊ณตํด์ผ์ฌ๋ถ Then
์นด์ดํธ = ์นด์ดํธ + 1
End If
End If
Loop
์์
์ผ๊ณ์ฐ = ํ์ฌ์ผ
End Function
์ฌ์ฉ๋ฒ: =์์
์ผ๊ณ์ฐ(TODAY(), 10, E1:E20)
์ค๋๋ถํฐ 10 ์์
์ผ ํ ๋ ์ง๋ฅผ ๋ฐํํ๊ณ , E1:E20์ ์๋ ๊ณตํด์ผ์ ์ ์ธํด!
๐ ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ ํจ์
Function ์ด๋ฉ์ผ๊ฒ์ฆ(์ด๋ฉ์ผ As String) As Boolean
' ์ ๊ท์ ๋์ ๊ธฐ๋ณธ ๊ฒ์ฆ ๋ก์ง ์ฌ์ฉ
Dim ์ณ์์น As Integer
Dim ์ ์์น As Integer
์ด๋ฉ์ผ๊ฒ์ฆ = False
' @ ๊ธฐํธ ํ์ธ
์ณ์์น = InStr(์ด๋ฉ์ผ, "@")
If ์ณ์์น <= 1 Then Exit Function
If ์ณ์์น = Len(์ด๋ฉ์ผ) Then Exit Function
' @ ์ดํ์ ์ (.) ํ์ธ
์ ์์น = InStr(์ณ์์น, ์ด๋ฉ์ผ, ".")
If ์ ์์น = 0 Then Exit Function
If ์ ์์น = Len(์ด๋ฉ์ผ) Then Exit Function
' ๊ณต๋ฐฑ ์์ ํ์ธ
If InStr(์ด๋ฉ์ผ, " ") > 0 Then Exit Function
์ด๋ฉ์ผ๊ฒ์ฆ = True
End Function
10. ์ ๋์ธ ๋ฐฐํฌ & ๋ฒ์ ๊ด๋ฆฌ ๐ค
์ ๋์ธ์ ๋ง๋ค์์ผ๋ฉด ์ด์ ํ์๋ค์๊ฒ ๋ฐฐํฌํด์ผ์ง! ๋ฐฐํฌ ๋ฐฉ๋ฒ๊ณผ ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๐ค ๋ฐฐํฌ ๋ฐฉ๋ฒ 3๊ฐ์ง
.xlam ํ์ผ์ ๊ณต์ ํด๋๋ ์ด๋ฉ์ผ๋ก ์ ๋ฌ. ๊ฐ์ฅ ๊ฐ๋จํ์ง๋ง ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์.
๊ณต์ ๋คํธ์ํฌ ํด๋์ .xlam ํ์ผ์ ๋๊ณ ๋ชจ๋๊ฐ ๊ฐ์ ํ์ผ์ ์ฐธ์กฐ. ์ ๋ฐ์ดํธ๊ฐ ์๋์ผ๋ก ๋ฐ์๋ผ!
ํด๋ผ์ฐ๋์ ์ฌ๋ ค์ ํ ์ ์ฒด๊ฐ ์ ๊ทผ. ๋ฒ์ ๊ด๋ฆฌ์ ์ ๊ทผ ๊ถํ ์ค์ ๋ ๊ฐ๋ฅ!
๐ ์๋ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ ๊ตฌํ
์ ๋์ธ์ด ์ด๋ฆด ๋ ์ต์ ๋ฒ์ ์ธ์ง ํ์ธํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์๋ดํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์ด:
' ThisWorkbook ๋ชจ๋์ ์์ฑ
Private Const ํ์ฌ๋ฒ์ As String = "1.2.0"
Private Const ๋ฒ์ ํ์ผ๊ฒฝ๋ก As String = "\\์๋ฒ\๊ณต์ ํด๋\version.txt"
Private Sub Workbook_Open()
' ๋ฒ์ ์ฒดํฌ
On Error Resume Next
Dim ์ต์ ๋ฒ์ As String
Dim ํ์ผ๋ฒํธ As Integer
ํ์ผ๋ฒํธ = FreeFile
Open ๋ฒ์ ํ์ผ๊ฒฝ๋ก For Input As #ํ์ผ๋ฒํธ
Line Input #ํ์ผ๋ฒํธ, ์ต์ ๋ฒ์
Close #ํ์ผ๋ฒํธ
If Err.Number = 0 Then
If ์ต์ ๋ฒ์ <> ํ์ฌ๋ฒ์ Then
Dim ์๋ต As Integer
์๋ต = MsgBox("์ ๋ฒ์ (" & ์ต์ ๋ฒ์ & ")์ด ์์ต๋๋ค. ์
๋ฐ์ดํธํ์๊ฒ ์ต๋๊น?", _
vbYesNo + vbQuestion, "์
๋ฐ์ดํธ ์๋ฆผ")
If ์๋ต = vbYes Then
Shell "explorer.exe \\์๋ฒ\๊ณต์ ํด๋\", vbNormalFocus
End If
End If
End If
On Error GoTo 0
' ํจ์ ์ค๋ช
๋ฑ๋ก
Call ํจ์์ค๋ช
๋ฑ๋ก
End Sub
๐ ๋ฒ์ ๊ด๋ฆฌ ์ฒด๊ณ
| ๋ฒ์ ํ์ | ์๋ฏธ | ์์ |
|---|---|---|
| Major (์ฒซ ๋ฒ์งธ ์ซ์) | ๋๊ท๋ชจ ๋ณ๊ฒฝ, ํ์ ํธํ ๋ถ๊ฐ | 1.x.x โ 2.0.0 |
| Minor (๋ ๋ฒ์งธ ์ซ์) | ์ ๊ธฐ๋ฅ ์ถ๊ฐ, ํ์ ํธํ ์ ์ง | 1.1.x โ 1.2.0 |
| Patch (์ธ ๋ฒ์งธ ์ซ์) | ๋ฒ๊ทธ ์์ | 1.1.0 โ 1.1.1 |
11. ์ค์ ํ & ์์ฃผ ํ๋ ์ค์๋ค โ ๏ธ
UDF์ ์ ๋์ธ ๊ฐ๋ฐํ๋ฉด์ ์์ฃผ ๋ง๋๋ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ์ฑ ์ ์ ๋ฆฌํ์ด. ์ด๊ฑฐ ์๋ฉด ์ฝ์ง ์๊ฐ์ด ํ ์ค์ด๋ค์ด!
โ ์์ฃผ ํ๋ ์ค์ 1: UDF์์ ์ ๋ณ๊ฒฝ ์๋
UDF๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ๋ง ๊ฐ๋ฅํด. ๋ค๋ฅธ ์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ํธ๋ฅผ ์กฐ์ํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋!
' โ ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ผ! (UDF์์ ๋ค๋ฅธ ์
๋ณ๊ฒฝ ์๋)
Function ์๋ชป๋ํจ์(๊ฐ As Double) As Double
Range("B1").Value = ๊ฐ * 2 ' ์๋ฌ! UDF์์ ์
๋ณ๊ฒฝ ๋ถ๊ฐ
์๋ชป๋ํจ์ = ๊ฐ * 1.1
End Function
' โ
์ด๋ ๊ฒ ํด์ผ ํด! (๊ฐ๋ง ๋ฐํ)
Function ์ฌ๋ฐ๋ฅธํจ์(๊ฐ As Double) As Double
์ฌ๋ฐ๋ฅธํจ์ = ๊ฐ * 1.1 ' ๊ฐ๋ง ๋ฐํ
End Function
โ ์์ฃผ ํ๋ ์ค์ 2: ์ํ ์ฐธ์กฐ
UDF๊ฐ ์๊ธฐ ์์ ์ด ์๋ ์ ์ ์ฐธ์กฐํ๋ฉด ์ํ ์ฐธ์กฐ ์๋ฌ๊ฐ ๋ฐ์ํด. ํญ์ ์ ๋ ฅ ๋ฒ์์ ์ถ๋ ฅ ์ ์ด ๊ฒน์น์ง ์๋๋ก ํด!
โ ์์ฃผ ํ๋ ์ค์ 3: ๋งคํฌ๋ก ๋ณด์ ์ค์
์ ๋์ธ์ ๋ฐฐํฌํ๋๋ฐ ๋ค๋ฅธ ์ปดํจํฐ์์ ํจ์๊ฐ ๋์ํ์ง ์๋๋ค๋ฉด ๋งคํฌ๋ก ๋ณด์ ์ค์ ์ ํ์ธํด๋ด!
โ ์์ฃผ ํ๋ ์ค์ 4: 64๋นํธ vs 32๋นํธ ํธํ์ฑ
Windows API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 32๋นํธ/64๋นํธ ์์ ์ ๋ฐ๋ผ ์ฝ๋๊ฐ ๋ฌ๋ผ์ผ ํด:
' 64๋นํธ/32๋นํธ ํธํ ์ฝ๋ ์์ฑ๋ฒ
#If VBA7 Then
' 64๋นํธ ์์
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongPtr
#Else
' 32๋นํธ ์์
Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If
โ ๊ผญ ์ง์ผ์ผ ํ ๋ฒ ์คํธ ํ๋ํฐ์ค
GetVATAmount, CalcAge)
12. VBA๋ฅผ ๋์ด์ โ VSTO & Office.js ๋ง๋ณด๊ธฐ ๐
VBA ์ ๋์ธ ๋ง๊ณ ๋ ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ๋ค์ด ์์ด. ๊ฐ๋จํ ์๊ฐํ ๊ฒ!
| ๋ฐฉ์ | ์ธ์ด | ์ฅ์ | ๋จ์ |
|---|---|---|---|
| VBA ์ ๋์ธ | VBA | ์ฌ์ด ์ง์ ์ฅ๋ฒฝ, ๋น ๋ฅธ ๊ฐ๋ฐ | Windows ์ ์ฉ, ์ฑ๋ฅ ํ๊ณ |
| VSTO | C#, VB.NET | ๊ฐ๋ ฅํ ๊ธฐ๋ฅ, .NET ์ํ๊ณ | ๋ณต์กํ ๋ฐฐํฌ, Windows ์ ์ฉ |
| Office.js | JavaScript | ํฌ๋ก์ค ํ๋ซํผ, ์น ๊ธฐ์ | ๊ธฐ๋ฅ ์ ํ, ์ธํฐ๋ท ํ์ |
| COM ์ ๋์ธ | C++, C# | ์ต๊ณ ์ฑ๋ฅ | ๋งค์ฐ ๋ณต์กํ ๊ฐ๋ฐ |
๋๋ถ๋ถ์ ์ ๋ฌด์ฉ ์ ๋์ธ์ VBA๋ก ์ถฉ๋ถํด. VSTO๋ Office.js๋ ๋ ๋ณต์กํ ์๊ตฌ์ฌํญ์ด ์์ ๋ ๊ณ ๋ คํด๋ด. ์๋ฅผ ๋ค์ด ์น ์๋น์ค์ ์ฐ๋ํ๊ฑฐ๋, Mac ์์ ์์๋ ๋์ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด Office.js๊ฐ ์ข์ ์ ํ์ด์ผ.
๐ Office.js ๊ธฐ๋ณธ UDF ์์
์ฐธ๊ณ ๋ก Office.js๋ก ๋ง๋๋ ์ปค์คํ ํจ์๋ ์ด๋ ๊ฒ ์๊ฒผ์ด:
// JavaScript๋ก ์์ฑํ๋ Office.js ์ปค์คํ
ํจ์
/**
* @customfunction
* @param {number} amount ๊ธ์ก
* @returns {number} ๋ถ๊ฐ์ธ ํฌํจ ๊ธ์ก
*/
function addVAT(amount) {
return amount * 1.1;
}
// ๋น๋๊ธฐ ํจ์๋ ๊ฐ๋ฅ! (API ํธ์ถ ๋ฑ)
/**
* @customfunction
* @param {string} stockCode ์ฃผ์ ์ฝ๋
* @returns {Promise<number>} ํ์ฌ ์ฃผ๊ฐ
*/
async function getStockPrice(stockCode) {
const response = await fetch(`https://api.example.com/stock/${stockCode}`);
const data = await response.json();
return data.price;
}
Office.js์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฑฐ์ผ. ์ธ๋ถ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ์ ํ์ํ๋ ๊ฒ๋ ๊ฐ๋ฅํด! VBA๋ก๋ ํ๊ธฐ ์ด๋ ค์ด ์ผ์ด์ง.
๋ง๋ฌด๋ฆฌ โ ์ด์ ์์ ์ด ์ง์ง ๋ด ๋๊ตฌ๊ฐ ๋์ด! ๐
์, ์ฌ๊ธฐ๊น์ง ์์ด! ์ ๋ง ๊ธด ์ฌ์ ์ด์๋๋ฐ ์๊ณ ํ์ด ๐
์ค๋ ๋ฐฐ์ด ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด:
์ฒ์์ ๋ณต์กํด ๋ณด์ฌ๋ ํ๋์ฉ ๋ง๋ค๋ค ๋ณด๋ฉด ๊ธ๋ฐฉ ์ต์ํด์ ธ. ๊ฐ์ฅ ์ค์ํ ๊ฑด ์ค์ ๋ก ํ์ํ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฒ์ด์ผ. ์
๋ฌด์์ "์ด๋ฐ ํจ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค"๋ ์๊ฐ์ด ๋ค ๋๋ง๋ค VBA ํธ์ง๊ธฐ๋ฅผ ์ด์ด๋ด. ๊ทธ๊ฒ ์ต๊ณ ์ ์ฐ์ต์ด์ผ! ๐ช
์์
์ ๋จ์ํ ์คํ๋ ๋์ํธ๊ฐ ์๋์ผ. VBA์ ์ ๋์ธ์ ํ์ฉํ๋ฉด ๋๋ง์ ์
๋ฌด ์๋ํ ํ๋ซํผ์ผ๋ก ๋ง๋ค ์ ์์ด. ์ด์ ๊ทธ ๋ฌธ์ด ์ด๋ ธ์ผ๋, ๋ง์๊ป ํํํด๋ด! ๐
๊ด๋ จ ํค์๋
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.

๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.