2016-07-07 62 views
0

我有下面的代碼.....如何解決vba中運行時錯誤11除0的問題?

private sub textbox1_change() 
if textbox1.value = "" then exit sub 
if textbox2.value = "" then exit sub 
textbox3.value = cdbl(textbox1.value)/cdbl(textbox2.value) 
end sub 
private sub textbox2_change() 
if textbox1.value = "" then exit sub 
if textbox2.value = "" then exit sub 
textbox3.value = cdbl(textbox1.value)/cdbl(textbox2.value) 
end sub 

每當TextBox2中具有零值會出現一個消息框,提示運行時錯誤11;被零除。我嘗試用IIF條件予以解決用戶的建議斯科特·克拉納here

textbox3.value = cdbl(textbox1.value)/IIF(cdbl(textbox2.value) = 0 , 1 , cdbl(textbox2.value)) 

我想知道如果我能以某種方式分配textbox3爲「空」或「不適用」或「價值 - 「如果分母是零。我在互聯網上找不到任何可信的東西。

非常感謝!

回答

1

最簡單的方法是在計算之前檢查分母的值。那麼簡單的If ... else就足夠了。

If textbox2.value = 0 Or IsEmpty(textbox2.Value) Then 
     textbox3.Value = "Null" 'Or "NA" or whatever you'd like 
Else 
     textbox3.Value = cDbl(textbox1.Value)/CDbl(textbox2.Value) 
End If 
+0

我得到編譯錯誤「阻止如果沒有結束if」如果我這樣做 –

+1

然後你有你的代碼中的另一個問題。你有沒有下一個'For'循環?或者另一個'If'語句沒有相應的'End If'? – Kyle

+0

@Vinaybilla凱爾說,這不是這個代碼的問題。你必須在其他地方遇到問題 – RGA

1

如果你有行: -

textbox3.value = cdbl(textbox1.value)/cdbl(textbox2.value) 

改變,如果在下面: -

textbox3.value = iif(cdbl(textbox2.value)=0,"N\A", cdbl(textbox1.value)/cdbl(textbox2.value)) 

這說明如果textbox2爲零,則輸出 'N \ A' ,否則按照正常方式進行劃分(即textbox1/textbox2)。

+0

並沒有真正回答OP的問題,因爲他們要求值爲「空」等等,而不是textbox1.value。當然,如果你將第一個條件改爲「Null」,那麼這確實工作得很好 – RGA

+0

我試過了,但運行時錯誤仍然出現,vba讓我調試 –

+0

錯誤代碼爲11? –

1

替換所有代碼: -

private sub textbox1_change() 
if textbox1.value = "" then exit sub 
if textbox2.value = "" then exit sub 
textbox3.value = cdbl(textbox1.value)/cdbl(textbox2.value) 
end sub 
private sub textbox2_change() 
if textbox1.value = "" then exit sub 
if textbox2.value = "" then exit sub 
textbox3.value = cdbl(textbox1.value)/cdbl(textbox2.value) 
end sub 

有了這個代碼: -

Private Sub textbox1_change() 
ShowResult 
End Sub 
Private Sub textbox2_change() 
ShowResult 
End Sub 
Private Sub ShowResult() 
Dim Str1  As String 
Dim Str2  As String 
Str1 = Trim(textbox1.Value) 
Str2 = Trim(textbox2.Value) 
If (Str1 = "") Or (Str2 = "") Then Exit Sub 
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then 
    textbox3.Value = "N\A" 
Else 
    If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then 
     textbox3.Value = "N\A" 
    Else 
     textbox3.Value = CDbl(Str1)/CDbl(Str2) 
    End If 
End If 
End Sub 
Private Function IsDouble(ByVal StrValue As String) As Boolean 
Dim DblTest As Double 
On Error GoTo ErrorHandle 
DblTest = CDbl(StrValue) 
IsDouble = True 
Exit Function 
ErrorHandle: 
Err.Clear 
End Function 

這將檢查值不能爲Double數據類型(如字符串)和壞司(即錯誤代碼6和11)。

編輯: - 下面是對上述代碼中發生的事件的演練。

程序textbox1_changetextbox2_change做同樣的事情,以避免重複的代碼;他們都會調用該代碼的一個實例。

Private Sub textbox1_change() 
ShowResult 
End Sub 

Private Sub textbox2_change() 
ShowResult 
End Sub 

之後,有新的程序ShowResult保存代碼textbox1_changetextbox2_change籲請的單個實例。

Private Sub ShowResult() 
Dim Str1  As String 
Dim Str2  As String 
Str1 = Trim(textbox1.Value) 
Str2 = Trim(textbox2.Value) 
If (Str1 = "") Or (Str2 = "") Then Exit Sub 
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then 
    textbox3.Value = "N\A" 
Else 
    If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then 
     textbox3.Value = "N\A" 
    Else 
     textbox3.Value = CDbl(Str1)/CDbl(Str2) 
    End If 
End If 
End Sub 

ShowResult代碼進行多項檢查。

首先它把textbox1Str1textbox2Str2,並使用它們trim。修剪意味着前後空格被刪除。例如,如果textbox1的值爲「」(可能是通過用戶複製和粘貼完成的),那麼從技術上講,它不是空的,可能會導致錯誤。

Dim Str1  As String 
Dim Str2  As String 
Str1 = Trim(textbox1.Value) 
Str2 = Trim(textbox2.Value) 

下一個檢查是隻要有一個是空的,則退出程序,就像你在一行之前,但現在做到了。

If (Str1 = "") Or (Str2 = "") Then Exit Sub 

下一個檢查會調用另一個執行檢查的過程以確保值可以轉換爲double。對於示例CDbl("Hello World!")將會失敗,因爲它不是開頭的數字。所以這個檢查可以解決潛在的問題,如果它不是一個可以被分割的數字,那麼輸出'N \ A'。

If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then 
    textbox3.Value = "N\A" 

的最終檢查的是,如果所述第二值是零或兩者均爲零,則「N \ A2是輸出,否則該除法完成和輸出。

If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then 
    textbox3.Value = "N\A" 
Else 
    textbox3.Value = CDbl(Str1)/CDbl(Str2) 
End If 

這是最後的程序這被ShowResult調用來檢查該值是否可以轉換爲Double數據類型,它試圖進行轉換,如果發生錯誤,錯誤被清除並且false(默認)將被返回給調用者,如果沒有輸出錯誤true

Private Function IsDouble(ByVal StrValue As String) As Boolean 
Dim DblTest As Double 
On Error GoTo ErrorHandle 
DblTest = CDbl(StrValue) 
IsDouble = True 
Exit Function 
ErrorHandle: 
Err.Clear 
End Function 

希望這會有所幫助。

+0

非常感謝加里..這只是做的伎倆,但我不明白它是如何工作的。請走過我的解決方案 –

+0

我很高興它的幫助,真的很高興你想要進一步的解釋,並沒有使用它,走開!我編輯了答案,希望它有幫助。 –