(¿£Áö´Ï¾î¸¦
À§ÇÑ) ÆÄÀ̽㠽ÃÀÛÇϱâ[14]
³»¿ë : ¿¢¼¿VBA - ÆÄÀ̽㠿¬µ¿
ÂüÁ¶ : https://wikidocs.net/157782
(VBA¿¡¼ÆÄÀ̽ã ÄÚµå ½ÇÇàÇϱâ)
xlwings °ø½Ä ȨÆäÀÌÁö : https://docs.xlwings.org/en/stable/udfs.html
(User Defined Functions)
0.½ÃÀÛÇϸç
Áö³
½Ã°£¿¡´Â pythonÀ¸·Î ExcelÀÇ sheet¿¡ °ªÀ̳ª ¼ö½ÄÀ» ³Ö´Â °ÍÀ» ¼Ò°³Çß´Ù. ¿¢¼¿ °í±Þ»ç¿ëÀÚµéÀº ÀڽŸ¸ÀÇ VBA¸¦ ¸¸µé¾î¼ »ç¿ëÇÑ´Ù.
Visual BasicÀº ¸¶ÀÌÅ©·Î ¼ÒÇÁÆ®°¡ MS Office¿¡ µµÀÔÇÑ ¾ð¾î·Î ¿À·§µ¿¾È »ç¿ëµÇ¾î ¿Ô´Ù. xlwings´Â ±âÁ¸¿¡ »ç¿ëÇϰí ÀÖ´Â
VBA¸¦ »ç¿ëÇÏ¸é¼ pythonÄÚµåµéÀ» °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦½ÃÇϰí ÀÖ´Ù. pythonÃø¿¡¼ ¿¢¼¿À» ÅëÁ¦ÇÏ´Â ¹æ¹ýÀº ¸í·Éâ¿¡¼ ÆÄÀ̽ã
Äڵ带 ½ÇÇà½ÃŰ°Å³ª ÆÄÀ̽ã Äڵ带 ½ÇÇàÆÄÀÏ·Î ¸¸µé¾î¼ ½ÇÇàÇØ¾ß ÇÑ´Ù. Á¶±Ý ºÒÆíÇÒ ¼öµµ ÀÖ´Ù. VBAÀÇ ÀåÁ¡Àº ¿¢¼¿ ½ÃÆ® ¾È¿¡ ¹öưÀ» ¸¸µé ¼öµµ
ÀÖ°í, º°µµÀÇ GUI¸¦ ¸¸µé ¼ö ÀÖ´Ù. ¸¸ÀÏ VBA´Â UI¿ëÀ¸·Î¸¸ ¾²°í ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ´Â ÄÚµå´Â pythonÀ¸·Î ¸¸µç´Ù¸é ¾î¶³±î? ¿¹¸¦ µé¾î
ö±Ù·®À» ±¸ÇØÁÖ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù°í ÇÏÀÚ. VBA·Î ¸¸µé¸é ÇØ´ç ¿¢¼¿¿¡¼¹Û¿¡ »ç¿ëÇÏÁö ¸øÇÑ´Ù. ÆÄÀ̽ãÀ¸·Î ¸¸µé¸é ´Ù¸¥ ÆÄÀ̽ã ÇÁ·Î±×·¥À̳ª ´Ù¸¥
¿¢¼¿¿¡¼µµ ºÒ·¯´Ù »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÇϳªÀÇ ÆÄÀ̽ã Äڵ带 ¸¸µé¾î¼ »ç¿ëÇÒ ¼ö ÀÖ°í Áߺ¹À» ÇÇÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
1. xlwings¼³Ä¡ È®ÀÎ ¹× addin¼³Ä¡
¿¢¼¿
VBA¿Í pythonÀ» ¿¬µ¿Çϱâ À§Çؼ´Â Xlwings °¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ¾Æ³ªÄÜ´Ù¸¦ ¼³Ä¡Çϸé xlwings°¡ °°ÀÌ ¼³Ä¡µÇ´Âµ¥
xlwings¼³Ä¡ È®ÀÎÀº ÀÌÀü½Ã°£ÀÇ http://www.gumifo.org/zeroboard/view.php?id=devtips&no=56
'(¿£Áö´Ï¾î¸¦
À§ÇÑ) ÆÄÀ̽㠽ÃÀÛÇϱâ[13] ¿¢¼¿ ÆÄÀ̽㠿¬µ¿'À» ÂüÁ¶ÇÏÀÚ. ¾Æ³ªÄÜ´Ù ¼³Ä¡´Â ù ½Ã°£ÀÇ http://www.gumifo.org/zeroboard/view.php?id=devtips&no=40 '(¿£Áö´Ï¾î¸¦ À§ÇÑ) ÆÄÀ̽㠽ÃÀÛÇϱâ[1]'À» ÂüÁ¶ÇÏÀÚ.
¿¢¼¿¿¡¼
pythonÄڵ带 »ç¿ëÇÏ·Á¸é xlwings¿ë addinÀ» ¼³Ä¡ÇØ¾ß ÇÑ´Ù. ¸í·Éâ¿¡¼ xlwings addin installÀ̶ó°í ÀÔ·ÂÇϸé
µÈ´Ù. ¹°·Ð xlwings°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
(base)
D:\dev\python\xlwings>xlwings addin install
xlwings version: 0.24.9
Successfully installed the xlwings add-in! Please restart Excel.
There is
already an existing ~/.xlwings/xlwings.conf file. Run 'xlwings config create
--force' if you want to reset your configuration.
|
2. ¼³Á¤
xlwings
addinÀÌ ¼³Ä¡µÇ¾ú´Ù¸é ¿¢¼¿À» ½ÇÇà½ÃÄѺ¸ÀÚ. ¸Þ´º¿¡ xlwings°¡ Ãß°¡µÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸Þ´º¿¡ VBA¿Í ÆÄÀ̽ãÀ» ¿¬°áÇØÁÖ´Â ±â´ÉµéÀÌ
µé¾î ÀÖ´Ù.

