2016-10-27 18 views
0

添付されたコードはVBAで実行されますが、なぜエラーがあるかはわかりません。 if文ですべての終わりに一致していると確信しています。EXCEL VBAユーザー定義関数 - elseなしif

Sub teee()はdecimalize関数をテストするためのものです。コードを大幅にチェックして、私のコードに何が間違っているか教えてください...私はこの機能のトラブルシューティングができれば、プロジェクトを完了するのにほとんど終わりです。

Sub teee() 

sss = "-1-21+" 

MsgBox (decimalize(sss)) 


End Sub 

Function decimalize(s As Variant) As Long 

Dim checkers As Variant 
Dim ab As Long 
Dim leftnum As Long 
Dim rightnum As Long 
Dim poneg As Integer 


checkers = s 
ab = 0 
leftnum = 0 
rigntnum = 0 
poneg = 0 

'Positive payup or negative payup 

If Left(checkers, 1) = "-" Then 
poneg = 1 
lencheckers = Len(checkers) 
checkers = Mid(checkers, 2, lencheckers - 1) 

Else: poneg = 0 
End If 


startp = InStr(checkers, "-") 


If startp = 2 Then leftnum = Left(checkers, 1) 
ElseIf startp = 3 Then leftnum = Left(checkers, 2) 
ElseIf startp = 4 Then leftnum = Left(checkers, 3) 
End If 



rightnum = Mid(checkers, startp + 1, 2) 


If InStr(checkers, "+") > 0 Then 
ab = 0.5 
ElseIf InStr(checkers, "1/4") > 0 Then 
ab = 0.25 
ElseIf InStr(checkers, "1/8") > 0 Then 
ab = 0.125 
End If 

rightnum = rightnum + ab 


If poneg = 0 Then 
decimalize = rightnum + leftnum * 32 
ElseIf poneg = 1 Then 
decimalize = (rightnum + leftnum * 32) * -1 
End If 


End Function 

事前に多くのおかげで、このような

答えて

2

変更を:

If startp = 2 Then 
    leftnum = Left(checkers, 1) 
ElseIf startp = 3 Then leftnum = Left(checkers, 2) 
ElseIf startp = 4 Then leftnum = Left(checkers, 3) 
End If 

情報:あなたは "その後" と同じ行にした後、結果を書き、 ifを書くべきではない。したがって、VBAは次のElseIfがどこから来ているのか理解していません。

はほとんど次の2つの例を使用することを許可されています。

'Example 1 (no end if here) 
if startp = 2 then leftnum = Left(checkers,1) 

'Example 2 (you need end if here) 
if startp = 2 then 
    leftnum = Left(checkers,1) 
end if 
+0

非常に感謝して、Vityata、あなたのソリューションは完璧に働いています! –

+0

今日は+1カルマを知っておくといいです:)もしあなたが欲しいなら、あなたは次のように左の緑色のチェックをクリックして回答を選択することができます:http://meta.stackexchange.com/questions/5234/how-does-accepting-アンサーワーク – Vityata

2

@Vityataは、その特定のバグを解消する1つの方法を示しました。別の方法は、Ifを完全に避けて、Select Caseを使用することです。結果のコードは、多少読みやすくされています。また、あなたはいくつかの変数ではなく、他人を宣言する任意のパターンを持っている

Select Case startp 
    Case 2: leftnum = Left(checkers, 1) 
    Case 3: leftnum = Left(checkers, 2) 
    Case 4: leftnum = Left(checkers, 3) 
End Select 

、そしてあなたは、少なくとも1つの可変タイプミスがあります:rigntnum = 0はほぼ確実rightnum = 0でなければなりませんが。すべてのモジュールの先頭にOption Explicitを使用する必要があります(また、VBAエディタのオプションでRequire Variable Declarationを有効にする)。これは、あなたがランダムなバグを起こしにくいコードを書くのに役立ちます。

+0

素晴らしいアドバイスありがとうございましたジョン、次回はやります。同時に複数のIF文を使用すると、常に複雑になります。 –

関連する問題