Excel – 通过VBAsearch范围

我试图基本上做一个VLOOKUP ,但我的单元格内容太长, VLOOKUP处理。 因此,我使用这个VBA脚本来search定义的范围:

 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被声明为一个String ,但清楚地使用,就好像它是一个Range对象。 它应该被声明As Range
  • 名称Range隐藏Global.Range ,这可能是也可能不是问题( 在这种情况下不是)。 在更广泛的范围内隐藏/遮蔽现有的声明通常是一个坏主意。
  • 该函数隐式地为Public 。 如果明确的话更好。
  • 参数隐式地传递给ByRef ,但没有任何理由。 他们应该通过ByVal
  • 参数searchCell是一个隐含的Variant ,但它被当作是一个Range对象使用; 将其声明As Range
  • 函数返回一个隐式的Variant ,但是真的返回一个String 。 签名应该指定为返回types的As String
  • 局部variablescell没有被声明,这意味着它是一个即时的隐式Variant 。 声明它As Range
  • 使用未声明的variables编译的代码没有指定Option Explicit ,这意味着VBA将愉快地编译和运行任何错字。 避免愚蠢的尴尬问题,在每个模块的顶部指定Option Explicit ,并声明每个variables
  • 每次迭代不必要地重新分配“不匹配”返回值。
  • 函数名称是camelCase ,但每个VBAtypes库中的公共成员都是一致的PascalCase
  • 缩进不一致。

Rubberduck (我pipe理的一个开源的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而不是“魔术string”,那么IMO函数会更有用。 发现时为True ,未发现时为False