2017-09-15 10 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 

更新:

私の関数呼び出しが他にそうようなIF部の一部である:

ShiftValue変数を宣言<

If X 
"'Do stuff..." 

Else 

Call ShiftCompare(ShiftValue) 

EndIf 

エラーは、関数行に上昇する:

Function ShiftCompare(ByVal ShiftValue As String)

参照されるどのようなセルの値が空または文字列のいずれかです。

+0

「ByRef」にする必要がありますか?あなたが呼び出し関数に何かを返すためにそれを使用しているように見えないので、代わりに 'ByVal'を使ってみてください。 – braX

+0

ByValは何も変更しませんでした - どちらも指定せずに単独で変数を渡すだけではありません。それらの質問に答えるためにポストを更新しましたAlex :) –

+0

機能を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の回答に加えて、すべてのそれらのElseIfステートメントを避けるためにSelectステートメントを検討します。それはより速く走る。

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

ありがとう、たくさんの人!スーパーヘルプ:) –

関連する問題