我基本上是想做一个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)
但是,我无法得到一个输出。我被激怒了,我犯了什么错误?
发布于 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,并声明每个变量。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如果返回一个Boolean而不是“魔术字符串”,则该函数将更加有用。发现时为True,未找到时为False。
https://stackoverflow.com/questions/45742891
复制相似问题