2014-04-27 3 views
2

아래 함수는 단어를 허용하고 단어가 공용 변수 배열에 유지 관리되는 단어 목록에 있는지 확인합니다.함수에 전달 된 인수가 함수가 호출 서브 프로그램에 반환 된 후 값이 변경됨

Dim buff() As String 
.... 
If (Not (IsNormalCap(buff(i + 1)))) Then 
....code..... 
End if 

질문 :

버프 (I + 1)이 통과듯한 호출 서브 서브 코드를 호출이 함수

Function IsNormalCap(Mywrds As String) As Boolean 

If Right(Mywrds, 1) = "." Then Mywrds = Left(Mywrds, Len(Mywrds) - 1) 

i = 0 
Do While i < UBound(CapsType) + 1 
     If (Mywrds <> CapsType(i)) Then 
      i = i + 1 
     Else 
      Exit Do 
     End If 
Loop 
If i = UBound(CapsType) + 1 Then 
     IsNormalCap = False 
Else 
     IsNormalCap = True 
End If 
End Function 

관련 라인 문자열 배열의 요소를 전달 함수가 호출 된 후 buff (i + 1)의 값이 변경되면서 ByRef로 변경됩니다. 끝에 마침표가 포함 된 단어는 마침표가없는 마침표로 다시 돌아옵니다. 왜 이런 일이 생길까요? 이러한 인수가 전달되는 몇 가지 함수가 있으므로 ByVal (또는 그 반대로)를 전달할 때 ByRef가 전달되는 시점을 알 수없는 것처럼 보입니다. 미리 감사드립니다. 제가 충분히 명확한 지 알려주세요. 함수 선언에서

+0

ByRef가 기본값임을 알게되었습니다. http://msdn.microsoft.com/en-us/library/aa263527(v=vs.60).aspx 그런데 왜 이런 일이 일어나지 않았습니까? – Peekay

답변

3

ByRef 또는 ByVal로 지정되는 매개 변수는 VBA 도움말에서 기본 ByRef

추출에 의해

ByVal의 선택 사항입니다. 인수가 값에 의해 전달되었음을 나타냅니다.
ByRef 선택 사항. 인수가 reference를 통해 전달되었음을 나타냅니다. Visual Basic에서는 ByRef가 기본값입니다. 당신은 항상 ByVal을 원하는 경우

그래서,

Function IsNormalCap(ByVal Mywrds As String) As Boolean 

이 경우, 다른 한편으로는, 당신은 때때로 ByRef과 다른 시간 ByVal, 당신이 할 수있는 재정의 함수 호출에ByRef으로 지정할 매개 변수를 둘러싸면 ()

예 : 함수가 다음과 같이 정의 된 경우

Function IsNormalCap(ByRef Mywrds As String) As Boolean 

또는

Function IsNormalCap(Mywrds As String) As Boolean 

다음

If Not IsNormalCap((buff(i + 1))) Then 

값으로

참고 buff(i + 1)를 전달합니다, 나는 선명도를 돕기 위해 코드에서 일부 중복 ()을 제거했습니다.

+0

많은 Chris에게 감사드립니다. 내 제한된 VBA 경험에서 지금까지 ByVal을 지정하지 않았고 모든 것이 명시 적으로 처리하지 않고 늠름한 dory였습니다. 하지만 아마도 내가 주요 하위에 반영하고 싶지 않은 함수 내부의 매개 변수에 약간의 변경을 한 다음에 실수를 저지른 것은 이번이 처음입니다. 많은 감사합니다. – Peekay

관련 문제