์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ”ง ์—‘์…€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)์™€ ์• ๋“œ์ธ(Add-in) ๊ฐœ๋ฐœ ์‹ค์ „ ๊ฐ€์ด๋“œ
๐Ÿ“Š ์—‘์…€ ์‹ฌํ™” ๊ฐ€์ด๋“œ

๐Ÿ”ง ์—‘์…€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)์™€ ์• ๋“œ์ธ(Add-in) ๊ฐœ๋ฐœ ์‹ค์ „ ๊ฐ€์ด๋“œ

VBA๋กœ ๋‚˜๋งŒ์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์• ๋“œ์ธ์œผ๋กœ ๋ฐฐํฌ๊นŒ์ง€! ์—‘์…€์„ ์ง„์งœ ๋‚ด ๋„๊ตฌ๋กœ ๋งŒ๋“œ๋Š” ๋ฒ• ๐Ÿš€

์•ผ, ์†”์งํžˆ ๋งํ•ด๋ด. ์—‘์…€ ์“ฐ๋‹ค๊ฐ€ "์•„ ์ด๋Ÿฐ ํ•จ์ˆ˜ ์žˆ์œผ๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์„๊นŒ..." ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณธ ์  ์—†์–ด? ๐Ÿ˜…
SUM, VLOOKUP, IF... ๊ธฐ๋ณธ ํ•จ์ˆ˜๋“ค์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ, ์—…๋ฌด๋งˆ๋‹ค ๋”ฑ ๋งž๋Š” ํ•จ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋ณต์žกํ•œ ์ˆ˜์‹์„ ๋ช‡ ์ค„์”ฉ ์Œ“์•„๋ณธ ๊ฒฝํ—˜, ๋‹ค๋“ค ์žˆ์ž–์•„.

๊ทธ๋Ÿฐ๋ฐ ์žˆ์ž–์•„, ์—‘์…€์—๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF, User Defined Function)๋ผ๋Š” ๊ฒŒ ์žˆ์–ด. ๋ง ๊ทธ๋Œ€๋กœ ๋‚ด๊ฐ€ ์ง์ ‘ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ! ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑธ ํ•œ ๋ฐœ ๋” ๋‚˜์•„๊ฐ€์„œ ์• ๋“œ์ธ(Add-in)์œผ๋กœ ๋งŒ๋“ค๋ฉด, ์–ด๋–ค ์—‘์…€ ํŒŒ์ผ์—์„œ๋„ ๋‚ด ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋ผ.

์ด ๊ธ€์—์„œ๋Š” VBA๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ถ€ํ„ฐ, ๊ทธ๊ฑธ ์• ๋“œ์ธ์œผ๋กœ ํŒจํ‚ค์ง•ํ•ด์„œ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์‹ค์ „ ์œ„์ฃผ๋กœ ๋‹ค๋ค„๋ณผ ๊ฑฐ์•ผ. ์ฝ”๋”ฉ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„. ๊ฐ™์ด ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๋ณด์ž! ๐Ÿ’ช

์—‘์…€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ โ†’ ์• ๋“œ์ธ ๊ฐœ๋ฐœ ํ๋ฆ„ ๐Ÿ’ก ์•„์ด๋””์–ด ํ•„์š”ํ•œ ํ•จ์ˆ˜ ๊ตฌ์ƒ โŒจ๏ธ VBA ์ฝ”๋”ฉ Function ์ž‘์„ฑ ๐Ÿงช ํ…Œ์ŠคํŠธ ๋””๋ฒ„๊น… & ๊ฒ€์ฆ ๐Ÿ“ฆ ์• ๋“œ์ธ ๋ฐฐํฌ .xlam ํŒŒ์ผ ์ƒ์„ฑ ๐Ÿ“Œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)๋ž€? VBA์˜ Function ํ”„๋กœ์‹œ์ €๋ฅผ ์ด์šฉํ•ด ์—‘์…€ ์…€์—์„œ ์ง์ ‘ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ =MYFUNCTION(A1, B1) ์ฒ˜๋Ÿผ ์‚ฌ์šฉ! ๊ธฐ๋ณธ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐ ์•ˆ ๋˜๋Š” ๋ณต์žกํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ๐Ÿ“Œ ์• ๋“œ์ธ(Add-in)์ด๋ž€? UDF๋‚˜ ๋งคํฌ๋กœ๋ฅผ .xlam ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ด ์—‘์…€์— ์˜๊ตฌ ๋“ฑ๋กํ•˜๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ ํŒจํ‚ค์ง€ ์–ด๋–ค ํ†ตํ•ฉ ๋ฌธ์„œ์—์„œ๋„ ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ! ํŒ€์›๋“ค๊ณผ ๊ณต์œ ๋„ ๊ฐ€๋Šฅ โ†’ ์ƒ์‚ฐ์„ฑ ํญ๋ฐœ ๐Ÿš€ ๋ถ„์„ ๋„๊ตฌ ํŒฉ, Solver ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ์• ๋“œ์ธ

