自定义VBA函数返回#NAME?

时间:2017-04-12 19:24:14

标签: excel vba excel-vba

我编写了一个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

为什么这不会像我期望的那样返回一个数字?

3 个答案:

答案 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的建议更正了代码,这一切都按计划进行。