±×¸®°í
[°³¹ß µµ±¸] ¸Þ´º°¡ º¸ÀÌÁö ¾Ê´Â °æ¿ì¿¡´Â [°³¹ß µµ±¸] ¸Þ´º°¡ º¸À̵µ·Ï ÇØ¾ßÇÑ´Ù.
[ÆÄÀÏ]
¸Þ´ºÀÇ [¿É¼Ç]À» ¼±ÅÃÇÑ ÈÄ [¸®º» »ç¿ëÀÚ ÁöÁ¤]À»
¼±ÅÃÇÑ ÈÄ ¿À¸¥ÂÊ ±âº» ÅÇ¿¡¼ °³¹ßµµ±¸¸¦ ¼±ÅÃÇϸé [°³¹ß µµ±¸] ¸Þ´º°¡ ³ªÅ¸³´Ù.

[°³¹ß
µµ±¸] ¸Þ´º¸¦ ¼±ÅÃÇÏÀÚ. ¸®º»ÀÌ ³ªÅ¸³ª¸é Visual BasicÀ» ¼±ÅÃÇÏÀÚ.

±×·¯¸é
VBA âÀÌ º°µµ·Î ¶á´Ù. VBA Äڵ带 ÆíÁýÇÒ ¼ö Àִ âÀÌ´Ù.

[µµ±¸]
¸Þ´ºÀÇ [ÂüÁ¶]¸¦ ¼±ÅÃÇÑ´Ù. [ÂüÁ¶(R)...]À» ¼±ÅÃÇÑ´Ù.
»ç¿ë°¡´ÉÇÑ
ÂüÁ¶ ¸®½ºÆ®¿¡¼ xlwings¸¦ ¼±ÅÃÇϰí [È®ÀÎ] ¹öưÀ» ´©¸¥´Ù.

ÂüÁ¶
´ÙÀ̾ó·Î±× ¹Ú½ºÀÇ ¾Æ·¡ ÂÊÀ» º¸¸é xlwings À§Ä¡¸¦ ¾Ë ¼ö ÀÖ´Ù. »ç¿ëÀÚ¸í\AppData\Roaming\Microsoft\Excel\XLSTART´Ù.
ÀÌ Æú´õ¿¡ °¡º¸¸é xlwings.xlamÆÄÀÏÀÌ ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. xlamÆÄÀÏÀº ¿¢¼¿ÀÇ Ãß°¡±â´É ÆÄÀÏÀÌ´Ù. µð·ºÅ丮¸íÀ» º¸¸é ¾Ë°ÚÁö¸¸
XLSTART µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏÀº ¿¢¼¿ÀÌ ½ÇÇàµÇ¸é ÀÚµ¿À¸·Î ¿¸°´Ù.

VBAâÀ»
¿¾úÀ» ¶§ ¿ÞÂÊ ÇÁ·ÎÁ§Æ® Ž»ö±â¿¡ ÀÌ¹Ì xlwings.xlamÆÄÀÏÀÌ ¿·ÁÀÖ´Â °É È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÇÁ·ÎÁ§Æ® Ž»ö±â¿¡ ÅëÇÕ¹®¼1°ú
xlwings.xlamÆÄÀÏÀÌ ¿·ÁÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. xlwings.xlamÆÄÀÏÀÌ ¿¢¼¿À» ½ÇÇà½Ãų ¶§¸¶´Ù ¿·Á¼ VBA¿Í ÆÄÀ̽ãÀ» ¿¬°áÇØÁÖ´Â
Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù.

