13. Áߺ¹ µ¥ÀÌÅÍ Ã³¸® -
¸¶¹«¸®
ÀÚ·á´Ù¿î·Îµå : ¿ÀÆ©°ø±¸ÇÔ013.xls
ÀÚ·á´Ù¿î·Îµå : Áߺ¹µ¥ÀÌÅÍ_¿¬½ÀÆÄÀÏ.xls
¾È³çÇϼ¼¿ä ¿ÀÆ© °¡Á· ¿©·¯ºÐ
¿À´ÃÀº Áߺ¹µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â ¹æ¹ýÀ» ´Ù·ê Â÷·ÊÀÔ´Ï´Ù. ±×·±µ¥ Áö³ Ä÷³¿¡¼ Á¦°¡ 3ºÎÀÛ¿¡ °ÉÃÄ Áߺ¹µÈ µ¥ÀÌÅ͸¦ º¹»çÇϰųª °Å²Ù·Î º¹»çÇÏ´Â ³»¿ëÀ» ¾ê±âÇÑ °ÍÀÌ ÀÖ¾ú½À´Ï´Ù. ±×·¡¼ ±×¶§ÀÇ ¸ðµâÀ» µÇ»ì·Á ¿ÀÆ©°ø±¸ÇÔ¿¡ ºÙ¿´½À´Ï´Ù. ±×·±µ¥ ºÙÀ̸é¼
¸î °¡Áö ¼Óµµ Çâ»ó°ú ¾ÈÁ¤ÀûÀÎ ÇÁ·Î±×·¥ ¼öÇàÀ» À§ÇÑ ¸î °¡ÁöÀÇ Äڵ带 Ãß°¡ÇÏ¿´½À´Ï´Ù. ±â´ÉÀº ±×¶§ ±×´ë·Î ÀÔ´Ï´Ù.
¸ÕÀú ¿¢¼¿VBA¿¡¼ ÇÒ ¼ö ÀÖ´Â °£´ÜÇÑ ¼ÓµµÇâ»óÀ» À§ÇÑ ÆÁÀ» º¸¿©µå¸®ÁÒ(»ç½Ç ÀÌ¹Ì ¿©·¯ºÐµéÀÌ ¾Æ½ÇÅ×Áö¸¸)
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
ÁÖ¿äÀÛ¾÷ ½ÇÇࡦ
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
|
Application°³Ã¼ÀÇ ¼Ó¼ºÀ» ´Ù·ç°í ÀÖ½À´Ï´Ù. ȸ鿡 °ü·ÃÇÑ °Í, À̺¥Æ®¿Í °ü·ÃÇÑ °Í, °è»ê°ú °ü·ÃµÈ °ÍÀÔ´Ï´Ù.
Application.ScreenUpdatingÀº ȸéÀÇ °»½ÅÀ» ÁöÁ¤ÇÏ´Â °ÍÀÔ´Ï´Ù. ±âº»ÀûÀ¸·Î »ç¿ëÀÚ°¡ ¾î¶°ÇÑ ÀÛ¾÷À» Çϰųª Á¶ÀÛÀ» ÇÒ¶§¸¶´Ù ¿¢¼¿Àº ¹°·Ð À©µµ¿ì½Ã½ºÅÛÀÚüµµ ȸéÀ» ´Ù½Ã ±×¸³´Ï´Ù. ±×¼Óµµ°¡ ¸Å¿ì »¡¶ó ¿ì¸®ÀÇ ´«À¸·Î´Â º¸ÀÌÁö ¾Ê½À´Ï´Ù. Ȥ½Ã º¸ÀÎ´Ù¸é ¿©·¯ºÐÀÇ ´«ÀÌ ¾ÆÁÖ ÁÁ°Å³ª »ç¿ëÇϽô ÄÄÇ»ÅÍ°¡ ±Àº¬ÀÌ Ä£Ã´Âë µÉ °Ì´Ï´Ù. TVÇÁ·Î±×·¥¿¡¼ ÄÄÇ»ÅÍÀ» ÃÔ¿µÇÑ °ÍÀ» º¸¸é ȸéÀÌ À§¿¡¼ ¾Æ·¡·Î, ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀ¸·Î ±ôºý°Å¸®´Â °ÍÀ» º¸¼ÌÁÒ. Æò¼Ò¿¡´Â ¿ì¸®ÀÇ ´«ÀÌ ³Ê¹« ´À·Á º¸Áú ¸øÇÏÁö¸¸ ¿ì¸® ´«º¸´Ù ºü¸¥ Ä«¸Þ¶ó¸¦ ÅëÇØ º¸½Å °Ì´Ï´Ù. (±×·¯¹Ç·Î º¸ÀÌ´Â °Ô Áø½ÇÀº ¾Æ´Õ´Ï´Ù)
´Ù½Ã Application.ScreenUpdatingÀ¸·Î µ¹¾Æ¿Í¼ ÀÌ ¼Ó¼ºÀ» FALSE·Î ÁÖ¸é ¿¢¼¿Àº ȸéÀ» ¹Ù²Ù¾î ÁÖÁú ¾Ê½À´Ï´Ù. ±×·¯¹Ç·Î ȸéÀ» ¹Ù²Ù´Â ÀÛ¾÷À» ÇÏÁö ¾Ê´Â ´ë½Å ´Ù¸¥ ÀÛ¾÷À» ´õ ¸¹ÀÌ ÇÒ ¼ö ÀÖ¾î ¼ÓµµÇâ»ó¿¡ ±â¿©ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸ðµç ÀÛ¾÷ÀÌ ³¡³ª¸é °ªÀ» ´Ù½Ã TRUE·Î ¼³Á¤ÇÏ¿© ¿¢¼¿ÀÌ È¸é°»½ÅÀÛ¾÷À» Çϵµ·Ï ÇÏ¿© ¿ì¸®°¡ ÆíÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ƯÈ÷ ¿öÅ©½ÃÆ®¿¡ ¸¹Àº ÀڷḦ ¾²´Â °æ¿ì ¼ÓµµÇâ»óÀ» ü°¨ÇÏ½Ç ¼ö ÀÖÀ» °Ì´Ï´Ù.
Application.EnableEvents´Â ¸» ±×´ë·Î À̺¥Æ®¿Í °ü·ÃµÈ °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ¿¢¼¿ÅëÇÕ¹®¼¿¡ Private Sub Worksheet_Change(ByVal Target As Excel.Range)¶óµç°¡, Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) °°Àº À̺¥Æ® ÇÁ·Î½ÃÁ®¸¦ µÐ °æ¿ì, ¿öÅ©½ÃÆ®¿¡ ¹«¾ð°¡¸¦ ¾²°Å³ª ÇöÀç ¼¿ À§Ä¡¸¦ ¹Ù²Ü¶§¸¶´Ù À̰͵éÀÌ ½ÇÇàµÉ °Í´Ï´Ù. ÀÛ¾÷¿¡ ÇÊ¿äÇÑ ÀÛ¾÷ÀÌ ¾Æ´Ï¶ó¸é ÀÌ·¯ÇÑ À̺¥Æ® ÇÁ·Î½ÃÁ®°¡ ÀÛµ¿ÇÏÁö ¾Ê´Â ÆíÀÌ ³´½À´Ï´Ù. ±×·¯¹Ç·Î Application.EnableEvents¸¦ FALSE·Î ¼³Á¤ÇÏ¿© À̺¥Æ®¸¦ ¹«½ÃÇϵµ·Ï ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
¿É¼ÇÀ» º¯°æÇÏÁö ¾Ê´Â ÇÑ ±âº»ÀûÀ¸·Î ¿¢¼¿Àº ÀÚµ¿°è»êÀ» ÇÕ´Ï´Ù. ¿öÅ©½ÃÆ®¿¡ ¹«¾ð°¡¸¦ ±â·ÏÇÒ ¶§¸¶´Ù ¿¢¼¿ÀÌ ÀÚµ¿°è»êÀ» ÇÏ°Ô µÇ¸é ÀÛ¾÷½Ã°£À» ³¶ºñÇÏ°Ô µË´Ï´Ù. ±×·¯¹Ç·Î ÁÖ¿ä ÀÛ¾÷ Àü¿¡ Application.CalculationÀ» ¼öµ¿(xlCalculationManual)À¸·Î ÇÏ°í ÀÛ¾÷ÀÌ ³¡³ª¸é ´Ù½Ã ÀÚµ¿(xlCalculationAutomatic )À¸·Î ÇØÁÝ´Ï´Ù.
ÀÌ»óÀ¸·Î VBA¿¡¼ ÇÒ ¼ö ÀÖ´Â ¼ÓµµÇâ»óÄڵ带 ¼Ò°³Çصå·È½À´Ï´Ù. ÀÌÁ¨ ÇÁ·Î±×·¥ÀÇ ¾ÈÁ¤ÀûÀÎ ½ÇÇàÀ» À§ÇÑ GetQueueStatus() APIÇÔ¼ö¸¦ ¼Ò°³Çص帮°Ú½À´Ï´Ù. ÀÌ°ÍÀº »ç½Ç VBAÀÇ DoEvents¿Í °°Àº ¿ªÇÒÀ» ÇÏÁö¸¸ ´õ ³ªÀº ¼º´ÉÀ» º¸¿©ÁÝ´Ï´Ù.
VBA¿¡¼ ½Ã°£ÀÌ »ó´çÈ÷ °É¸®´Â ÀÛ¾÷À» ÇÏ´Â °æ¿ì °¡·É For~Next, Do~Loopµîµî ±×³É ·çÇÁ¸¦ µ¹·Á¹ö¸®¸é À©µµ½Ã½ºÅÛÀÚü¸¦ °ÅÀÇ µ¶Á¡ÇÏ¿© ´Ù¸¥ ÀÛ¾÷À» ÇÒ ¼ö ¾ø´Ù´Â Á¡ÀÔ´Ï´Ù. °£È¤ Áß°£¿¡ ½Ã½ºÅÛÀÌ ´Ù¿îµÇ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ±×·¡¼ ¾Æ½Ã´Â ºÐµéÀº DoEvents¸¦ ¹Ýº¹ÄÚµå Áß°£¿¡ »ç¿ëÇÏ¿© ´Ù¸¥ ÇÁ·Î¼¼½º°¡ CPU¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿©À¯¸¦ ÁÝ´Ï´Ù.
±×·¯³ª DoEvents°¡ ³Ê¹« ´À·Á ÀÌ°É »ç¿ëÇϸé Àüü ÇÁ·Î±×·¥¼öÇàÀ» »ó´çÈ÷ ±À¶ß°Ô ÇÕ´Ï´Ù. ±×·¡¼ À̹ø¿¡ ¼Ò°³ÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ GetQueueStatus()¶ó´Â APIÇÔ¼öÀÔ´Ï´Ù. »ç¿ë¿¡ ¾Õ¼ ÀÌ°ÍÀÌ DoEventsº¸´Ù ¾ó¸¶³ª ºü¸¥Áö °á°ú¸¦ º¸¿©µå¸®ÁÒ(°á°ú´Â »ç¿ëÀÚ¸¶´Ù ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù)
With DoEvents by itself: 30.9296875 seconds
With GetQueueStatus check: 0.0390625 seconds |
GetQueueStatus()ÇÔ¼ö¸¦ »ç¿ëÇÑ °ÍÀÌ ¹«Áö ºü¸£ÁÒ!
´ÙÀ½Àº À§ÀÇ °á°ú¸¦ º¸¿©ÁØ ÇÁ·Î±×·¥¼Ò½ºÀÔ´Ï´Ù.
Option Explicit
Declare Function GetQueueStatus Lib "user32" (ByVal fuFlags As Long) As Long
Public Const QS_KEY = &H1
Public Const QS_MOUSEMOVE = &H2
Public Const QS_MOUSEBUTTON = &H4
Public Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Public Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Sub DoEventsTester()
Dim i As Long
Dim start As Long
start = Timer
For i = 1 To 100000
DoEvents
Next I
Debug.Print "With DoEvents by itself: "; Timer - start; " seconds"
start = Timer
For i = 1 To 100000
If GetQueueStatus(QS_INPUT) <> 0 Then DoEvents
Next I
Debug.Print "With GetQueueStatus check: "; Timer - start; " seconds"
End Sub |
»ó¼ö¸¦ º¸½Ã¸é ¾Ë°ÚÁö¸¸ Å°º¸µå¸¦ µÎµå¸®°Å³ª ¸¶¿ì½º¸¦ À̵¿Çϰųª ¸¶¿ì½º¹öÆ°À» Ŭ¸¯ÇÏ´Â °æ¿ì¸¦ GetQueueStatus()ÇÔ¼ö¿¡ Àμö·Î ÁöÁ¤ÇÕ´Ï´Ù.
À̹ø Ä÷³ÀÇ Ã·ºÎÆÄÀÏ¿¡´Â Áߺ¹µ¥ÀÌÅÍ ±â´ÉÀ» ½ÃÇèÇغ¸±â À§ÇÑ ¿¬½À¿ë ÆÄÀÏÀ» °°ÀÌ Ã·ºÎÇÕ´Ï´Ù. °°ÀÌ ´Ù¿î ¹ÞÀ¸¼Å¼ Çغ¸½Ã°í, ±â´É¿¡ ´ëÇؼ´Â ¾Õ¼ÀÇ Áߺ¹µ¥ÀÌÅÍó¸® Ä÷³(3ºÎÀÛ)À» Âü°íÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.
¿À´ÃÀº ¿©±â±îÁöÀÔ´Ï´Ù. ¼ö°íÇϼ¼¿ä.
|