2017-09-15 15 views
3

처음에는 내 주 코드 섹션에서 추한 if 문을 사용했습니다. 나는 이것을 호출 할 함수로 만들기로 결정하여, "컴파일 오류 : ByRef 인수 유형 불일치"오류가 발생했습니다. 필자의 가정은 함수를 제대로 참조해야한다는 것입니다. 그러나 필자는 설명서를 읽었으므로 그 이유를 알 수 없습니다. Dim ShiftValue As String
ShiftValue = LCase(Sheets("Raw_Rota").Cells(Counter, "C").Value)
VBA ByRef 인수 유형 불일치

기능의 내용과 선언 :

Function ShiftCompare(ByRef ShiftValue As String) 

If StrComp(ShiftValue, "am", vbTextCompare) = 0 Then 
     Call IncAMs(AMs) 'this function increments the variable by 1. 
     Call Inc(Counter) 

    ElseIf StrComp(ShiftValue, "pm", vbTextCompare) = 0 Then 
     Call IncPMs(PMs) 
     Call Inc(Counter) 

    ElseIf StrComp(ShiftValue, "days", vbTextCompare) = 0 Then 
     Call IncDays(Days) 
     Call Inc(Counter) 

    ElseIf StrComp(ShiftValue, "leave", vbTextCompare) = 0 Then 
     Call IncLeave(Leave) 
     Call Inc(Counter) 

    Else 'If the string doesn't compare to the above values tally it as unknown 
     Call IncUnknown(Unknown) 
     Call Inc(Counter) 
    End If 
End Function 

업데이트 :

내 함수 호출이 너무 같은 경우에는 섹션의 그렇지 않은 부분에 있습니다

<

ShiftValue 변수를 선언

If X 
"'Do stuff..." 

Else 

Call ShiftCompare(ShiftValue) 

EndIf 

오류는 기능 선에서 발생할 :

Function ShiftCompare(ByVal ShiftValue As String)

참조되는 어떤 셀의 값이 비어 또는 문자열 중 하나입니다.

+0

'ByRef'가 필요합니까? 그것은 당신이 그것을 호출 함수에 무엇이든 반환하기 위해 사용하고있는 것처럼 보이지 않으므로'ByVal'을 대신 사용해보십시오. – braX

+0

ByVal은 아무 것도 변경하지 않았으며 지정하지 않고 자체적으로 변수를 전달하지도 않습니다. Alex Alex : –

+0

Function을 Sub로 변경하면 효과가있을 수 있습니다. 또는 인수를 괄호 안에 문자열로 전달하십시오. 다음과 같이 :'Call ShiftCompare ("ShiftValue")' – Vityata

답변

0

함수를 호출 할 때 매개 변수의 값은 문자열이 아닙니다. ShiftValue 값을 확인한 후 다시 시도하십시오. 당신이 문자열입니다 있는지 확인하려면이 기능이 Call ShiftCompare("MyStringValue")


아이디어는 값을 반환하는 것이 좋은 것입니다 좋아 전달합니다. 당신은 돌아 오지 않습니다. FunctionSub으로 변경하십시오.

+1

그 중 하나입니다. 호출 될 때 값이 비어 있습니다. 내 초기 for 루프 null 또는 빈 변수 값을 데리러 내 마지막 if 문에서 그들을 다루는 반면, 함수를 호출 할 때 값 null/빈 수 없습니다. 해당 하위를 호출하기 전에 값이 null/비어 있지 않은지 확인합니다. 도와 주셔서 감사합니다!! –

+1

@JohnHiggs - 그냥 FYI - null 및 비어있는 VBA 용어가 다릅니다. 수표를 발행 할 때주의해야합니다. – Vityata

1

위의 Vityata의 대답 외에도 Select 문을 사용하여 모든 ElseIf 문을 피하십시오. 그것은 더 빨리 달린다.

Option Compare Text 
Public Sub ShiftCompare(ByVal ShiftValue As String) 
    Select Case True 
     Case StrComp(ShiftValue, "am") = 0: 
      Call IncAMs(AMs) 'this function increments the variable by 1. 
      Call Inc(Counter) 

     Case StrComp(ShiftValue, "pm") = 0: 
      Call IncPMs(PMs) 
      Call Inc(Counter) 

     Case StrComp(ShiftValue, "days") = 0: 
      Call IncDays(Days) 
      Call Inc(Counter) 

     Case StrComp(ShiftValue, "leave") = 0: 
      Call IncLeave(Leave) 
      Call Inc(Counter) 

     Case Else: 'If the string doesn't compare to the above values tally it as unknown 
      Call IncUnknown(Unknown) 
      Call Inc(Counter) 
    End Select 
End Sub 
+0

많은 사람들에게 감사 할 것입니다! 슈퍼 도움이 :) –