Excel - 使用VBA搜索范围

时间:2017-08-17 18:48:49

标签: excel vba excel-vba

我正在尝试基本上执行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)

但是,我无法获得单一输出。我越来越睁眼,我犯了什么错误?

1 个答案:

答案 0 :(得分:1)

  

我越来越恍惚,我犯了什么错误?

几种。

  • 参数Range被声明为String,但显然就像它是Range对象一样。应该声明As Range
  • 名称Range隐藏Global.Range,这可能是也可能不是问题(在这种情况下 )。在更广泛的范围内隐藏/隐藏现有声明通常是一个坏主意。
  • 该函数隐式Public。如果明确的话,那就更好了。
  • 隐式传递参数ByRef,但没有理由;他们应该通过ByVal
  • 参数searchCell是隐式Variant,但它被用作Range对象;声明它As Range
  • 函数返回隐式Variant,但实际上返回String。签名应为返回类型指定As String
  • 未声明局部变量cell,这意味着它是一个动态隐式Variant。明确声明,As Range
  • 使用未声明的变量编译的代码没有指定Option Explicit,这意味着VBA将很乐意编译并运行任何拼写错误。避免愚蠢的尴尬问题,在每个模块的顶部指定Option Explicit 声明每个变量
  • 每次迭代都会不必要地重新分配“No Match”返回值。
  • 函数名称为camelCase,但每个VBA类型库中的公共成员始终为PascalCase
  • 缩进不一致。

Rubberduck(我管理的一个开源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

IMO如果返回Boolean而不是“魔术字符串”,该函数会更有用。找到True后,找不到False