1. VBA ํŽธ์ง‘๊ธฐ ์—ด๊ธฐ & ๊ธฐ๋ณธ ์„ธํŒ… ๐Ÿ› ๏ธ

์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋จผ์ € VBA ํŽธ์ง‘๊ธฐ(Visual Basic for Applications Editor)์— ์ ‘๊ทผํ•ด์•ผ ํ•ด. ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๊ฐ„๋‹จํ•ด!

1๊ฐœ๋ฐœ ๋„๊ตฌ ํƒญ ํ™œ์„ฑํ™”
ํŒŒ์ผ โ†’ ์˜ต์…˜ โ†’ ๋ฆฌ๋ณธ ์‚ฌ์šฉ์ž ์ง€์ • โ†’ '๊ฐœ๋ฐœ ๋„๊ตฌ' ์ฒดํฌ๋ฐ•์Šค ํ™œ์„ฑํ™”
2VBA ํŽธ์ง‘๊ธฐ ์—ด๊ธฐ
๊ฐœ๋ฐœ ๋„๊ตฌ ํƒญ โ†’ Visual Basic ํด๋ฆญ (๋˜๋Š” ๋‹จ์ถ•ํ‚ค Alt + F11)
3๋ชจ๋“ˆ ์‚ฝ์ž…
VBA ํŽธ์ง‘๊ธฐ์—์„œ ์‚ฝ์ž…(Insert) โ†’ ๋ชจ๋“ˆ(Module) ํด๋ฆญ โ†’ ์ƒˆ ๋ชจ๋“ˆ ์ฐฝ์ด ์—ด๋ฆผ
๐Ÿ’ก ํŒ! ๋‹จ์ถ•ํ‚ค Alt + F11์€ VBA ํŽธ์ง‘๊ธฐ๋ฅผ ์—ฌ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด์•ผ. ์™ธ์›Œ๋‘๋ฉด ์ง„์งœ ํŽธํ•ด!

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 ๊ฐ™์€ ๋ฒ”์œ„
๐Ÿ’ก Variant ํƒ€์ž…์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์“ฐ๊ณ  ๋А๋ฆด ์ˆ˜ ์žˆ์–ด. ๊ฐ€๋Šฅํ•˜๋ฉด ๋ช…ํ™•ํ•œ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ๊ฒŒ ์ข‹์•„!
UDF ๋™์ž‘ ์›๋ฆฌ ์‹œ๊ฐํ™” ๐Ÿ“Š ์—‘์…€ ์‹œํŠธ A1 50000 B1 =๋ถ€๊ฐ€์„ธํฌํ•จ(A1) B1 ๊ฒฐ๊ณผ 55,000 ์‚ฌ์šฉ์ž๊ฐ€ ์…€์— ํ•จ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์—‘์…€์ด VBA ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ! ํ˜ธ์ถœ โš™๏ธ VBA ๋ชจ๋“ˆ Function ๋ถ€๊ฐ€์„ธํฌํ•จ( ๊ธˆ์•ก As Double) As Double ๋ถ€๊ฐ€์„ธํฌํ•จ = ๊ธˆ์•ก * 1.1 End Function 50000 ร— 1.1 = 55000 ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ โœ… ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๊ฐ’ 55,000 ์…€ B1์— ํ‘œ์‹œ๋จ ์—‘์…€ ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ์™„์ „ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ โ€” ์ฐจ์ด๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ! ๐Ÿ˜Ž

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
โš ๏ธ ์ฃผ์˜! ์…€ ์ƒ‰์ƒ ๊ธฐ๋ฐ˜ UDF๋Š” ์ƒ‰์ƒ์ด ๋ฐ”๋€Œ์–ด๋„ ์ž๋™์œผ๋กœ ์žฌ๊ณ„์‚ฐ๋˜์ง€ ์•Š์•„. Ctrl + Alt + F9๋กœ ๊ฐ•์ œ ์žฌ๊ณ„์‚ฐํ•ด์•ผ ํ•ด!

