首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel -使用VBA搜索范围

Excel -使用VBA搜索范围
EN

Stack Overflow用户
提问于 2017-08-17 18:48:48
回答 1查看 246关注 0票数 0

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

代码语言:javascript
复制
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)

但是,我无法得到一个输出。我被激怒了,我犯了什么错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-17 19:10:55

我被激怒了,我犯了什么错误?

有几个。

  • 参数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“返回值在每次迭代中都被不必要地重新分配。
  • 函数名为camelCase,但是每个VBA类型库中的公共成员都是一致的PascalCase
  • 压痕不一致。

橡胶鸭 (我管理的一个开放源代码VBE外接程序项目)会在静态代码分析中获得大部分这些要点。

代码语言:javascript
复制
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

如果返回一个Boolean而不是“魔术字符串”,则该函数将更加有用。发现时为True,未找到时为False

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45742891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档