我正在尝试基本上执行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)
但是,我无法获得单一输出。我越来越睁眼,我犯了什么错误?
答案 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
,声明每个变量。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
。