๐Ÿ“Œ ์˜ˆ์ œ 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
๐Ÿ’ก ์„ฑ๋Šฅ ํŒ! ๋ฒ”์œ„๊ฐ€ ํฐ UDF๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— 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 ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๋ฐฐํฌํ•˜๋ฉด ํŒ€ ์ „์ฒด๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ์–ด. ํ‘œ์ค€ํ™” ์™„์„ฑ!

๐Ÿ“‹ ์• ๋“œ์ธ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

1์ƒˆ ํ†ตํ•ฉ ๋ฌธ์„œ ์ƒ์„ฑ & VBA ์ฝ”๋“œ ์ž‘์„ฑ
์ƒˆ ์—‘์…€ ํŒŒ์ผ์„ ์—ด๊ณ , VBA ํŽธ์ง‘๊ธฐ์—์„œ ๋ชจ๋“ˆ์„ ์‚ฝ์ž…ํ•œ ํ›„ ๋ชจ๋“  UDF ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด.
2ํ†ตํ•ฉ ๋ฌธ์„œ ์†์„ฑ ์„ค์ •
ํŒŒ์ผ โ†’ ์ •๋ณด โ†’ ์†์„ฑ โ†’ ์ œ๋ชฉ, ์ž‘์„ฑ์ž, ์„ค๋ช… ๋“ฑ์„ ์ž…๋ ฅํ•ด. ์• ๋“œ์ธ ๊ด€๋ฆฌ์ž์—์„œ ํ‘œ์‹œ๋  ์ •๋ณด์•ผ.
3Excel ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(.xlam)์œผ๋กœ ์ €์žฅ
ํŒŒ์ผ โ†’ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ โ†’ ํŒŒ์ผ ํ˜•์‹์„ "Excel ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(*.xlam)"์œผ๋กœ ์„ ํƒ โ†’ ์ €์žฅ!
4์• ๋“œ์ธ ๋“ฑ๋ก
ํŒŒ์ผ โ†’ ์˜ต์…˜ โ†’ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ โ†’ ๊ด€๋ฆฌ: Excel ์ถ”๊ฐ€ ๊ธฐ๋Šฅ โ†’ ์ด๋™ โ†’ ์ฐพ์•„๋ณด๊ธฐ โ†’ .xlam ํŒŒ์ผ ์„ ํƒ โ†’ ํ™•์ธ
5์‚ฌ์šฉ ํ™•์ธ
์ƒˆ ํ†ตํ•ฉ ๋ฌธ์„œ๋ฅผ ์—ด๊ณ  ๋‚ด UDF๋ฅผ ์…€์— ์ž…๋ ฅํ•ด๋ด. ์ •์ƒ ๋™์ž‘ํ•˜๋ฉด ์„ฑ๊ณต! ๐ŸŽ‰
๐Ÿ’ก ์ €์žฅ ์œ„์น˜ ํŒ! ์• ๋“œ์ธ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ์ €์žฅ ์œ„์น˜๋Š” C:\Users\[์‚ฌ์šฉ์ž๋ช…]\AppData\Roaming\Microsoft\AddIns\์•ผ. ์ด ํด๋”์— ์ €์žฅํ•˜๋ฉด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋ชฉ๋ก์— ์ž๋™์œผ๋กœ ๋‚˜ํƒ€๋‚˜!

๐Ÿ” VBA ์ฝ”๋“œ ๋ณดํ˜ธํ•˜๊ธฐ

์• ๋“œ์ธ์„ ๋ฐฐํฌํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:

