从 Excel 调用 VBA 函数 - 在选定工作表上的选定列中查找

Posted

技术标签:

【中文标题】从 Excel 调用 VBA 函数 - 在选定工作表上的选定列中查找【英文标题】:Call VBA function from Excel - Find in a selected column on a selected sheet 【发布时间】:2021-02-21 21:58:55 【问题描述】:

寻找有关 Excel VBA 的专家建议。我编写了一小段代码,用于选择特定工作表中的列并对选择执行查找/搜索。当我从 Excel 调用该函数时,它没有找到任何东西,因为 find 返回的 Range 值为空。但是,当我直接在开发人员窗口中运行它时,它工作正常。

请注意,我知道使用现有的 Excel 宏也可以做到这一点。但我不想使用它们是有原因的。希望你能理解。

这里是代码;

Function MYFIND(x As Range) As Integer
Dim Cell As Range
Worksheets("Sheet4").Select
Columns("A:A").Select
Set Cell = Selection.Find(What:=x.Value, searchDirection:=xlNext, MatchCase:=False)

If Cell Is Nothing Then
    MsgBox "search item " & x.Value & " not found in " & ActiveSheet.Name
Else
    MsgBox "Found item " & Cell.Row
End If
MYFIND = 0 
End Function

可能是什么问题?

【问题讨论】:

您的“函数”名称是“MYFIND”,但是在您的代码中,您不会以任何形式使用它。此外,您很少在返回值的“函数”中使用“MsgBos”。您到底想实现什么?也许您可以分享您的数据的屏幕截图,以及想要的结果 嘿 Shai,我更正了返回变量名称(编辑了上面的代码)。这是一个复制粘贴错误。我设置 MYFIND = 0 总是返回 0 但使用 MsgBox 代替测试目的。运行代码时,我希望看到消息“found item [row-num]”。 的想法是,一旦我让代码工作以找到我需要的东西,然后我会将值设置为返回变量,该变量将在 Excel 工作表的单元格中设置返回值。我使用 =MYFIND(G2) 从 excel 调用用户定义函数 (UDF),其中“G2”单元格包含我在选择中搜索的文本。 只是一个小提示:使用Debug.Print 而不是MsgBox,可以节省一次点击并且不会阻塞。它将输出到立即窗口。 【参考方案1】:

尝试使用下面的 UDF,尽量避免使用 Select 和 `Selection。

修改的 UDF

Function MYFIND(x As Range) As Long

Dim Rng As Range
Dim Cell As Range

' set the range, never use select or selection
Set Rng = Worksheets("Sheet4").Columns("A:A")
Set Cell = Rng.Find(What:=x.Value, LookIn:=xlValues, lookAt:=xlWhole, searchDirection:=xlNext)

If Cell Is Nothing Then
    MYFIND = 0 ' returns 0 if not found
Else
    MYFIND = Cell.Row
End If

End Function

然后,从您的工作表中调用您的 UDF:

【讨论】:

谢谢@Shai。使用范围确实有效。就我所知,选择和选择有什么问题? @JasonNanay 在这里阅读***.com/questions/10714251/…【参考方案2】:

杰森,

这个怎么样?

Option Explicit

Function MYFIND(y As String) As Integer

Dim Cell      As Range
Dim GLAccount As Long
Dim x         As Range

Set x = Range(y)

Set Cell = Sheet4.Columns("A:A").Find(What:=x.Value, searchDirection:=xlNext, MatchCase:=False)

If Cell Is Nothing Then
    MsgBox "search item " & x.Value & " not found in " & ActiveSheet.Name
Else
    MsgBox "Found item " & Cell.Row
End If

  MYFIND = Cell.Row()

End Function

调用为:

=MyFind("E1")

其中 E1 包含您要查找的值。 我在 Sheet4 的 col A 中设置了字母 a-f(使用代码中的代号),它返回 3,因为 c 在第 3 行。

HTH

【讨论】:

感谢@RetiredGeek 的建议。使用此代码时出现值错误很奇怪。也许是因为我从“Sheet5”中调用它? Jason,我是从 sheet1 调用它,所以你从 sheet5 调用它应该不是问题。只要 A 列的值在 sheet4 上。

以上是关于从 Excel 调用 VBA 函数 - 在选定工作表上的选定列中查找的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:将变体数组返回到选定范围时需要 255 转置字符限制的解决方法

从excel单元格调用excel工作表函数

用户定义的函数在 vba 中工作正常,而从显示“值”错误的 excel 表调用时

从 Excel 调用 Access VBA 函数

使用 VBA 从 Access 表中将选定的列导入 Excel

从 Excel 与 VBA 调用时,VBA UDF 给出不同的答案