Excel-使用VBA搜索范围

Excel-使用VBA搜索范围,vba,excel,Vba,Excel,我基本上是想做一个VLOOKUP,但是我的单元格内容太长了VLOOKUP无法处理。因此,我使用此VBA脚本在定义的范围内搜索: Function betterSearch(searchCell, Range As String) For Each cell In Range If cell.Value = searchCell.Value Then betterSearch = "Match"

我基本上是想做一个
VLOOKUP
,但是我的单元格内容太长了
VLOOKUP
无法处理。因此,我使用此VBA脚本在定义的范围内搜索:

Function betterSearch(searchCell, Range As String)

        For Each cell In Range
            If cell.Value = searchCell.Value Then
                    betterSearch = "Match"
                    Exit For
            End If
            betterSearch = "No match"
        Next

End Function
该函数被称为(例如):
=betterSearch(B33;'Master'!C:C)

但是,我无法获得一个输出。我开始生气了,我犯了什么错误

我开始生气了,我犯了什么错误

好几个

  • 参数
    范围
    被声明为
    字符串
    ,但使用起来很清楚,就好像它是
    范围
    对象一样。它应该声明为范围
  • 名称
    Range
    正在隐藏
    Global.Range
    ,这可能是问题,也可能不是问题(在本例中不是问题)。在更大范围内隐藏/隐藏现有声明通常是个坏主意
  • 该函数隐式地
    公共
    。如果明确的话,那就更好了
  • 参数是通过ref
    隐式传递的,但没有理由这样做;它们应该通过val传递
    ByVal
  • 参数
    searchCell
    是一个隐式的
    变量
    ,但它的使用就像是一个
    范围
    对象一样;将其
    声明为范围
  • 函数返回一个隐式
    变量
    ,但实际上返回一个
    字符串
    。签名应将返回类型的
    指定为字符串
  • 未声明局部变量
    单元格
    ,这意味着它是一个动态隐式
    变量
    。将其显式声明为范围
  • 使用未声明变量编译的代码没有指定选项Explicit,这意味着VBA将愉快地编译并运行任何输入错误。避免愚蠢的尴尬问题,在每个模块的顶部指定
    Option Explicit
    ,并声明每个变量
  • “不匹配”返回值在每次迭代时都被不必要地重新分配
  • 函数名为
    camelCase
    ,但每个VBA类型库中的公共成员都是一致的
    PascalCase
  • 缩进不一致
(我管理的一个开源VBE外接程序项目)将通过其静态代码分析获得其中大部分要点

Option Explicit

Public Function BetterSearch(ByVal searchCell As Range, ByVal source As Range) As String
    Dim cell As Range
    For Each cell In source
        If cell.Value = searchCell.Value Then
            BetterSearch = "Match"
            Exit Function
        End If
    Next
    BetterSearch = "No match"
End Function

在我看来,如果函数返回的是
布尔值,而不是“神奇字符串”,那么它会更有用
True
找到时,False
未找到时。

不应
Range as String
Range as Range
?变量不应与先前存在的方法同名
betterSearch(searchCell,源代码范围)
会更好。非常感谢。我理解你的大部分评论,但是,我遇到了以下奇怪的事情。如果源区域与searchCell位于同一工作表上,则该区域有效,但如果该区域位于不同的工作表上,则返回一个#值!错误?嘎,打字/复制+粘贴错误。。。应该是源代码中每个单元格的
-已修复。我捕获的那个;)但它只是在工作表上不起作用?嗯,它应该起作用@Tampert将退出功能替换为退出功能(在我的机器上正常工作)!它正在搜索的范围有几个#值!它自己的错误。。。再次感谢!