1VBA ํŽธ์ง‘๊ธฐ โ†’ ๋„๊ตฌ(Tools) โ†’ VBAProject ์†์„ฑ(VBAProject Properties)
2๋ณดํ˜ธ(Protection) ํƒญ โ†’ "ํ”„๋กœ์ ํŠธ๋ฅผ ์ž ๊ธˆ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ณด๊ธฐ ๊ธˆ์ง€" ์ฒดํฌ
3๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ โ†’ ํ™•์ธ โ†’ ํŒŒ์ผ ์ €์žฅ
โš ๏ธ ์ค‘์š”! ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณต๊ตฌํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด. ๋ฐ˜๋“œ์‹œ ์›๋ณธ .xlsm ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋ฐฑ์—…ํ•ด๋‘๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•ˆ์ „ํ•œ ๊ณณ์— ๊ธฐ๋กํ•ด๋‘ฌ!
์• ๋“œ์ธ(.xlam) ๋ฐฐํฌ ๊ตฌ์กฐ ๐Ÿ“ฆ MyFunctions.xlam ๋‚˜๋งŒ์˜ ์• ๋“œ์ธ ํŒŒ์ผ ๐Ÿ“ VBA ๋ชจ๋“ˆ Function ๋ถ€๊ฐ€์„ธํฌํ•จ() Function ๋‚˜์ด๊ณ„์‚ฐ() โš™๏ธ ์„ค์ • ์ •๋ณด ์ œ๋ชฉ, ์„ค๋ช…, ๋ฒ„์ „ ์ž‘์„ฑ์ž ์ •๋ณด ๐Ÿ”’ ์ฝ”๋“œ ๋ณดํ˜ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž ๊ธˆ ์†Œ์Šค ์ฝ”๋“œ ์ˆจ๊น€ ๐ŸŽจ ๋ฆฌ๋ณธ UI ์ปค์Šคํ…€ ํƒญ ๋ฒ„ํŠผ ์ถ”๊ฐ€ ๋ฐฐํฌ ํ›„ โ†’ ๋ชจ๋“  ์—‘์…€ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ! ๐Ÿ“Š ์—…๋ฌด๋ณด๊ณ ์„œ.xlsx ๐Ÿ“Š ๋งค์ถœ๋ถ„์„.xlsx ๐Ÿ“Š ์ธ์‚ฌ๊ด€๋ฆฌ.xlsx ๐Ÿ“Š ์žฌ๊ณ ํ˜„ํ™ฉ.xlsx ๐Ÿ“Š ์ƒˆํŒŒ์ผ.xlsx

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
๐Ÿ’ก imageMso๋Š” ์˜คํ”ผ์Šค ๋‚ด์žฅ ์•„์ด์ฝ˜ ์ด๋ฆ„์ด์•ผ. ์ˆ˜์ฒœ ๊ฐœ์˜ ์•„์ด์ฝ˜์ด ์žˆ์–ด์„œ ์›ํ•˜๋Š” ๊ฑธ ๊ณจ๋ผ ์“ธ ์ˆ˜ ์žˆ์–ด. "Office Fluent UI Command Identifiers"๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ „์ฒด ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์–ด!

๐ŸŽฏ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ์ถ”๊ฐ€

<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 ๋งŒ๋“œ๋Š” ๋ฒ•

