【问题标题】:If Statement Evaluates to True even when Function Returns False即使函数返回 False,If 语句也计算为 True
【发布时间】:2019-08-26 18:21:02
【问题描述】:

我有一个带有一些 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

【问题讨论】:

  • doesNotExist设置为false后不会退出。执行继续并在所有情况下执行doesNotExist = True。该函数始终返回true

标签: excel vba


【解决方案1】:

当你达到 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
                Exit Function
            End If
        End If
    Next i

    doesNotExist = True
End Function

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

另外,您不需要将值设置为false,如果您不将其设置为true,它是默认返回值,因此,我删除了您将返回值设置为false的行。

【讨论】:

  • 或者在循环开始之前将doesNotExist = True向上移动,但退出函数是一种更快的方法。
  • @DanDonoghue 是的,总体而言它可能会更好,但我在火车上并通过手机接听了电话。从技术上讲,它甚至不需要退出函数上方的假线。
  • @DanDonoghue ... 它让我变得更好,我删除了 doesNotExist = False 行。
  • 非常感谢!非常感谢您的帮助。
猜你喜欢
  • 2022-06-28
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多