使用vba在excel中查找和激活函数时出错

时间:2014-05-11 05:58:39

标签: excel vba excel-vba

我正在努力理解为什么我会收到一个我不应该出现的错误。 我正在使用Office 2007.我在Excel中有两张表,“Ver”和“Encargado”,在“Ver”表中我有一个单元格可以放一个数字,然后我按下一个按钮。按钮内的代码是:

Private Sub CommandButton1_Click()
   Dim buscar As Range
   dato = Range("b2").Value
   If dato = "" Then Exit Sub

   Sheets("Encargado").Select
   Set buscar = Range("b2:b12").Find(What:=dato, LookIn:=xlFormulas, SearchOrder:=xlByRows)

   If Not buscar Is Nothing Then
      buscar.Activate
      ActiveCell.Offset(, -1).Copy Destination:=Ver.Cells(4, 2)
      Sheets("Ver").Select
   Else
      Sheets("Ver").Select
      MsgBox "Encargado no encontrado"
      Exit Sub
   End If
End Sub

在“Encargado”表格和b2:b12范围内只有数字beetwen 101和111,当我把数字117作为输入时(例如)我认为它应该进入其他部分,因为它应该没有没有发现任何巧合,但它进入if部分,为什么?我收到一个错误,上面写着“错误激活de la clase Range”(你注意到我正在使用西班牙语的Office,以及使用西班牙语变量进行编程)。当我逐行运行时,错误出现在“buscar.Activate”行中。有谁知道错误在哪里?如果您想看到它,请输入以下文件:https://www.dropbox.com/s/j1b39fqy971n7lf/Todo.xlsm谢谢。

2 个答案:

答案 0 :(得分:1)

您尚未在查找功能中定义工作表,因此其引用版本表。使用此代码。

   Private Sub CommandButton1_Click()
   Dim buscar As Range

   'Application.ScreenUpdating = False

   dato = Range("b2").Value

   If dato = "" Then Exit Sub
    Set buscar = Sheets("Encargado").Range("b2:b12").Find(What:=dato, LookIn:=xlValues, SearchOrder:=xlByRows)
   If Not buscar Is Nothing Then
      'Encargado.Cells.Find(What:=Ver.Cells(2, 2), After:=Range("b2"), LookIn:=xlFormulas, SearchOrder:=xlByRows).Select
      'desplazamiento en fila, desplazamiento en columna, positivo: hacia abajo, hacia la derecha
      'buscar.Activate
      c = buscar.Row

     Sheets("Encargado").Range("a" & c).Copy
     Sheets("Ver").Range("b4").PasteSpecial


   Else
      Sheets("Ver").Select
      MsgBox "Encargado no encontrado"
      Exit Sub
   End If
   'Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

编辑:正如下面的评论所指出的,Range对象 DOES 采用.Activate方法:http://msdn.microsoft.com/en-us/library/office/ff837085(v=office.15).aspx < / p>

buscar是一个Range对象,没有Activate方法。以下内容应该可以帮到您,但是出于好奇 - 你有没有看过Excel的内置=VLOOKUP功能?这可能会让你免于在这需要VBA ......

Option Explicit
Private Sub CommandButton1_Click()
Dim TerritorioNum As Long, LastRow As Long
Dim TerritorioRange As Range, FoundRange As Range
Dim VerSheet As Worksheet, EncSheet As Worksheet

'set references up-front
Set VerSheet = ThisWorkbook.Worksheets("Ver")
Set EncSheet = ThisWorkbook.Worksheets("Encargado")
With EncSheet
    LastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Set TerritorioRange = .Range(.Cells(1, 1), .Cells(LastRow, 2))
End With
TerritorioNum = VerSheet.Cells(2, 2).Value

'find the territory number
Set FoundRange = TerritorioRange.Find(TerritorioNum)
If FoundRange Is Nothing Then
    MsgBox ("Encargado no encontrado")
    Exit Sub
Else
    VerSheet.Cells(4, 2) = EncSheet.Cells(FoundRange.Row, FoundRange.Column - 1).Value
End If

End Sub