2012-02-05 3 views
1

나는 함수를 정의한 클래스 모듈을 만들었습니다. 해당 함수가 호출 될 때마다 지역 창에 두 번 나열됩니다. 두 번째 값만 변경되고 코드의 실행이 끝날 때까지 첫 번째 코드는 유형에 따라 비어 있거나 "0"으로 유지됩니다. 표준 모듈에 정의 된 함수에이 문제가 없습니다. 내가 잘못한 것을 했는가, 이것이 버그인가, 아니면 뒤에 논리적 인 이유가 있는가? 의 TestClass 클래스 모듈"localals"창에 내 함수 이름이 두 번 나타나는 이유는 무엇입니까?

내용량 : 표준 모듈

Public Value As Double 

Function AddFive() As Double 
    AddFive = Me.Value + 5 
End Function 

내용량 : 여기

Sub TestSub() 
    Dim TestObject As New TestClass 
    TestObject.Value = 2 
    MsgBox TestObject.AddFive 
End Sub 

는 스크린이 표시되는 코드가 실행될 때, 그 라인별로 함수의 코드가 실행 된 후에는 두 번째 값만 변경되었습니다. 내가 미리 감사

엑셀 2010에 대한 VBA를 사용하고

(link to screenshot)

.

+0

Pls는 당신의 코드를 게시

Public Value As Double Sub ShowPlusFive() MsgBox Me.Value + 5 End Sub 

MODULE. – brettdj

+1

VBA 함수에는 함수와 같은 이름의 암시 적 변수가 있습니다. 귀하가 발췌 문장에 지정한 것. 변경되는 것은 내재적 변수이며 실제 함수 리턴 값이 아니며 함수에서 벗어난 후에 만 ​​평가됩니다. –

+0

함수가 표준 모듈에 정의 된 경우 함수의 반환 값이 지역 창에 표시되지 않습니다. 그런 다음 내재적 변수 만 나타납니다. 그 이유는 무엇입니까? – Cutter

답변

0

문제는 어떻게 진행되고 있는지 더 많은 문제가 있습니다. 클래스 객체의 내부 변수에 5를 더하는 함수가 있으면 반환 값이 필요하지 않으므로 기술적으로 void (VBA의 Sub)입니다.

코드는해야한다 :

CLASS

Public Value As Double 

Sub AddFive() 
    Me.Value = Me.Value + 5 
End Sub 

모듈

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 
testObject.AddFive 

MsgBox testObject.Value 

End Sub 
내가 만든이 개 변수가 왜 이유가있을 수 있습니다 상상할 수

, 그러나 당신이 생각하기에 예기치 않은 행동이 나타나는 이유는 부적절한 코드 수행.

원하는 경우 msgbox에 값 +5를 표시하는 클래스 함수를 작성할 수도 있으며 추가 변수도 만들지 않습니다. 하지만 이상하다. 위 코드를 원한다고 생각한다. 그러나 여기에 관계없이입니다 :

CLASS

Sub test() 

Dim testObject As New TestClass 
testObject.Value = 2 

testObject.ShowPlusFive 

End Sub 
+0

간단히하기 위해이 예제를 선택했습니다. 나는 두 번째 변수를 만드는 것을 피하려고하지 않고 왜 그것이 만들어 졌는지 이해하려고 노력하고 있습니다. – Cutter

+0

내 생각에 VBA는 모듈에서 하나의 변수 (MsgBox에 반환 된 값이 필요함)를 사용하고 클래스 함수는 반환 값 (결국 모듈의 MsgBox에 전달되는 값)을 만듭니다. 0 인 모듈은 클래스 함수의 반환 값이 전달되기 전에 모듈 1 일 가능성이 큽니다. 그것은 단지 추측이지만, 예제는 msgbox 호출에서 리턴 값을 가진 함수를 사용하지 않으므로 약간 펑키합니다. – aevanko

+0

나는 MsgBox 라인이 temp에 어딘가에 필요하다는 것을 알고 있기 때문에 msgbox가 암시 적으로 변수를 생성한다고 상상합니다. 반환 값을 저장하고 클래스 함수는 클래스 멤버와 연결되어야하기 때문에 자신의 반환 값 변수를 만듭니다 (기본 모듈에서 MsgBox 호출에 의해 생성 된 임시 변수를 사용하는 것은 피기울뿐입니다) . 그 이유는 당신이 왜 그냥 정상적인 모듈 (클래스 멤버 함수는 아마도 이런 식으로 설정됩니다) 에서이 동작을하지 않는 설명합니다. – aevanko

관련 문제