안녕하세요. 

대용량데이타를 기반으로 한 계산값 도출시, 엑셀계산속도를 빠르게 하려고 궁리를 하다가 봉착한 문제인데 조언을 듣고자 합니다. 제가 셀에 최종결과값을 도출할 때 2가지 방식을 사용중인데 이 중에 무엇이 빠른 지를 알고자 합니다. 다음과 같이 2가지 방식 testA, testB 를 말씀드리겠습니다.

우선 아래는 testA 이고, 이 결과값은 A1 셀에 입력합니다. ( 이하 A 라 칭함 ) 

제가 속도를 빠르게 하고싶다고 말씀드렸는데 어떤 속도냐면 그것도 여기 예에서 함께 설명합니다. 

예: testA의 속도 :  3과 4를 더하기하여 7을 도출해내는 속도... 가 아니라....도출한 결과값 7을 A1셀에 뿌려주기까지의 속도라고 해야 더 정확하겠죠.... 가 아니라.. 이 7을 받아서 다른 곳에서 재계산을 수행하게끔 해주는 속도...라고 해야 정확할려나요(주석A: 제 질문이 왜 이런지는 아래에 설명)

Public var_a As Integer, var_b As Integer

Sub Gen()
    var_a = 3
    var_b = 4
End Sub

Sub testA()

    Call Gen
    
    a = var_a
    b = var_b
   
    Range("A1").Value = a + b  '// <--셀접근. 여기가 시간잡아먹는 곳
End Sub

아래는 testB 이고, 이 결과값은 A2 셀에 입력합니다. ( 이하 B 라 칭함 )

예:  셀에 입력된 각각의 파라미터 3과 4를 받아 7을 도출하여 이 7을 B1셀에 뿌려주.....고 말것도 없이 .. 이건 Function 이니까 리턴값으로 자동입력되겠네요. B1셀에는 =testB(B2,C2) 입력되어 있으니까요. 이렇게 3+4=7을 더하여 여기 셀에 뿌려주고.. 가 아니라.. 다른 곳에서 이 7을 가지고 재계산할 수 있게끔 해주는 속도.  여기도 말이 이상하지만...

'// B1 셀값 변동,  B1셀에는 =testB(B2,C2) 입력됨, 파라미터 a, b 는 3과 4 임
Function testB(a As Integer, b As Integer) testB = a + b End Function

위 A 와 B 중 어떤 방식이 속도가 더 빠를까요? 중요포인트는 이 결과값 A,  B 로 다른 계산을 해야합니다. 그래서 최대한 빠르게 결과값을 받아 다른 계산을 준비해야 합니다. 그리고 그게 또 다른 계산을 합니다. 위는 질문을 위하여  작성한 간단예제이고 실제 데이타는 대용량이고 수없는 반복계산을 하므로 결과값도출까지 시간이 걸리는 이슈가 있습니다. 저런 testA testB 같은게  수만개 셀 적재적소에서 동시다발 계산중이라 무슨 방식이 빠르냐가 큰 고민거리가 되는 상황입니다.

A에 대한 저의 의견 : 

제가 가장 두려워하는 문제가.... 여기 게시판을 통하여 공부하면서 알게된 사실이 [ 최대한 Cell.Value 접근을 줄이고, 메모리상에서 계산이 이루어져야 한다] 는 점인데요. 그런데 A 방식은 Range("A1").Value = a + b 에서 셀접근을 해야합니다. A1에 7을 뿌려주는 행위가 셀접근이잖아요. 여기 예제파일에서는 딱 1번뿐이지만 실제파일은 이런 셀접근이 자주 있습니다. 예를 들어 B546 셀을 받아서 aaa 라는 변수에 저장해라. 이런 식으로요. 이 점때문에 속도저하가 발생할 수도 있겠다는 두려움이 있습니다. 그래서 제가 위에서 (주석A: 제 질문이 왜 이런지는 아래에 설명)를 적어놓은 이유이고요.  결과값 7을 도출한 속도라기보다 이 7을 셀에 입력시키기까지의 속도라고 봐야 정확하다고봅니다. 맞나요?

B에 대한 저의 의견 : 