¿©±â±îÁö
¼³Á¤Çϸé VBA¿¡¼ ÆÄÀ̽ã Äڵ带 ½ÇÇàÇÏ´Â µ¥ ¹®Á¦°¡ ¾ø´Ù. ±×·±µ¥ ÇÊÀÚ°¡ Å×½ºÆ®Çغ» °á°ú Á» ºÒÆíÇÑ Á¡ÀÌ ÀÖ´Ù. ÆÄÀÌ½ã ÆÄÀÏÀÌ ¿¢¼¿ ÆÄÀϰú °°Àº
µð·ºÅ丮¿¡ ÀÖ¾î¾ß ÇÏ°í ÆÄÀÏÀ̸§µµ °°¾Æ¾ß ÇÑ´Ù. »ó»óÇØº¸ÀÚ. ¿¢¼¿ ÆÄÀÏÀº ³»°¡ Áö±Ý ÀÏÇϰí ÀÖ´Â ÇÁ·ÎÁ§Æ® µð·ºÅ丮¿¡ Àִµ¥ ¸Å¹ø ÆÄÀ̽ã Äڵ带
¿¢¼¿ÆÄÀÏÀÌ ÀÖ´Â °÷¿¡ º¹»çÇØ¼ ½á¾ß ÇÑ´Ù¸é ¿©°£ ºÒÆíÇÑ °ÍÀÌ ¾Æ´Ò °ÍÀÌ´Ù.
±×·¡¼
Á» ¹ø°Å·ÓÁö¸¸ ¼³Á¤À» ´õ ÇÏÀÚ. ÆÄÀ̽ã Äڵ尡 ÀÖ´Â À§Ä¡¿Í ÆÄÀÌ½ã ÆÄÀÏ À̸§À» ÁöÁ¤ÇØÁÖ´Â °úÁ¤ÀÌ´Ù.
xlwings¼³Á¤
ÆÄÀÏÀ» ã¾Æ¼ ¼öÁ¤ÇØÁÙ °ÍÀÌ´Ù. xlwings¼³Á¤ ÆÄÀÏÀº c:\users\»ç¿ëÀÚÀ̸§\.xlwings µð·ºÅ丮¿¡ ÀÖ´Â xlwings.conf ÆÄÀÏÀÌ´Ù. ÀÌÆÄÀÏÀ» ¿¾î
"PYTHONPATH","" ¿Í "UDF MODULES",""ÀÇ °ªÀ» ¹Ù²ãÁÖ¸é
µÈ´Ù.
"PYTHONPATH"´Â
ÆÄÀ̽ã Äڵ尡 ÀÖ´Â µð·ºÅ丮´Ù. ¿ì¸® ¿£Áö´Ï¾î¸µ¼Ò¼ÈÄÚµù¿¡¼ ¸¸µç ÄÚµåµéÀ» C:\ESC µð·ºÅ丮¿¡ ¸ð¾Æ³õ±â·Î ÇÏÀÚ.
"PYTHONPATH","C:\ESC" ÀÌ·¸°Ô ¼öÁ¤ÇØÁÖÀÚ. ÀÌÁ¦ ¿¢¼¿¿¡¼ ÆÄÀÌ½ã ÆÄÀÏÀ» ½ÇÇà½ÃŰ¸é ¿ì¼± ¿¢¼¿ÆÄÀÏÀÌ
ÀÖ´Â µð·ºÅ丮¿¡¼ ÆÄÀÏÀ» ã°í ¾øÀ¸¸é PYTHONPATH¿¡ ¼³Á¤µÈ µð·ºÅ丮¿¡¼ ã°Ô µÈ´Ù.
À̹ø¿¡´Â
UDF MODULES¸¦ ¼³Á¤ÇÒ Â÷·Ê´Ù. ÀÌ ¼³Á¤Àº UDF(User Defined Function, »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö)¸¦ »ç¿ëÇϱâ À§ÇÑ ¼³Á¤ÀÌ´Ù.
¿ì¸®´Â ö±ÙÄÜÅ©¸®Æ® °ü·Ã ±â´ÉµéÀ» ¸ð¾Æ³õÀº ÆÄÀ̽㠼ҽº ÆÄÀÏÀ» rcworks.py¶ó°í ¸¸µé ¿¹Á¤ÀÌ´Ù. ÆÄÀ̽ã ÄÚµå ÆÄÀϸíÀ» ½áÁÖ¸é µÈ´Ù. È®ÀåÀÚ´Â
Á¦¿ÜÇÏ°í ÆÄÀÏÀ̸§¸¸ ½áÁØ´Ù.
"UDF
MODULES","rcworks"
±×·¯¸é
xlwings.confÀÇ Àüü ³»¿ëÀº ¾Æ·¡¿Í °°´Ù. ´Ù¸¥ ¼³Á¤ Ç׸ñµéµµ Àִµ¥ xlwings °ø½Ä »çÀÌÆ®ÀÇ °ü·Ã ÆäÀÌÁö¸¦ ÂüÁ¶ÇÏÀÚ. https://docs.xlwings.org/en/stable/addin.html Add-in & Settings
"CONDA PATH","C:\ProgramData\Anaconda3"
"CONDA
ENV","base"
"PYTHONPATH","c:\esc"
"SHOW
CONSOLE","False"
"UDF
MODULES","rcworks"
|
ÀÌ·¸°Ô
VBA¿Í ÆÄÀ̽ãÀ» ¿¬µ¿Çϱâ À§ÇÑ ¼³Á¤Àº ³¡³µ´Ù.
3. VBA¿¡¼ ÆÄÀ̽㠽ÇÇàÇϱâ
ÀÌÁ¦
VBA¿¡¼ ÆÄÀ̽ã Äڵ带 ½ÇÇàÇØº¸ÀÚ. ¿ì¼± ÆÄÀ̽ã Äڵ带 ¸¸µéÀÚ. ÆÄÀÏ À̸§Àº rcworks.pyÀ̰í c:\esc µð·ºÅ丮¿¡ ÀúÀåÇÏÀÚ.
ÀÌ
ÆÄÀ̽ã ÄÚµå´Â µÎ °³ÀÇ ±â´ÉÀÌ ÀÖ´Ù Çϳª´Â ÇÊ¿ä ö±Ù·®À» ±¸ÇØÁÖ´Â ÇÔ¼ö(udf_cal_As)ÀÌ°í ¶Ç Çϳª´Â ÇÊ¿ä ö±Ù·® »êÁ¤ Å×À̺íÀ» ¸¸µé¾îÁÖ´Â
ÇÔ¼ö(reqAsTable)´Ù. reqAsTableÀº ¿¢¼¿¿¡ ÇÊ¿äö±Ù·® »êÁ¤¿ë Å×À̺íÀ» ¸¸µå´Â ±â´ÉÀ̰í, udf_cal_As´Â ¿¢¼¿ÇÔ¼öó·³ »ç¿ëÇÒ
ö±Ù·®À» »êÁ¤ÇØÁÖ´Â UDF´Ù.
Áö±Ý
¸¸µé·Á´Â ±â´ÉÀº ¸ÅÅ©·Î(reqAsTable)¸¦ ½ÇÇà½Ã۸é ÇöÀç ¼±ÅÃµÈ ¼¿(A2)¿¡ Å×À̺íÀ» ¸¸µç´Ù. ÀÌ Å×À̺íÀº ÇÊ¿äö±Ù·®À» ±¸Çϴµ¥ ÇÊ¿äÇÑ µ¥ÀÌÅ͵é°ú
¸¶Áö¸· Ä®·³(K3)¿¡ udf_cal_AsÇÔ¼ö¸¦ »ðÀÔÇØÁØ´Ù. udf_cal_AsÇÔ¼ö´Â A3~J3±îÁöÀÇ ¼¿ÀÌ ¹°·Á ÀÖ´Ù. ¿¹Á¦¸¦ Çϳª ¸¸µé¾î Áشٰí
»ý°¢ÇÏ¸é µÇ°Ú´Ù. ¿©·¯ ´Ü¸éÀÇ Ã¶±Ù·®À» ±¸ÇÒ ¶§ ÀÌ Å×À̺íÀ» ÀÌ¿ëÇÏ¸é ÆíÇÏ´Ù. ±âº»Å×À̺íÀÇ ³»¿ëÀ» ¼öÁ¤ÇÏ°í º¹»çÇØ¼ ¿©·¯ ´Ü¸éÀÇ ÇÊ¿äö±Ù·®À» ±¸ÇÒ
¼ö ÀÖ´Ù.

