나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 조삿갓 (choga21)

추천:  2
파일:     조회:  3814
제목:   [RE]VBA 실시간 누적함수 오류
     
  주석을 넣다보니 글자 제한에 걸리네요.

Private Sub Worksheet_Calculate()
   Static a0 As Variant
                        '직전에 비교수행 완료한 A1 셀의 값을 저장
   Dim a1 As Variant
   Dim r As Long
                   ' 반복루프를 위한 행번호

   a1 = Range("A1").Value
                           '비교 식을 간단히 쓰기 위해 변수에 저장
   If a1 <> a0 Then
                      ' A1 셀의 값이 바뀐 경우에만 비교 카운트 수행
     Application.EnableEvents = False
                     ' 아래 반복루프를 도는 동안 계속 Calculate 이벤트가 발생하여
                     ' 수행 속도를 떨어뜨릴 수 있기 때문에 이벤트 발생을 일시 금지
     For r = 1 to 100
                       '루프 종료값을 정해주면 B100 또는 B150까지 반복가능
        If a1 = Cells(r, 2) Then
           Cells(r, 3).Value = Cells(r, 3).Value + 1
        End If
     Next r
     Application.EnableEvents = True
                     ' 반복 완료 후 이벤트 발생 금지 해제
   End If
   a0 = a1
            'A1 셀의 값을 Static 변수에 저장
End Sub
 
[불량 게시물 신고]  
김영진Dim a1 As Variant
이부분을 
Static a1 As Variant
이렇게바꾸니 스택공간오류는 안나오네요 이게 무한반복시키는 명령인가보군요
06-15 (10:59)
삭제 ■신고
조삿갓애고... 그게 아니올시다.
Static이란 Stack 공간을 이용하는 변수라는 의미가 아니고
오히려 그 반대입니다.

Dim으로 선언한 변수가 스택을 이용하기 때문에
프로시저 종료와 동시에 사망하고 
다시 호출되면 0으로 초기화됩니다.

Static으로 선언한 변수(고정형 변수라고 번역함)는
스택이 아닌 별도의 기억장소를 사용하기 때문에
프로시저가 종료해도 변수 값이 보존됩니다.

a0는 그 목적상 반드시 Static으로 선언해야 하고
a1은 Dim으로 하든 Static으로 하든 상관은 없으나
(a1은 어차피 프로시저 종료하면 없어져도 상관 없음)
굳이 Static으로 할 경우 기억장소가 낭비됩니다.

무한반복은 a1이나 a0 변수에 의한 것이 아니고
Calculation 이벤트가 발생할 때마다 프로시저가 호출되기 때문에 무한반복처럼 보일 뿐입니다. 사실은 무한반복이 아님
06-15 (11:26)
삭제 ■신고
김영진답변감사합니다... 어렵네요 ㅜ.ㅜ 구글링하면서 복붙으로 배운거라서...06-15 (11:39)
삭제 ■신고
        
  

작성일 : 2017-06-14(23:48)
최종수정일 : 2017-06-14(23:48)
 


 ◎ 관련글

  제 목   작성자   날짜
VBA 실시간 누적함수 오류 김영진 2017-06-14
[RE]VBA 실시간 누적함수 오류 조삿갓 2017-06-14
[RE]답변 감사합니다~ 김영진 2017-06-15