如果语句即使函数返回False也会评估为True

时间:2019-04-04 21:42:07

标签: excel vba

我有一个带有VBA的电子表格。它提示用户使用文件浏览器选择电子表格。用户正在选择的电子表格包含一长串跨行的项目,其中一些是重复的。每个项目在相邻列中都有几个属性。

代码将获取每个项目,合并属性,并生成一个没有任何重复项目和属性合并的新工作表。

我的代码应遍历所选电子表格中的每个项目,并检查其正在构建的工作表以查看其是否已经处理了该项目。如果有,它应该继续前进。如果不是,它将获取属性,检查工作表的其余部分是否重复,将属性总计,然后将其添加到新工作表中。

在主例程中,我找到要使用的列,并使用for循环遍历用户选择的电子表格。在每次迭代中,我都调用一个函数doesNotExist()。此函数将项目名称作为参数,并将遍历新工作表上的所有项目以查看该项目是否已存在于新工作表上。如果该项目在新工作表上不存在,则返回True。否则,它将返回False

返回数据将传递到If语句,该语句仅会评估我的函数是否返回True。或者,至少应该如此。

我已经使用了很多消息框来查看我的代码到底在做什么。该功能始终正确评估数据。但是,无论返回值如何,If语句中的代码将始终执行。

我甚至在带有消息框的if语句中添加了Else。即使我的函数返回false值,该消息框也永远不会打开。

Function doesNotExist(itemName As String, itemP As String, arSheet As Worksheet) As Boolean
    'iterates through all items on the PO. Checks to see if item defined in param exists in PO

    For i = 17 To (arSheet.Range("itemCount") + 17)
        If ((StrComp(arSheet.Cells(i, 4), itemName)) = 0) Then
            If ((StrComp(arSheet.Cells(i, 7), itemP)) = 0) Then
                doesNotExist = False
            End If
        End If
    Next i

    doesNotExist = True
End Function
If (doesNotExist(wb2.Worksheets(1).Cells(i, itemName.Column), wb2.Worksheets(1).Cells(i, itemP.Column), ar)) Then
    ~code~
Else
    MsgBox ("I did not print " & wb2.Worksheets(1).Cells(i, skuName.Column))
End If

1 个答案:

答案 0 :(得分:4)

当您遇到错误时,您需要退出功能...

Function doesNotExist(itemName As String, itemP As String, arSheet As Worksheet) As Boolean
    'iterates through all items on the PO. Checks to see if item defined in param exists in PO

    For i = 17 To (arSheet.Range("itemCount") + 17)
        If ((StrComp(arSheet.Cells(i, 4), itemName)) = 0) Then
            If ((StrComp(arSheet.Cells(i, 7), itemP)) = 0) Then
                Exit Function
            End If
        End If
    Next i

    doesNotExist = True
End Function

在VBA中设置返回值不会像其他语言一样从该函数返回。

此外,您无需将值设置为false,如果未将其设置为true,则为默认返回值,因此,我删除了将返回值设置为false的行。

相关问题