ÀÌ
±â´ÉÀ» ¸¸µé±â À§Çؼ´Â ÆÄÀ̽ã ÂÊ¿¡¼ ÇØ¾ß ÇÏ´Â ÀÛ¾÷ÀÌ ÀÖ°í VBAÂÊ¿¡¼ ÇØ¾ßÇÏ´Â ÀÛ¾÷ÀÌ ÀÖ´Ù. ¿ì¼± ÆÄÀ̽ã ÂÊ¿¡¼ ÄÚµùÀ» ÇØº¸ÀÚ. ÆÄÀϸíÀº
rcworks.pyÀÌ°í µð·ºÅ丮´Â C:\ESCÀÌ´Ù.
import xlwings as xw
def reqAsTable():
wb = xw.Book.caller()
sheet = wb.sheets[0]
seladd = wb.app.selection.address
formula="=udf_cal_As(" + ",".join(sheet[seladd].offset(1,i).address.replace("$","") for i in range(0,10)) + ")"
tblhead = ["¥Õc", "¥Õs", "¥á", "¥â", "fck(MPa)", "fy(MPa)", "B(mm)", "H(mm)", "d'(mm)", "Mu(kN.m)", "reqAs(mm)"]
row1 = [0.65, 0.9, 0.8, 0.4, 30, 400, 1000, 800, 80, 100, 0]
tbl = [tblhead,row1]
sheet[seladd].value = tbl
sheet[seladd].offset(1,10).formula=formula
@xw.func
def udf_cal_As(pi_c, pi_s,
alpa, beta, fck, fy, B, H, dp, Mu):
""" Calculate required
As"""
return cal_As(pi_c, pi_s, alpa, beta, fck, fy, B,
H, dp, Mu)
def cal_As(pi_c, pi_s,
alpa, beta, fck, fy, B, H, dp, Mu):
d = H-dp
# V1,2,3 : V1*As©÷+V2*As+V3=0
V1 = beta*pi_s**2*fy**2/(alpa*pi_c*0.85*fck*B)
V2 = pi_s*fy*d
V3 = Mu*10**6
As = (V2-(V2**2-4*V1*V3)**0.5)/(2*V1)
return As
if __name__ == "__main__":
print(cal_As(0.65, 0.9, 0.8, 0.4, 30, 400, 1000, 800, 80, 100))
|
ÀÌ
ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ 5°³ÀÇ ÆÄÆ®µé·Î ±¸¼ºÀ» °¡Áø´Ù.
xlwings¸¦
importÇÏ´Â ºÎºÐ : import xlwings as xw
Å×À̺íÀ»
¸¸µé¾îÁÖ´Â ÇÔ¼ö : def reqAsTable():
¿¢¼¿
UDF¸¦ Á¤ÀÇÇÏ´Â ÇÔ¼ö : def udf_cal_As( ~ ):
ÇÊ¿äö±Ù·®
±¸ÇÏ´Â ÇÔ¼ö : cal_As( ~ ):
Å×½ºÆ®¸¦
À§ÇÑ ºÎºÐ : if __name__ ~
ÀÌ
Àý¿¡¼´Â VBA¿¡¼ ÆÄÀ̽ã Äڵ带 ½ÇÇàÇÏ´Â ³»¿ëÀ̹ǷΠreqAsTable() ÇÔ¼ö¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸°Ú´Ù. ¿¢¼¿¿¡¼ ÆÄÀ̽ã Äڵ带 ½ÇÇàÇϱâ
À§Çؼ´Â VBA°¡ ÇÊ¿äÇÏ´Ù. VBA¿¡¼ ÆÄÀÌ½ã ÆÄÀÏÀ» ºÒ·¯¿Í ½ÇÇàÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù.
¿¢¼¿ÀÇ
[°³¹ß µµ±¸]¸Þ´º¿¡¼ [Visual Basic]À» ¼±ÅÃÇÏÀÚ. VBA âÀÌ ¶ã °ÍÀÌ´Ù. ¿©±â¼ »õ·Î¿î VBAÄڵ带 Ãß°¡Çϱâ À§Çؼ ¿ÞÂÊÀÇ ÇÁ·ÎÁ§Æ®
Ž»ö±â¿¡¼ ÀÚ½ÅÀÇ ¿¢¼¿ÆÄÀÏ¸í¿¡ ¿À¸¥ÂÊ ¸¶¿ì½º¸¦ Ŭ¸¯ÇÑ ÈÄ [»ðÀÔ(N)]À» ¼±ÅÃÇϰí [¸ðµâ(M)]À» ¼±ÅÃÇÑ´Ù.
±×·¯¸é
¾Æ·¡ ±×¸²Ã³·³ »õ·Î¿î ¸ðµâÀÌ Ãß°¡ µÈ´Ù. ¸ðµâÀ̸§Àº ±âº»ÀûÀ¸·Î Module1À¸·Î ¸¸µé¾îÁø´Ù. ÀÌ ¸ðµâ¿¡ ÆÄÀ̽ã Äڵ带 ½ÇÇàÇÏ´Â VBA Äڵ带 Ãß°¡ÇÒ
°ÍÀÌ´Ù. VBA¸¦ Àß ¸ð¸¥´Ù°í ÇØµµ °ÆÁ¤ÇÒ ÇÊ¿ä ¾ø´Ù. ¾ÆÁÖ ´Ü¼øÇÏ°í ÆÄÀ̽ã°ú Å©°Ô ´Ù¸£Áö ¾Ê´Ù.

