Put your search in a loop and avoid hard coded delays where possible.
As a suggestion I am using the Find method in a function that locates objects for me on a web page. I have this inside a loop that quits after n number of times and returns the object if it is found so I can perform whatever operations I like on it, ie. Click, Add Text, etc.
A little bit of testing showed me that quitting after 10 tries was sufficient in our app to know with confidence if the object was found or not.
Set Obj = sys.Browser("iexplore").page("*").Find(PName,PValue,20000,TRUE)
The time to find the objects using the above method is determined by the time it takes for the FindAll methods to traverse the tree and return all the found objects.
Further, If you are testing a web application in IE you can use CurrentPage.Wait method for the page to load and place it before your FindAll, no loop required then as the search is only done one time once the page has loaded.
Do
Set Obj = sys.Browser("iexplore").page("*").Find(PName,PValue,20000,TRUE)
i = i+1
Loop Until Obj.Exists or i=10
'return object if found
If Obj.Exists Then
Set LocateObject = Obj
Exit Function
Else
log.error("LocateObject: object with Property Value: ")&PValue &(" wasn't found")
End IF