위 A에서 셀접근 두려움때문에 생각해 낸게 Function 이었습니다. 그리고 저는 이 function방식이  A보다 속도가 더 빠를 것으로 이해하고 있었습니다. 왜냐면 셀접근 필요없이 셀 그 자체에서 계산이 이루어지니까요(그리고 VBA가 아니어 인터프리터 방식이 아니고요. 맞는 말인지 모르겟지만).  위 A방식에서는 A1셀에 7을 뿌려라.. 이 행위가 셀접근인데 이 B 방식은 [ 내가 이미 function 으로 여기 A1 방에 입주해있다. 그러니 난 A1 방을 찾을 필요없이..시간지체없이.. 이 방에서 곧장 7을 꺼내버리면 된다. 그래서 7 결과값나오자 마자 이것으로 끝. 속도지연없음 ] 

... 라고 생각했었는데 지금은 생각이 바뀐게 [ 근데 넌 셀수식이 =testB(B2,C2)  라면 이것도 어차피 B2, C2 셀 접근을 해야 하지 않냐? 그러면 이것도 속도가 느려질 수 있다 ] 라고 생각이 들엇습니다. 그래서 A B 누가 더 빠를까? 결론을 못내다가.... 

 

현재 저의 생각 : 

그런데 자꾸 공부하다보니...  저 A, B 에서 말한 속도에 대한 정의부터 엑셀지향적이지 않고 인간지향적인 오해일 수도 있다는 우려가 새로 생겼습니다. 왜냐하면 셀접근 빈번하면 속도가 느려지는건 이해하지만(이건 확실히 제가 이해했습니다), 위에서 말한 [ 결과값을 셀에 입력시키는 시간 ]  은 [ 우리 인간에게 시각적으로 그 셀이 업데이트된 것을 느끼게 하려는 것일뿐, 엑셀은 이미 7을  받아서 셀에 뿌려주기 전에, 이미 다른 계산까지도 하러 이미 떠나버렸다(즉 엑셀은 인간의 눈으로 확인은 엄두도 못낼만큼  훨씬 더 속도가 빠르다) 즉 7을 가지고 또 다른 계산, 또 다른 게산, 또 다른 게산.... 을 이미 1천번도 더 했는데..  셀에 7이 입력되어지는 건 그 1천번 재계산 이후의 일일 수도 있다. 쉽게 말해...   KTX 가  광명을 지날때, 광명역 전광판에 [ 기차가 접근하고 잇다] 라고 안내할때, 이미 이 기차는 대전까지도 도착해 있다(대전승객탑승중 = 다음 계산 수행중) 인 것과 같은 상황이다. 기차가 전광판보다 더 빠르다. 왜 이런 생각을 했냐면요. 이미 7 이라는 결과값은 메모리 상에 저장되어 있잖아요. 그러면 엑셀입장에서는 이 값을 셀에 뿌려주고 말것도 없이 다른 계산을 수행할 수 있잖아요. 즉 셀에 7이 입력된 건, 이미 엑셀이 이 7을 가지고 1천번도 더 재계산을 한 이후에 일어난 일일 수도 있잖아요. 

여기에서 꼭 확실히 정의해야할 것 : 셀접근 빈번. 이 말은 제가 확실히 이해했습니다. 근데 여기에서 말한 셀접근과 셀업데이트는 구분해야 함. 어쨌든 엑셀이 셀업데이트 7 입력시키는 것을 속도에 포함시키면 안된다. 

...라는 것이 현재 저의 생각입니다. 

 

....라고 생각도 들지만 꼭 그런것 같지도 않아요. 내가 모르는 엑셀의 비밀이 또 잇다는 느낌이 또 듭니다. 어쨋든 현재까지 제 이해는..

이미 너무 속도가 빠르게 다른 계산으로 넘어가버렸는데.. (인간에게 시각적으로 보여주기 위한 걸 두고) 속도계산에도 포함시키면 안된다. 그래서 셀에 입력시키는 시간을 두고 속도 운운하는 건 기우이다. ] 라는 것입니다. 아~ 제 질문을 상세하게 드리고 싶은데.. 늘 느끼지만, 중언부연할수록 이상해지는 느낌도 있네요.  요약하면 아래와 같습니다.

 

조건: 결과값을 꼭 셀에 입력해줘야함. 메모리에서만 가지고 잇으면 안됨. 

질문 1 : 결과값 도출까지 위  A, B 중 누가 더 빠른가? 

질문 2 : 위 A, B 에서 받은 결과값으로 다른곳에서 다른 재계산 수행시 A, B 는 누가 더 빠르게 그 계산들을 도와줄까? ( 참조가 용이해질까? )

감사합니다.