ȸéÀÇ
¿À¸¥ÂÊ¿¡ Module1ÀÇ ¼Ò½ºÄڵ带 ÀÔ·ÂÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ Äڵ带 ÀÔ·ÂÇÏÀÚ. VBAÄÚµåÀε¥ SubÀº ÆÄÀ̽ãÀÇ def¿Í °°Àº °³³äÀÌ´Ù. ¸¶Áö¸·ÀÇ
End subÀº ÇÔ¼ö ¼±¾ðÀÇ ¸¶Áö¸·ÀÓÀ» Ç¥½ÃÇÑ´Ù. ´Ü ¼¼ÁÙÀÌ´Ù.
Sub reqAsTable()
RunPython "import
rcworks;rcworks.reqAsTable()"
End Sub
|
RunPython
´ÙÀ½¿¡ ÆÄÀ̽㠸í·ÉÀ» ½áÁÖ¸é µÈ´Ù. import¹®À¸·Î rcworks¸¦ ºÒ·¯¿À°í rcworks.reqAsTable() ¸í·ÉÀ¸·Î
reworks.py¾È¿¡ ÀÖ´Â reqAsTableÇÔ¼ö¸¦ ½ÇÇà½Ã۶ó´Â ¸í·ÉÀÌ´Ù. µÎ°³ÀÇ ¸í·ÉÀÌ ;·Î ±¸ºÐµÇ¾îÀÖ´Ù. rcworks.pyÆÄÀÏÀº
ÇöÀç ¿¢¼¿ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ͸®¿Í xlwings.conf¿¡¼ ¼³Á¤ÇÑ PYTHONPATH¿¡¼ ã¾Æ¼ importÇÑ´Ù.
ÀÌÁ¦
ÆÄÀ̽㠸ÅÅ©·Î¸¦ ½ÇÇàÇÒ Áغñ´Â ³¡³µ´Ù. ¸ÅÅ©·Î¸¦ ½ÇÇàÇØº¸ÀÚ. ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀº ¿¢¼¿ÀÇ [°³¹ß µµ±¸]¸¦ ¼±ÅÃÇÑ ´ÙÀ½ [¸ÅÅ©·Î]¸¦ ¼±ÅÃÇÑ´Ù.
±×·¯¸é ÇöÀç ÆÄÀÏ¿¡¼ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸ÅÅ©·Î ¸®½ºÆ®°¡ ¶á´Ù. VBA¿¡ Ãß°¡µÈ ¸ðµâµé ¾È¿¡ sub·Î Á¤ÀÇµÈ ¸ÅÅ©·ÎµéÀÇ ¸®½ºÆ®¸¦ º¸¿©ÁØ´Ù.
reqAsTable
¸ÅÅ©·Î¸¦ ¼±ÅÃÇÑ ´ÙÀ½ [½ÇÇà(R)] ¹öưÀ» ´©¸£¸é ¸ÅÅ©·Î°¡ ½ÇÇàµÈ´Ù. ½ÇÇà °á°ú´Â ¾Æ·¡ ±×¸²°ú °°´Ù. ¸ÅÅ©·Î¸¦ ½ÇÇàÇϱâ Àü¿¡ ¼±ÅõǾú´ø ¼¿¿¡ Å×À̺íÀÌ
±×·ÁÁø´Ù. A2 ¼¿¿¡¼ ¸ÅÅ©·Î¸¦ ½ÇÇàÇ߱⠶§¹®¿¡ A2 :K3
¿µ¿ª¿¡ Å×À̺íÀÌ ¸¸µé¾îÁ³´Ù.

