2013-04-18 86 views
2

我試圖從另一個工作表搜索值的誤差,而使用.FIND功能如何修復使用查找功能在Excel VBA

Private Function Search(rng As Range, FindString As String) As Range 
    With rng 
     Set Search = .Find(what:=FindString, _ 
         After:=.Cells(.Cells.Count), _ 
         LookIn:=xlValues, _ 
         lookat:=xlWhole, _ 
         SearchOrder:=xlByRows, _ 
         SearchDirection:=xlNext, _ 
         MatchCase:=False) 
    End With 

有趣的是,如果我進入

Search(Range("'DataSheet'!A1:Z1000"),"STARTING") 

它的工作原理。當我嘗試

SearchString = "'" & Selected_sheet &"'!A1:Z1000" 

它不起作用Selected_sheet只是工作表的名稱(在這種情況下,它是「DataSheet」)。使用

Search(Range(SearchString),"STARTING") 

Error: RUN-TIME ERROR '91' 
Object variable or With Block Varibale Not Set 

什麼可能是實際問題?

回答

1

你的方法並不正確,但我建議不要傳遞你的範圍。

使用此

Search(Sheets("DataSheet").Range("A1:Z1000"),"STARTING") 

Selected_sheet = "DataSheet" 
Search(Sheets(Selected_sheet).Range("A1:Z1000"),"STARTING") 

BTW沒有什麼錯Range(SearchString)在你的代碼。它應該工作。你打電話給Search?希望這樣嗎?

Dim Ret As Range '<~~~ 

Selected_sheet = "DataSheet" 
SearchString = "'" & Selected_sheet & "'!A1:Z1000" 
Set Ret = Search(Range(SearchString), "STARTING") 

原因:該函數返回一個Range所以你不能叫它不Set Ret = ...Ret再次聲明爲Range

編輯

你也可以得到這個錯誤,如果你的Search函數不返回一個範圍,並嘗試使用該Ret。看到這個例子。

Dim Ret As Range 

Selected_sheet = "DataSheet" 
SearchString = "'" & Selected_sheet & "'!A1:Z1000" 
Set Ret = Search(Range(SearchString), "STARTING") 

'<~~ This will give you RUN-TIME ERROR '91' if "STARTING" is not found 
Debug.Print Ret.Address 

那麼,我們如何解決這個

試試這個

Dim Ret As Range 

Selected_sheet = "DataSheet" 
SearchString = "'" & Selected_sheet & "'!A1:Z1000" 
Set Ret = Search(Range(SearchString), "STARTING") 

If Not Ret Is Nothing Then 
    Debug.Print Ret.Address 
Else 
    Debug.Print "Search Didn't return any results" 
End If 
+0

我非常感謝在這個問題上的詳細情況進行說明。我嘗試最後一個,它的工作原理。我確實使用了我的「SET」,我認爲如果找不到值,我應該需要處理這個錯誤。 – NCC

+0

很高興能有幫助:) –