Sub Sales_Summary_Macro()
Dim strMake, strModel, strCount As String
Dim makeLoc, modelLoc, countLoc As Integer
strMake = Application.InputBox("Make")
strModel = Application.InputBox("Model")
strCount = Application.InputBox("Count")
If strMake <> False Then
Debug.Print strMake
Debug.Print strModel
Debug.Print strCount
makeLoc = WorksheetFunction.Match(strMake, Range("A1:A10"), 0)
Debug.Print makeLoc
End If
End Sub
我只想在三个不同的变量上获取用户的字符串输入,并找到包含每个变量的列。我单独尝试过Application.Match()和Match(),但似乎都不起作用。
答案 0 :(得分:4)
不完全技术,不会发布代码。但是,有三件事:
一个,确保您的范围始终完全合格。例如,Range("A1:A10")
还不够。您应该指定它应该位于哪个工作表上。如果您从另一个工作表调用此宏,它将给您一个错误的结果或抛出错误。
两个,没有太多细节:
Application.Match
会返回错误值。这可以使用IsError
来处理,这是simoco在他的回答中所做的。WorksheetFunction.Match
在找不到错误时抛出 1004
错误。这与返回值不同。因此,这(稍微)难以处理。最佳做法是始终使用第一个。
三,VBE中的即时窗口是您最好的朋友。窗口中的简单?Application.Match("FindMe", [A1:A10], 0)
可以帮助您检查您的公式是否符合类似预期的结果。
如上面的屏幕截图所示,找不到任何字符串,并返回错误值。
希望这有帮助!
答案 1 :(得分:2)
<强> UPD:强>
是否可以让它像C1一样返回单元格引用,然后在其他函数中使用该单元格引用
Sub Sales_Summary_Macro()
Dim strMake As String, strModel As String, strCount As String
Dim makeLoc, modelLoc As Integer, countLoc As Integer
Dim res As Range
strMake = Application.InputBox("Make")
strModel = Application.InputBox("Model")
strCount = Application.InputBox("Count")
If strMake <> "False" Then
Debug.Print strMake
Debug.Print strModel
Debug.Print strCount
On Error Resume Next
'Set res = Range("A1:Z1").Find(What:=strMake, LookAt:=xlWhole, MatchCase:=False)
Set res = Application.Index(Range("A1:A10"), Application.Match(strMake, Range("A1:A10"), 0))
On Error GoTo 0
If res Is Nothing Then
MsgBox "Nothing found!"
Exit Sub
End If
'Print address of result
Debug.Print res.Address
makeLoc = res.Value
Debug.Print makeLoc
End If
End Sub
BTW,
当您使用Dim strMake, strModel, strCount As String
时,只有strCount
的类型为String
,strMake, strModel
为Variant
。
Dim makeLoc, modelLoc, countLoc As Integer
同样的事情 - 只有countLoc
有Integer
类型。
答案 2 :(得分:0)
这不是OP的直接答案,但是像我这样的人在尝试 TRAP vba Match
错误时可能会发现此问题很有用。通常,我将使用它来测试数组中是否存在值。
使用Application.Worksheetfunction.Match
时非常发疯,并且当不存在值时无法用True
捕获IsError
。甚至WorksheetFunction
错误处理程序(iserr
,isNA
等)也不会将其捕获为True
,而是抛出 1004无法获得匹配的VBA错误。属性。
这可以通过使用Application.Match
而不是Application.WorksheetFunction.Match
来解决。这是最违反直觉的,因为在输入Match
之后Application.
不会出现在智能感知中,也不会显示Application.Match(
提示输入哪些字段。
同时使用Application.WorksheetFunction.Match
会自动填充提示,可以理解的是,这些提示可以激发用户采用这种方法,然后感到困惑,为什么他们无法成功捕获错误。