¾Æ¸¶µµ
¿©·¯ºÐÀº À§ ±×¸²°ú °°Àº °á°ú°¡ ³ª¿ÀÁö ¾Ê°í ¾Æ·¡ ±×¸²°ú °°Àº °á°ú°¡ ³ª¿ÔÀ» °ÍÀÌ´Ù.

¼¿
ÁÖ¼Ò K3¿¡ µé¾îÀÖ´Â ³»¿ëÀ» È®ÀÎÇØº¸¸é ¾Æ·¡ ±×¸²°ú °°ÀÌ Á¦´ë·Î ¼ö½ÄÀÌ ¹°·Á ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ±×·±µ¥ ¿Ö #NAME?À̶ó´Â °á°ú¸¦ º¸¿©ÁÖ´Â
°ÍÀϱî? ¿¢¼¿¿¡¼ #NAME? ¿¡·¯´Â ±×·± ÇÔ¼ö°¡ ¾ø´Ù´Â ¶æÀÌ´Ù.

ºÐ¸í
ÆÄÀÌ½ã ÆÄÀÏ(rcworks.py)¿¡¼ @xw.func µ¥ÄÚ·¹ÀÌÅÍ·Î def udf_cal_As() ÇÔ¼ö¸¦ °¨½ÎÁÖ¾úÀ¸´Ï Á¦´ë·Î ÀÛµ¿ÇØ¾ß ÇÏ´Â °ÍÀÌ
¾Æ´Ò±î?
¾Õ¿¡¼
¡®ÆÄÀ̽ã Äڵ常À¸·Î ½ÇÇàµÇÁö ¾Ê°í VBAÄڵ带 ÅëÇØ¼ ½ÇÇàÇØ¾ß ÇÑ´Ù¡¯´Ù°í Çß´Ù. reqAsTableµµ ÆÄÀ̽㿡¼ Á¤ÀÇÇϰí
VBA¿¡¼µµ Á¤ÀÇÇß´Ù. UDFµµ ¸¶Âù°¡Áö·Î VBA¿¡¼µµ Á¤ÀÇÇØÁà¾ß ÇÑ´Ù. UDF¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀº ´ÙÀ½ Àý¿¡¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
4. »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö(UDF)
UDF¸¦
Á¤ÀÇÇϱâ À§Çؼ´Â ÆÄÀ̽ã ÂÊ¿¡¼ ¼±¾ðÇØÁÖ°í VBA ÂÊ¿¡¼µµ ¼±¾ðÇØÁà¾ß ÇÑ´Ù. ÆÄÀ̽ã ÂÊ¿¡¼ ¼±¾ðÇÏ´Â ¹æ¹ýÀº @xw.func µ¥ÄÚ·¹ÀÌÅÍ·Î °¨½ÎÁÖ¾ú´Ù.
@xw.func
def udf_cal_As(pi_c, pi_s,
alpa, beta, fck, fy, B, H, dp, Mu):
""" Calculate required
As"""
return cal_As(pi_c, pi_s, alpa, beta, fck, fy, B,
H, dp, Mu)
|
def
udf_cal_As( ):ÀÇ ¾ÕÁÙ¿¡ @xw.func¶ó´Â ¹®ÀåÀÌ ³ª¿Â´Ù. ÀÌ ºÎºÐÀÌ ¹Ù·Î ¿¢¼¿¿¡°Ô UDF¶ó´Â °ÍÀ» ¾Ë·ÁÁÖ´Â ºÎºÐÀÌ´Ù.
@·Î ½ÃÀÛÇÏ´Â °ÍÀº µ¥ÄÚ·¹ÀÌÅͶó°í ÇÑ´Ù. ±×³É ´Ù¸¥ ÇÔ¼ö¸¦ °¨½ÎÁÖ´Â ÀÏÁ¾ÀÇ ÇÔ¼ö¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. udf_cal_As°¡ ¿¢¼¿¿¡¼ »ç¿ëÇÒ ÇÔ¼ö
À̸§ÀÌ´Ù. def¹® ¾Æ·¡¿¡ ¼¼°³ÀÇ µû¿ÈÇ¥·Î ½Î¿©Áø ¹®ÀÚ´Â ÇÔ¼öÀÇ ¼³¸íÀÌ´Ù. ¿¢¼¿¿¡¼ [¼ö½Ä]¸Þ´ºÀÇ ÇÔ¼ö »ðÀÔÀ» ´·¶À» ¶§ º¼ ¼ö ÀÖ´Ù.


