VBA查找函数无法定义变量范围

时间:2016-07-18 08:06:13

标签: vba excel-vba excel

我正在使用VBA Find()功能,但无法使查找功能仅在特定范围内搜索。有人可以帮我这个吗?

我在y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Value 'full soln max上收到运行时错误'1004'应用程序定义或对象定义错误

我正在尝试定义我的find函数之间的搜索范围。它从第10行到“GLOBAL GROUP PURCHASES”文本所在的任何行。

以下是代码:

Sub highlightcases()   
  Application.ScreenUpdating = False
  For i = 2 To Worksheets.Count
    k = 2 * i - 1
    For j = 13 To Sheets(1).Cells.Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row
      ID = Sheets(1).Cells(j, 1).Value 'case comparison stream name      
      frow = Cells.Find("GLOBAL GROUP PURCHASES").Row      
      x = Sheets(1).Cells(j, 1).Offset(0, 2).Value 'case comparison sheet activity
      y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value 'full soln max      
      Z = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 5).Value ' full soln min      

      If x = y And x <> 0 And y <> Z Then 'check max        
        Sheets(1).Cells(j, k).Interior.ColorIndex = 35
      ElseIf x = Z And x <> 0 And y <> Z Then 'check min
        Sheets(1).Cells(j, k).Interior.ColorIndex = 22
      ElseIf y = Z And y <> 0 Then 'check fixed
        Sheets(1).Cells(j, k).Interior.ColorIndex = 19
      End If

      If Sheets(1).Cells(j, k).Value <> 0 Then      
        Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _
                "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:=Sheets(1).Cells(j, k).Text
      Else      
        Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _
                "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(Cells.Find("GLOBAL GROUP PURCHASES").Row, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:="0"
      End If

    Next j
  Next i

  With Sheets(1).Cells    
   .Font.Color = vbBlack
   .Font.Size = 8
   .Font = Arial    
  End With

  Application.ScreenUpdating = True
End Sub

2 个答案:

答案 0 :(得分:1)

 y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value

这是你的问题:Cells(10, 1)显然是指单元格A10。但在哪张纸上?因为您没有指定它,所以它需要当前活动的工作表,因此它与ActiveSheet.Cells(10,1)基本相同。

您确实正确指定了.Range的工作表,但稍后您没有为Cells指定该工作表,因此,如果,假设Sheet(1)是活动工作表,i = 2 ,你的行与

相同
y = Sheets(2).Range(Sheets(1).Cells(10, 1), Sheets(1).Cells(frow, 1)).Find(ID).Offset(0, 6).Value 

并且您不能在一张纸上指定一个范围与另一张纸的单元格。当然,解决方案是始终指定纸张。 <{1}}块可以使这更容易

With

无论何时在with块中使用With Sheets(i) y = .Range(.Cells(10, 1), .Cells(frow, 1)).Find(ID).Offset(0, 6).Value End With ,它都会在with block变量上使用.Something。当然你会在内部放置多行,可能是内部for循环中的所有内容。

答案 1 :(得分:0)

不是在单元格对象上调用Find,而是在要搜索的特定范围内调用它。因此,如果您想搜索第一列,请致电Sheets(1).Range("A:A").Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row甚至Sheets(1).Columns(1).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row。对于由变量定义的命名范围,请使用Sheets(1).Range(YourRangeVariableName).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row

可以对任何形状或大小的任何范围进行此操作

在回答所引发的错误时,当使用工作表和范围调用时,您需要再次为单元格指定工作表,因此您需要调用y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Value而不是y = Sheets(i).Range(Sheets(i).Cells(10, 1), Sheets(i).Cells(frow, k)).Find(ID).Offset(0, 6).Value。发生这种情况是因为在没有指定工作表的情况下调用的任何单元格或范围将从活动工作表调用,因此如果Sheets(i)不是活动工作表,您将获得不能在Sheets(i).Range()