안녕하세요.

사용자정의 함수(Function) 가 재계산되는 시기를 인터넷에서 찾아보면

파라미터 인수가 변동되었을 때라고 나옵니다. 인공지능도 동일한 설명을 합니다. 

예를 들어 ....

Public Function Test(a As Integer, b As Integer) As Integer
                        Test = a + b
End Function

와 같이 Test 라는 이름의 사용자정의함수가 있는데(이하 Test),  이를 셀에서 보면 아래와 같이 A1, B1 셀값이 변동되면 C1 셀도 재계산됩니다. 

그런데 제가 아래의 실험을 해보았습니다.

새로 하나의 버튼을 만들겠습니다. 아래 [단추1] 과 같습니다.

위 버튼은 [ 1 과 100 을 더하여 그 값 101 을 A3셀에 입력해라 ] 입니다.

버튼을 누르면 101 이 A3셀에 입력되겠죠.  소스는 아래와 같이 간단합니다.

Sub Btn_Click()
    Dim i As Integer
            i = 1 + 100
            Range("A3") = i
End Sub

중요한 점은, 이 소스는 가장 위에 설명드린 사용자정의함수Test 와 무관합니다. 글쵸. 그래서 이 버튼을 눌러서 A3셀값이 입력되든 말든, Test 에 영향을 끼치지않겠죠. 그런데 제가 어떤 실험을 했냐면.... 현재 이 상태에서 ..... VBA창을 열어서 

Public Function Test(a As Integer, b As Integer) As Integer
    Test = a - b   ' <--- 여기 고침. 예전에 a + b 였는데, 지금은 a - b 로 수정됨
End Function

...와 같이 수정하고 VBA창을 닫았습니다.  이렇게 수정한 이유는  [ Test 의 파라미터가 아닌 곳의 값이 변해도 Test 가 재계산이 되는 경우도 있지 않을까? ] 그런 의문이 들었고 재계산이 발생한 것을 알기 위해 일부러 고쳐본 겁니다.  저렇게 수정하고 VBA창을 닫는다하여

Test = a - b  로 바로적용되어 A3 셀값이 바로 변하지는 않습니다. 아직 셀값이 변동안되어 예전정보를 그대로 가지고있겠죠. 셀값변동 사건(이벤트)이 발생되지 않은 상태니까요. 그런데 이제 실험을 해보겠습니다.

제가 실험한 내용 (아래) : 

현재 이상태에서.....제가 저 버튼을 눌러봤습니다. 1 + 100 = 101 을 계산하여 A3셀에 입력시키는 버튼이요.  그리고 이 사건은 Test 와 전혀 무관하죠? 그런데도 A3 셀이 변하더라구요.  제가 아까 수정한 a - b 가 적용된 새값으로 입력되더라구요. 이는 Test의 재계산이 이루어졌다는 겁니다. Test 파라미터 인수를 건들지 않았는데도요.

결론 :  사용자정의 함수는 자기 파라미터 a, b 값의 변동이 설령 없다해도 재계산을 한다. 인터넷설명, 인공지능 설명이 틀렸다는 결론에 도달함. 

저의 질문 :  서로 무관한데 왜 재계산 된건지 그 이유를 알고 싶습니다. 이건 Test 함수만의 문제가 아니라 제가 엑셀이 돌아가는 근본원리를 모르고 있다는 자괴감이 듭니다. 엑셀의 기본원리에 대해 좀 설명해주시면 감사드리겠습니다.

첨부파일 : 제가 실험한 Test.xlsm

제가 실험했던 현상 몇가지 더 : 

1. 저렇게 소스 수정후, 마우스로 셀을 이리저리 클릭하면 Test재계산 안함.  마우스동작 이벤트로는 재계산 안한다는 결론.  기타 엑셀 메뉴를 열었다 닫았다 상관없는거 다 해봄. 역시 재계산 안함. 이건 예상이 되어 놀랍지 않음.

2. 임의의 셀을 선택했다 해제했다 막~~~ 수없이 해봄. 역시 재계산안함. 저는 재계산할 것으로 예상했는데 예상이 빗나감. 그래서 임의의 셀 선택후 색깔도 빠꾸고 Font Size 도 변경해봄. 역시 재계산 안함.

3. 임의의 셀 어디라도 선택후 키보드로 아무런 숫자 또는 문자 입력해봄. 근데 이건 Test재계산 함. 셀입력 이벤트로는 재계산 한다는 결론.

4. 임의의 셀 어디라도 선택후 키보드로 아무런 숫자 또는 문자 입력하..... ㄹ 려고 하다가.... Enter 말고 Esc 키를 누르고 그냥 나옴. Test재계산 안함. 

5. 위와 같이 버튼(매크로 수행)으로는 Test재계산 함. 이미 위에서 설명드림.

6. 버튼을 한번 누르고 ( 101 입력됨), 소스 수정후, 또 한번 버튼 누름 (또 101 입력됨. 그러나 화면상에서는 동일한 숫자라 화면 움직임없음)  이 경우, Test재계산 함.