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
。 - 局部variables
cell
没有被声明,这意味着它是一个即时的隐式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
。