VBA
Äڵ带 Ãß°¡ÇØÁà¾ß UDF°¡ Á¦´ë·Î ÀÛµ¿ÇÑ´Ù. reqAsTableµµ VBA¿¡¼ ¸ÅÅ©·Î¸¦ Ãß°¡Çß´ø °ÍÀ» ±â¾ïÇÏÀÚ. ÇöÀçÀÇ ¿¢¼¿ ÆÄÀÏ¿¡¼ ÆÄÀ̽ãÀ¸·Î
ÀÛ¼ºÇÑ UDF¸¦ »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇØÁÖ¸é µÈ´Ù.
¿¢¼¿ÀÇ
[xlwings] ¸Þ´º¸¦ ´·¯º¸ÀÚ. Import Functions ¹öưÀ» ´·¯ÁÖ¸é ¼³Á¤ ³¡ÀÌ´Ù.

±×·±µ¥
ÀÌ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é ÇѰ¡Áö ¼³Á¤À» ´õ ÇØÁà¾ß ÇÑ´Ù. [°³¹ß µµ±¸]ÀÇ [¸ÅÅ©·Î º¸¾È]À» ´©¸¥ ´ÙÀ½ [°³¹ßÀÚ ¸ÅÅ©·Î ¼³Á¤] ÀÇ ¡®VBA ÇÁ·ÎÁ§Æ®
°³Ã¼ ¸ðµ¨¿¡ ¾ÈÀüÇÏ°Ô ¾×¼¼½ºÇÒ ¼ö ÀÖÀ½¡¯À» ÄÑÁÖÀÚ. Import Functions¸¦ ´©¸£¸é xlwings°¡ VBAÇÁ·ÎÁ§Æ®¿¡ ¼Ò½ºÄڵ带 Á÷Á¢ Ãß°¡Çϱâ
¶§¹®¿¡ À̰ÍÀÌ ÄÑÁ® ÀÖ¾î¾ß ÇÑ´Ù.
ÀÌÁ¦
[xlwings] ¸Þ´ºÀÇ [Import Functions]¸¦ ´·¯º¸ÀÚ. ¾Æ¹« Àϵµ ¹ú¾îÁöÁö ¾Ê´Â´Ù. ±×·¡µµ µî·ÏÀº ³¡³µ´Ù. ÀÌ ¹öưÀ» ´©¸£¸é
xlwings°¡ xlwings.confÆÄÀÏ¿¡ ÀÖ´Â "UDF MODULES","rcworks" ¼³Á¤¿¡¼ ÁöÁ¤ÇÑ
ÆÄÀÏÀÎ rcworks.py ÆÄÀÏÀ» ã¾Æ¼ @xw.func·Î °¨½ÎÁø ÇÔ¼öµéÀ» ã¾Æ¼ µî·ÏÇØÁØ´Ù. ¾îµð´Ù µî·ÏÀ» ÇÏ´Â °ÍÀϱî? VBA¸¦ ¿¾îº¸ÀÚ.

