2016-01-08 463 views
1

我需要一些幫助,我似乎無法修復的邏輯語句。VBA邏輯問題與If語句

If (SheetExists("Sheet1") = False Or SheetExists("Sheet2") = False Or SheetExists("Sheet3") = False) Then 

MsgBox ("A Key Sheet does not exist:" & vbNewLine & "Sheet1 Exists: " & SheetExists("Sheet1") & vbNewLine & "Sheet2 Exists: " & SheetExists("Sheet2") & vbNewLine & "Sheet3" & SheetExists("Sheet3")) 

Else 

Exit Sub 

End If 

我正在使用的測試用例應該有每個SheetExists語句返回true,因此不會msg用戶。但是,Then語句即使不應該也會運行。它會打印出每個標準是真實的,但仍運行Then聲明

我想要什麼: 如果任何表不exist->告訴我這片存在。 Else->無能爲力

錯誤: 當所有表存在:它仍然MSGS用戶

我知道SheetExists的作品,因爲我寫的另一個子來測試它,它工作正常。

表已存在代碼:

Function SheetExists(sheetName As String, Optional wb As Workbook) As Boolean 
Dim sht As Worksheet 

If wb Is Nothing Then Set wb = ThisWorkbook 
On Error Resume Next 
Set sht = wb.Sheets(sheetName) 
On Error GoTo 0 
SheetExists = Not sht Is Nothing 
End Function 
+1

顯示您SheetExists功能。這可能有問題。上面的代碼對我來說工作得很好。 –

+2

你可以發佈SheetExists的代碼嗎?我首先想到的是它不返回布爾值。沒有這個代碼我們不能測試這個。 –

+0

隨着你的代碼我仍然得到確切的預期。當三張紙存在時,沒有任何反應。如果缺少一個或多個,我會看到消息框。所以要麼你的代碼更多,要麼你的實際代碼中有拼寫錯誤。仔細檢查if語句中三張表的名稱,並確保拼寫正確。 –

回答

0

你的IF語句工作得很好,對我來說,假設SheetExists代碼是這樣的:

Function SheetExists(ByVal sName As String) As Boolean 

    SheetExists = Evaluate("ISREF('" & sName & "'!A1)") 

End Function 
+0

剛剛添加'SheetExists'代碼 –

+0

@JeffManville代碼也適用於我的'SheetExists'代碼。如果其中一個提供的圖紙名稱不存在,它只會觸發'MsgBox'。您是否絕對確定存在「Sheet1」,「Sheet2」和「Sheet3」這樣的表單,並且它們的名稱完全是沒有前導或尾隨空格的? – tigeravatar

+0

@JeffManville我也看到你的'SheetExists'代碼有一個工作簿的參數。我會仔細檢查該工作表中是否存在工作表,並且在沒有前導空格或尾隨空格的情況下將其命名爲您正在查找的內容。 – tigeravatar

0

我覺得你的問題是在這裏:

If wb Is Nothing Then Set wb = ThisWorkbook 

ThisWorkbookActiveWorkbook可以是非常不同的東西。

  • ThisWorbook指的是當前正在執行的代碼所在的工作簿。在這種情況下,無論從哪個工作簿中運行SheetExists()函數。

  • ActiveWorkbook引用當前在用戶的應用程序窗口中處於活動狀態的工作簿。


嘗試改變該行:

If wb Is Nothing Then Set wb = ActiveWorkbook