1VBA ํŽธ์ง‘๊ธฐ โ†’ ์‚ฝ์ž…(Insert) โ†’ ์‚ฌ์šฉ์ž ์ •์˜ ํผ(UserForm)
2๋„๊ตฌ ์ƒ์ž์—์„œ ์ปจํŠธ๋กค์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ํผ์— ๋ฐฐ์น˜ (ํ…์ŠคํŠธ๋ฐ•์Šค, ๋ฒ„ํŠผ, ๋ ˆ์ด๋ธ” ๋“ฑ)
3๊ฐ ์ปจํŠธ๋กค์— ์ด๋ฒคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
4ํผ์„ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ: 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
๐Ÿ’ก ๋ชจ๋‹ฌ vs ๋ชจ๋‹ฌ๋ฆฌ์Šค! 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
๐Ÿ’ฌ "์žฌ๋Šฅ๋„ท์—์„œ ์—‘์…€ ๊ด€๋ จ ์žฌ๋Šฅ์„ ์ฐพ์•„๋ณด๋ฉด ์ด๋Ÿฐ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋‚˜ ์• ๋“œ์ธ ๊ฐœ๋ฐœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ถ„๋“ค์ด ๊ฝค ์žˆ์–ด. ์ง์ ‘ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ!"
๐Ÿ› VBA ๋””๋ฒ„๊น… ํ•ต์‹ฌ ๋„๊ตฌ ๐Ÿ”ด ์ค‘๋‹จ์  (Breakpoint) ์ฝ”๋“œ ์ค„ ๋ฒˆํ˜ธ ํด๋ฆญ์œผ๋กœ ๋นจ๊ฐ„ ์  ์„ค์ • ์‹คํ–‰์ด ํ•ด๋‹น ์ค„์—์„œ ์ผ์‹œ ์ •์ง€๋จ โŒจ๏ธ ์ง์ ‘ ์‹คํ–‰ ์ฐฝ Ctrl+G ๋กœ ์—ด๊ธฐ ? ๋ณ€์ˆ˜๋ช… ์ž…๋ ฅ์œผ๋กœ ํ˜„์žฌ ๋ณ€์ˆ˜๊ฐ’ ํ™•์ธ ์ฝ”๋“œ ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ ๐Ÿ” ์กฐ์‚ฌ์‹ ์ฐฝ ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด๋‘๋ฉด ์‹คํ–‰ ์ค‘ ๊ฐ’ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ณต์žกํ•œ ๋กœ์ง ์ถ”์ ์— ์ตœ์  ๐Ÿ‘ฃ F8 ๋‹จ๊ณ„ ์‹คํ–‰ F8 ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ํ•œ ์ค„์”ฉ ์‹คํ–‰ ๋…ธ๋ž€ ํ™”์‚ดํ‘œ๋กœ ํ˜„์žฌ ์‹คํ–‰ ์œ„์น˜ ํ‘œ์‹œ ๐Ÿ–จ๏ธ Debug.Print โ€” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ• ์ฝ”๋“œ ์ค‘๊ฐ„์— Debug.Print ๋ณ€์ˆ˜๋ช… ์„ ๋„ฃ์œผ๋ฉด ์ง์ ‘ ์‹คํ–‰ ์ฐฝ์— ๊ฐ’์ด ์ถœ๋ ฅ๋ผ. ์˜ˆ: Debug.Print "ํ˜„์žฌ ํ•ฉ๊ณ„: " & ํ•ฉ๊ณ„ โ†’ ์ง์ ‘ ์‹คํ–‰ ์ฐฝ์— "ํ˜„์žฌ ํ•ฉ๊ณ„: 12345" ์ถœ๋ ฅ ๐Ÿ”ด ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ โ€” ์‹คํ–‰ ์ „์— ๋ฐœ๊ฒฌ ๐ŸŸก ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒ โ€” On Error๋กœ ์ฒ˜๋ฆฌ ๐ŸŸข ๋…ผ๋ฆฌ ์—๋Ÿฌ ๊ฒฐ๊ณผ๊ฐ€ ํ‹€๋ฆผ โ€” ๋‹จ๊ณ„ ์‹คํ–‰์œผ๋กœ ์ถ”์ 

10. ์• ๋“œ์ธ ๋ฐฐํฌ & ๋ฒ„์ „ ๊ด€๋ฆฌ ๐Ÿ“ค

์• ๋“œ์ธ์„ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ด์ œ ํŒ€์›๋“ค์—๊ฒŒ ๋ฐฐํฌํ•ด์•ผ์ง€! ๋ฐฐํฌ ๋ฐฉ๋ฒ•๊ณผ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

๐Ÿ“ค ๋ฐฐํฌ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

๐Ÿ“ ํŒŒ์ผ ๊ณต์œ 

.xlam ํŒŒ์ผ์„ ๊ณต์œ  ํด๋”๋‚˜ ์ด๋ฉ”์ผ๋กœ ์ „๋‹ฌ. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ.

๐ŸŒ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ธŒ

๊ณต์œ  ๋„คํŠธ์›Œํฌ ํด๋”์— .xlam ํŒŒ์ผ์„ ๋‘๊ณ  ๋ชจ๋‘๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ์ฐธ์กฐ. ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋ผ!

๐Ÿข SharePoint/OneDrive

ํด๋ผ์šฐ๋“œ์— ์˜ฌ๋ ค์„œ ํŒ€ ์ „์ฒด๊ฐ€ ์ ‘๊ทผ. ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •๋„ ๊ฐ€๋Šฅ!

๐Ÿ”„ ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์• ๋“œ์ธ์ด ์—ด๋ฆด ๋•Œ ์ตœ์‹  ๋ฒ„์ „์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด:

