2011-11-28 207 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

相关问题