import
functions¸¦ ´©¸£±â Àü¿¡´Â ¾ø¾ú´ø xlwings_udfs ¸ðµâÀÌ Ãß°¡µÈ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¸ðµâÀÇ ³»¿ëÀ» º¸ÀÚ. º¹ÀâÇÏ´Ù. ¿ì¸®°¡ ÀÌ
ÄÚµåÀÇ ³»¿ëÀ» ¾Ë ÇÊ¿ä´Â ¾ø´Ù. ´ëÃæ º¸¸é Function udf_cal_As(~)À¸·Î ½ÃÀÛÇØ¼ End FunctionÀ¸·Î ³¡³µ´Ù. VBA·Î
UDF¸¦ Á¤ÀÇÇÏ´Â ¹æ¹ýÀÌ´Ù.
Function udf_cal_As(pi_c, pi_s, alpa, beta,
fck, fy, B, H, dp, Mu)
#If App = "Microsoft Excel" Then
If TypeOf
Application.Caller Is Range Then On Error GoTo failed
udf_cal_As = Py.CallUDF("rcworks", "udf_cal_As", Array(pi_c,
pi_s, alpa, beta, fck, fy, B, H, dp, Mu), ThisWorkbook, Application.Caller)
Exit Function
#Else
udf_cal_As = Py.CallUDF("rcworks", "udf_cal_As", Array(pi_c,
pi_s, alpa, beta, fck, fy, B, H, dp, Mu))
Exit Function
#End If
failed:
udf_cal_As = Err.Description
End Function
|
Áß°£
Âë¿¡ udf_cal_As = Py.CallUDF(¡°rcworks¡±, ¡°udf_cal_As¡±, ~ ) ÀÌ·± ºÎºÐÀÌ ÀÖ´Ù. rcworks.pyÆÄÀÏÀÇ
udf_cal_As ÇÔ¼ö¿¡ ´ëÇØ Á¤ÀÇÇϰí ÀÖ´Â °ÍÀ¸·Î º¸ÀδÙ. ÀÌ ÄÚµåÀÇ ³»¿ëÀº ÀÚ¼¼ÇÏ°Ô ¾Ë ÇÊ¿ä´Â ¾ø´Ù. import functions¹öưÀ»
´©¸£¸é ÀÌ Äڵ尡 ÀÚµ¿À¸·Î »ý¼ºµÇ±â ¶§¹®ÀÌ´Ù.
4. ¸ËÀ½¸»
À̹ø
½Ã°£¿¡´Â xlwings¸¦ ÀÌ¿ëÇØ¼ ¿¢¼¿ÀÇ VBA¿Í ÆÄÀ̽ãÀ» ¿¬µ¿ÇÏ´Â ¹æ¹ýÀ» ¾Ë¾ÆºÃ´Ù. µÎ °¡Áö ±â´ÉÀ» ¾Ë¾ÆºÃ´Âµ¥ Çϳª´Â ¸ÅÅ©·Î°í Çϳª´Â »ç¿ëÀÚÁ¤ÀÇ
ÇÔ¼ö(UDF)´Ù. ¸ÅÅ©·Î´Â ÀϰýÀÛ¾÷À» ÇÏ´Â °ÍÀÌ¶ó¼ ÆÄÀ̽ã ÂÊ¿¡¼ ½ÇÇàÇÏ´Â °Í°ú Å©°Ô ´Ù¸£Áö ¾Ê°í VBAÂÊ¿¡¼ sub·Î ¸ÅÅ©·Î¸¦ µî·ÏÇÏ°í ÆÄÀ̽ã
ÆÄÀÏÀ» ½ÇÇàÇÏ´Â °³³äÀ̾ú´Ù. UDF´Â ÆÄÀ̽ãÀÇ ÇÔ¼ö¸¦ ¸¶Ä¡ ¿¢¼¿ÀÇ ÇÔ¼öÀÎ °Íó·³ ¿¢¼¿¿¡¼ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. UDF´Â ¸ÅÅ©·Î¿¡ ºñÇØ¼ ¼³Á¤ÇÒ °ÍÀÌ
Á» ¸¹´Ù. ÇÏÁö¸¸ ÆÄÀ̽ãÀ¸·Î ¸¸µç ÇÔ¼öµéÀ» ¿¢¼¿¿¡¼µµ ¾µ ¼ö Àֱ⠶§¹®¿¡ ÄÚµå ÅëÇÕÀÌ °¡´ÉÇÏ°í °ü¸®°¡ ÆíÇÒ °ÍÀÌ´Ù.4
-³¡-
¿¹Á¦ÆÄÀÏ :
rcworks.zip
- rcworks.py´Â C:\ESC¿¡ º¹»ç
- py1.xlsm ÆÄÀÏÀº ¿øÇÏ´Â ¾Æ¹« Æú´õ¿¡ º¹»ç ÈÄ py1.xlsmÆÄÀÏÀ» ¿±â.