我编写了一个VBA函数,通过将某个项目的重量与已知重量的项目数量进行比较来计算确定某个项目的重量。出于某种原因,它只返回 #NAME?
以下是代码:
Function getWeight(model As String) As Double
Dim weight As Double
weight = -1#
Dim compModel As String
compModel = ""
Dim prevNumMatches As Integer
prevNumMatches = 0
Dim numMatches As Integer
numMatches = 0
Dim i As Integer
Dim p As Integer
Dim samePump As Boolean
Dim sameMotor As Boolean
Dim special As Boolean
For i = 2 To 1000
compModel = CStr(Sheets("Weights").Cells(i, 1).Value)
For p = 1 To Len(compModel)
samePump = False
sameMotor = False
special = False
numMatches = 0
If p = 1 Then
If Mid(model, p, 1) = Mid(compModel, p, 1) Then
samePump = True
numMatches = numMatches + 1
End If
ElseIf p = 5 Then
If Mid(model, p, 1) <> "-" Then
special = True
End If
If Mid(model, p, 1) = Mid(compModel, p, 1) Then
numMatches = numMatches + 1
End If
ElseIf p = 9 Then
If Mid(model, p, 1) = Mid(compModel, p, 1) Then
sameMotor = True
numMatches = numMatches + 1
End If
Else
If Mid(model, p, 1) = Mid(compModel, p, 1) Then
numMatches = numMatches + 1
End If
End If
If samePump And (sameMotor Or special) Then
If numMatches > prevNumMatches Then
weight = CDbl(Sheets("Weights").Cells(i, 2).Value)
prevNumMatches = numMatches
ElseIf numMatches = prevNumMatches Then
If CDbl(Sheets("Weights").Cells(i, 2).Value) > weight Then
weight = CDbl(Sheets("Weights").Cells(i, 2).Value)
End If
End If
End If
Next p
Next i
If weight = -1# Then
getWeight = 0#
Else
getWeight = weight
End If
End Function
为什么这不会像我期望的那样返回一个数字?
答案 0 :(得分:2)
的每次迭代
p = 1 to len(compmodel)
循环将所有布尔值重置为false。这意味着声明
If samePump And (sameMotor Or special) Then
永远不会是真的,因为它永远不会在循环的同一遍中评估所有这些。将布尔设置器放在循环开始之前而不是它中。
samePump = False
sameMotor = False
special = False
numMatches = 0
For p = 1 To Len(compModel)
此外,如果你确实想使用调试器,只需运行它。通过这种方式,您可以逐行浏览代码并查看最新情况。
Sub main()
Dim THingy As Double
THingy = getWeight("R221-FT-AA1")
MsgBox (THingy)
End Sub
答案 1 :(得分:1)
该函数是(隐式地)Public
,因此获得#NAME?
错误的唯一方法是在错误类型的模块中实现它,这样Excel就不知道{{1}指的是。
您需要将标准程序模块(.bas)添加到项目中,剪切该函数并将其粘贴到那里。
Bugs aside,您应该可以从工作表中调用您的UDF。
=getWeight
,以及所有ThisWorkbook
模块,Worksheet
模块和普通类模块,对象的蓝图 ,这意味着为了调用他们的公共成员,您需要使用该类的实例来限定成员调用...并且UDF(或者就此而言的宏)调用不能这样做。
答案 2 :(得分:0)
我发现了问题。即使文件已保存为启用宏的工作簿(.xlsm),也未启用宏。当我今天早上重新打开它时,它给了我启用宏的选项。一旦我这样做并按照Jared的建议更正了代码,这一切都按计划进行。