2011-11-28 335 views
1

使用:Excel 2007中/ Win 7的定位單元格的值在Excel VBA

首先,我創建了一個子程序找到動態範圍的所謂 'WIP' 工作表:以

Sub GetWIPRange() 
Dim WIPrng1 As Range 
Dim WIPrng2 As Range 
Sheets("WIP").Activate 
Set WIPrng1 = Cells.find("*", [a1], , , xlByRows, xlPrevious) 
Set WIPrng2 = Cells.find("*", [a1], , , xlByColumns, xlPrevious) 
If Not WIPrng1 Is Nothing Then 
    Set WIPrng3 = Range([a1], Cells(WIPrng1.Row, WIPrng2.Column)) 
Application.Goto WIPrng3 
Else 
    MsgBox "sheet is blank", vbCritical 
End If 
End Sub 

現在我想上面找到定義的範圍內給定的合同編號:

Sub find() 
Dim find As Long 
find = Application.WorksheetFunction.Match("545499", Range(WIPrng3.Parent.Name & "!" & WIPrng3.Address), 0) 
MsgBox "Found at row : " & find 
End Sub 

但我從上面的代碼得到的錯誤是:

運行時錯誤「91」: 對象變量未設置塊變量。

  1. 我該如何解決這個問題,以便它返回我正在尋找的值的行號?
  2. 是否有一種更有效的方式來使用VBA查找單元格值?例如,如果我有很多工作表,並且我想搜索所有工作表並返回值的特定行號和工作表位置。

非常感謝!

回答

1

WIPrng3定義在哪裏?它被定義爲Public嗎?問題在於,當你運行「查找」時,WIPrng3已經超出了範圍,因此沒有。您可以在「查找」代碼中檢查Nothing,並根據需要運行Get過程。像這樣

Sub find() 
    Dim find As Long 

    If WIPrng3 Is Nothing Then GetWIPRange 

    find = Application.WorksheetFunction.Match("545499", Range(WIPrng3.Parent.Name & "!" & WIPrng3.Columns(1).Address), 0) 
    MsgBox "Found at row : " & find 
End Sub 

有兩點需要注意:如果WIPrng3返回一個多範圍,MATCH將失敗,1004錯誤。 MATCH僅適用於單列或單行。在上面的例子中,我將WIPrng3限制在MATCH函數的第一列以避免這種情況。你的代碼中沒有這個。

另一件事是你正在尋找文本字符串「545499」,而不是數字545499.如果你的範圍包含數字而不是字符串,你會得到一個錯誤。您可以使用On Error語句來捕獲該錯誤並進行適當的處​​理。

最後,我沒有看到定義WIPrng3的好處(但我看不到你正在做的整個事情)。你可以很容易地使用

Sub Find2() 

    Dim lRow As Long 

    On Error Resume Next 
     lRow = Application.WorksheetFunction.Match("545499", Sheets("WIP").UsedRange.Columns(1), 0) 

    If lRow > 0 Then 
     'add where the used range starts in case it's not row 1 
     MsgBox "Found at row : " & lRow + Sheets("WIP").UsedRange.Cells(1).Row - 1 
    Else 
     MsgBox "Not found" 
    End If 

End Sub 

你可能會看到一個更大的範圍,但它不會明顯影響性能。

我在這個例子中添加了On Error,所以你可以看到它是如何工作的。直到你測試它之前,不要把On Error放在那裏,因爲它會掩蓋所有其他的錯誤。

查爾斯·威廉斯做了這裏找到效率http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/

+0

我在模塊的聲明部分定義WIPrng3一些很好的分析。它不應該持續下去嗎?條件語句運行GetWIPRange子例程,但現在我得到了一個不同的錯誤:運行時錯誤1004無法獲取WorksheetFunction類的Match屬性。 – AME

+0

它會一直存在,直到您編輯代碼,然後您的所有持久變量都會被重置。我想如果你一個接一個地運行它,它就會起作用。我在文中提出了一些可能的錯誤,所以檢查一下。 –

+0

色譜柱(「I:I」)。選擇 選擇。找到(What:= x(0),After:= ActiveCell,LookIn:= xlValues,LookAt:= xlPart,SearchOrder:= xlByColumns,SearchDirection:= xlNext,MatchCase:= False,SearchFormat:= False)。激活BKRow = ActiveCell.Row – AME