2017-04-10 1 views
0

더 큰 설정의 일부인 VBA에 함수가 있습니다. 함수는 Class Module 안에 있으며 기본적으로 영광스러운 뺄셈입니다. 내가 이상한 결과를 얻는 이유가 궁금해서 디버깅 목적으로 기능을 단순화했다. 변수 중 하나에 값을 할당하지 않고 임의의 값을 할당하는 것으로 나타났습니다. 단순한 할당은 어떻게 그렇게 잘못 될 수 있습니까?VBA가 변수에 잘못된 값을 할당합니다.

더 이상한 것은 왜 항상 잘못된 값을 할당하지 않는 이유입니까? 때때로 일어날뿐입니다. 다른 시간은 맞습니다. 그리고 가끔씩 아무 것도 평가되지 않는 것처럼 보이고 함수는 단지 0을 반환합니다.

모두 내 코드에서 문제가 될 수는 없지만 VBA가 작동하는 방식 (예 : 배후)에서는 문제가 될 수 있습니다. 그러나 그것을 이해하지 못하는 한, 완화하기가 어렵습니다.

코드 : I 중단 점에 도달하기 전에 Me.Value2 위에 마우스를 가져 가면

Public Property Get MySubtractionFunction() As Double 
    Dim tmpValue1 As Double 
    Dim tmpValue2 As Double 
    Dim tmpOutput As Double 

    'When debugging, sometimes CDbl(Me.Value2) evaluates to approximately 18.000 
    'However tmpValue2 evaluates to approximately 10.000 
    tmpValue1 = CDbl(Me.Value1) 
    tmpValue2 = CDbl(Me.Value2) 

    tmpOutput = tmpValue1 - tmpValue2 'Breakpoint is set at this line 
    tmpOutput = Application.WorksheetFunction.Min(tmpOutput , tmpValue1) 

    'Return output 
    MySubtractionFunction= tmpOutput 

End Property 

업데이트 1 은, 실제로 tmpValue2에 할당 된 값을 보여줍니다. 그런 다음 마우스를 제거하고 Me.Value2 위로 마우스를 가져 가면 다른 값을 표시합니다. 코드가 실행되지 않고 어떻게 속성 값이 변경 될 수 있습니까?

업데이트 2 아마 루프 내에서 클래스 개체를 사용할 때만 문제가 발생한다고 언급해야합니다. 다음과 같이 호출됩니다 :

For i = 1 To 1000 
    Dim myObject As myClass 
    Set myObject = New myClass 
    'Some initialization 
    result = myObject.MySubtractionFunction 
    'A bunch of other stuff 
    Set myObject = Nothing 
Next i 
+0

Me.Value1'와'Me.Value2'은 어떤 유형이다'? 그것들은'String' 타입입니까? 그렇다면 'Double'로 전환하기 전에 실제 가치는 얼마입니까? – user3598756

+0

두 속성의 유형은 모두 'Double'입니다. 방금'CDbl'을 디버깅 시도로 추가 했으므로 필요하지 않습니다. – Noceo

+0

시간 값을 계산하는 것 같습니다. 이러한 값은 잘못 변환 된 것으로 유명합니다. '01 : 10 : 15'와 같은 값이 사용자 양식에서 Dbl로 끝나는 방법을 살펴보십시오. – Variatus

답변

0

솔루션

내가 언급 한 바와 같이, 나는에 문제가 있었다 재산이 많은 체인의 마지막 :

마이크로 소프트가 그것에 대해 말하는 것을 살펴 보자. 클래스 모듈의 다른 속성을 모두 호출합니다 (체인의 첫 번째 속성 제외). 문제는 아주 일찍 시작되었고 모든 단계를 통해 연결되었습니다.

식별하기가 너무 어려웠던 이유는 변수를 검사하기 위해 디버거 모드에서 마우스를 변수 위에 놓았을 때 초기에 잘못된 속성 값이 업데이트되었다는 것입니다.

해결 방법은 원래 게시물과 비슷한 방식으로 체인의 모든 단계를 확장하는 것이 었습니다. 이는 여러 번의 계산을 신속하게 실행했을 때만 문제가 나타났기 때문에 항상 필요한 것은 아닙니다. 그러나 비슷한 문제가있는 사람이라면이 수정 프로그램을 사용해 보시기 바랍니다.

이 작동하지 않았다 :

Public Property Get myProperty() As Double 
    myProperty = Me.someOtherProperty + Me.aThirdProperty 
End Property 

않았다

Public Property Get myProperty() As Double 
    Dim tempSomeOtherProperty As Double 
    Dim tempAThirdProperty As Double 
    Dim tempResult As Double 

    tempSomeOtherProperty = Me.someOtherProperty 
    tempAThirdProperty = Me.aThirdProperty 
    tempResult = tempSomeOtherProperty + tempAThirdProperty 

    myProperty = tempResult 

End Property 
0

모든 컴퓨터 언어는 double 형 (부동 소수점)을 처리 할 때 큰 문제가 있습니다. 따라서 C#에서는이 문제를 방지하려면 decimal을 사용해야합니다. Excel에서는 반올림해야합니다. https://support.microsoft.com/en-us/help/78113/floating-point-arithmetic-may-give-inaccurate-results-in-excel

+0

운이없는'CDbl' 대신'Round (, 2)'를 추가하려고 시도했습니다. 또한 속성 값을 반환하기 전에 속성 내부에서'Round()'를 시도했습니다. – Noceo

+0

'double'을'long'으로 전환하면 어떻게되는지 알 수 있습니까? – Vityata

+0

'Me.Value1'은 아마도 기본적으로 문자열을 처리하는 텍스트 상자 또는 다른 컨트롤 일 것입니다. 따라서 문자열을 double로 변환하면 일반 텍스트에서 가장 부정확 한 산술 표현식을 가장 정확한 Excel로 변환합니다. 그러나 나는 이것이 단지 절반의 문제 일 뿐이라고 생각한다. 나머지 절반은 실제로 문자열 값으로 표현 된 시간을 double로 변환하는 것입니다. 코딩과 여기에서 제공 한 정보 모두가 너무 부정확하여 작동하는 대답을 허용하지 않습니다. 'Me.Value1'이 무엇이고 어떤 가치가 있는지에 대해 베일을 들어 올리십시오. – Variatus

관련 문제