' 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
๐Ÿ’ก ๋ณ€๊ฒฝ ์ด๋ ฅ(Changelog)์„ ๋ณ„๋„ ์‹œํŠธ๋‚˜ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋‚˜์ค‘์— "์ด ๊ธฐ๋Šฅ ์–ธ์ œ ์ถ”๊ฐ€ํ–ˆ์ง€?" ๊ฐ™์€ ์งˆ๋ฌธ์— ๋ฐ”๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ์–ด!

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)
โœ“์ฃผ์„ ๋‹ฌ๊ธฐ โ€” ๋ณต์žกํ•œ ๋กœ์ง์—๋Š” ๋ฐ˜๋“œ์‹œ ์ฃผ์„ ์ถ”๊ฐ€ (๋‚˜์ค‘์— ๋‚ด๊ฐ€ ๋ด๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ!)
โœ“์—๋Ÿฌ ์ฒ˜๋ฆฌ โ€” ๋ชจ๋“  UDF์— ๊ธฐ๋ณธ์ ์ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
โœ“ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ โ€” ๋‹ค์–‘ํ•œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธ
โœ“๋ฐฑ์—… ์œ ์ง€ โ€” ์›๋ณธ .xlsm ํŒŒ์ผ์€ ํ•ญ์ƒ ๋ณ„๋„ ๋ณด๊ด€
๐Ÿ’ก ์žฌ๋Šฅ๋„ท์—์„œ VBA๋‚˜ ์—‘์…€ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๋Š” ๋ถ„๋“ค๋„ ๋งŽ์•„. ๋งŒ์•ฝ ์• ๋“œ์ธ ๊ฐœ๋ฐœ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์ง„๋‹ค๋ฉด ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์˜๋ขฐํ•˜๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ์• ๋“œ์ธ์„ ์žฌ๋Šฅ์œผ๋กœ ํŒ๋งคํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ! ๐Ÿ’ฐ

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 ํŽธ์ง‘๊ธฐ ์‚ฌ์šฉ๋ฒ• โ€” Alt+F11๋กœ ์—ด๊ณ , ๋ชจ๋“ˆ์— ์ฝ”๋“œ ์ž‘์„ฑ
โœ“UDF ๊ธฐ๋ณธ ๊ตฌ์กฐ โ€” Function์œผ๋กœ ์‹œ์ž‘, ํ•จ์ˆ˜๋ช…์— ๊ฒฐ๊ณผ๊ฐ’ ๋Œ€์ž…
โœ“์‹ค์ „ UDF ์˜ˆ์ œ๋“ค โ€” ๋‚˜์ด๊ณ„์‚ฐ, ์ „ํ™”๋ฒˆํ˜ธ์ •๋ฆฌ, ์ƒ‰์ƒํ•ฉ๊ณ„ ๋“ฑ
โœ“๊ณ ๊ธ‰ ๊ธฐ๋ฒ• โ€” Optional ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐฐ์—ด ๋ฐ˜ํ™˜, ์—๋Ÿฌ ์ฒ˜๋ฆฌ
โœ“์• ๋“œ์ธ ๊ฐœ๋ฐœ โ€” .xlam์œผ๋กœ ์ €์žฅ, ๋“ฑ๋ก, ๋ฐฐํฌ
โœ“๋ฆฌ๋ณธ UI & UserForm โ€” ์ง„์งœ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋งŒ๋“ค๊ธฐ
โœ“์„ฑ๋Šฅ ์ตœ์ ํ™” โ€” ๋ฐฐ์—ด ํ™œ์šฉ, Volatile ์ œ์–ด

์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์—ฌ๋„ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์ ธ. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์ด์•ผ. ์—…๋ฌด์—์„œ "์ด๋Ÿฐ ํ•จ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค"๋Š” ์ƒ๊ฐ์ด ๋“ค ๋•Œ๋งˆ๋‹ค VBA ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด์–ด๋ด. ๊ทธ๊ฒŒ ์ตœ๊ณ ์˜ ์—ฐ์Šต์ด์•ผ! ๐Ÿ’ช

์—‘์…€์€ ๋‹จ์ˆœํ•œ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๊ฐ€ ์•„๋‹ˆ์•ผ. VBA์™€ ์• ๋“œ์ธ์„ ํ™œ์šฉํ•˜๋ฉด ๋‚˜๋งŒ์˜ ์—…๋ฌด ์ž๋™ํ™” ํ”Œ๋žซํผ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด์ œ ๊ทธ ๋ฌธ์ด ์—ด๋ ธ์œผ๋‹ˆ, ๋งˆ์Œ๊ป ํƒํ—˜ํ•ด๋ด! ๐Ÿš€

๐ŸŽฏ ๐Ÿ’ก ๐Ÿ”ง ๐Ÿ“Š ๐Ÿš€ โœจ
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0