使用 range.find 时键入不匹配错误

卡里莫斯塔法

作为较大代码的一部分,我正在另一个电子表格(所有 defaults.xls)中的电子表格 (1.xlsx) 中查找值。我正在从 Word 文档运行宏,这就是我将两个电子表格作为对象导入的原因。但是,使用range.find函数这样做总是会返回类型不匹配错误。代码如下

Dim OXL As Object
Set OXL = GetObject(, "Excel.Application")
Set OWB = OXL.Workbooks.Open("All Defaults.xls")
Set OWB2 = OXL.Workbooks.Open("1.xlsx")

OWB.ActiveSheet.Range("E:E").Find(What:=OWB2.ActiveSheet.Range("A1").Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

我已经尝试过,而不是仅仅激活函数,而是将 find 函数的值分配给一个对象或一个变体,但我仍然遇到相同的不匹配错误。在 excel 宏中
运行相同的find函数不会出错。
编辑:我也尝试在代码中写入实际值而不是OWB2.ActiveSheet.Range("A1")但发生同样的错误

克里斯·尼尔森

这里发生了几件事:

  • ActiveSheet是 的属性Excel.Application,不是Workbook所以用OXL.ActiveSheet
  • Word 不知道ActiveCell,所以使用OXL.ActiveCell
  • 即便如此,也After必须是搜索范围内的单元格
  • Word 不知道Find. 所以使用那里的值。

所以,改为

OXL.ActiveSheet.Range("E:E").Find(What:=OXL.ActiveSheet.Range("A1").Value, After:=OXL.Range("E1"), LookIn:=-4123, LookAt:=2, SearchOrder:=1, SearchDirection:=1, MatchCase:=False, SearchFormat:=False).Activate

毕竟,考虑

  • 你应该声明所有的变量
  • 您应该指定工作簿的完整路径,而不是依赖默认位置
  • 当您打开这本书时,您如何知道哪个工作表将处于活动状态?指定你想要的
  • 你怎么知道Find会找到结果?允许失败的可能性
  • 您应该获得对找到的单元格的引用,而不是Activate对其进行操作
  • 考虑早期绑定代码,而不是后期绑定。有充分的理由使用它们。
  • GetObject(, "Excel.Application")假设有一个 Excel 实例正在运行。如果没有呢?你的代码应该处理这种情况

有点像

Sub Demo()
    Dim oXL As Object ' Excel.Application
    Dim oWB As Object ' Excel.Workbook
    Dim oWB2 as Object ' Excel.Workbook
    Dim oSH As Object ' Excel.Worksheet
    Dim oSearchRange As Object ' Excel.Range
    Dim oRng As Object ' Excel.Range

    Set oXL = GetObject(, "Excel.Application")
    Set oWB = oXL.Workbooks.Open("C:\Full\Path\To\All Defaults.xls")
    Set oWB2 = oXL.Workbooks.Open("C:\Full\Path\To\1.xlsx")
    Set oSH = oWB.Worksheets("SpecifySheet")
    Set oSearchRange = oSH.Range("E:E")
    Set oRng = oSearchRange.Find( _
      What:=oSH.Range("A1").Value, _
      After:=oSearchRange.Cells(1, 1), _
      LookIn:=-4123, _
      LookAt:=2, _
      SearchOrder:=1, _
      SearchDirection:=1, _
      MatchCase:=False, _
      SearchFormat:=False)

    If Not oRng Is Nothing Then
        oRng.Activate
    End If
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章