用户定义函数VBA引发错误

问题描述

我在vba中创建了一个用户定义的函数,根据先进先出库存系统计算利润。在转到实际代码之前,我想检查一下输入是否有效。

'---------------Check information for errors----------------------
    SellSum = Application.WorksheetFunction.Sum(SellQuantity)
    BuySum = Application.WorksheetFunction.Sum(BuyQuantity)
    
    
    SellPCount = Application.WorksheetFunction.Count(SellPrice)
    SellQCount = Application.WorksheetFunction.Count(SellQuantity)
    BuyPCount = Application.WorksheetFunction.Count(BuyPrice)
    BuyQCount = Application.WorksheetFunction.Count(BuyQuantity)

    
    If SellSum > BuySum Then                                        'More sales than inventory,throw error
        FIFO_PROFIT = VBA.CVErr(XlCVError.xlErrValue)
    End If
    
    If (BuyPCount <> BuyQCount Or SellPCount <> SellQCount) Then    'Incomplete data,throw error
        FIFO_PROFIT = VBA.CVErr(XlCVError.xlErrValue)
    End If
'-----------------------------------------------------------------

在真实代码之后,我得到了最终值,

FIFO_PROFIT = RunningProfit

但是,当我输入无效的数据时,应该会引发错误,但它没有执行任何操作。就像它只是跳过错误检查并跳到实际的代码一样。

实际代码有点冗长,我认为它与它没有任何关系。但是,如果有人想对其进行审查, https://pastebin.com/fA2pY52f

解决方法

我会说类似的事情可能会起作用:

<form action="">
  <p>Please select your Age:</p>
  <input type="radio" id="below_18" name="age" value="below_18">
  <label>Below 18</label><br>
  <input type="radio" id="18_25" name="age" value="18_25">
  <label>15-25</label><br>
  <input type="radio" id="above_25" name="age" value="above_25">
  <label>above 25</label><br>
</form>

我已经完成了整个功能,并添加了3行代码。我没有检查代码本身,因此没有对其进行评估。在两种情况下(更多的销售和不完整的数据),已经像您已经正确设置了FIFO_PROFIT,然后Function FIFO_PROFIT(SellPrice As Variant,SellQuantity As Variant,BuyPrice As Variant,BuyQuantity As Variant) As Variant 'Calculate the Profit according to the FIFO method '---------------Check Information for errors---------------------- SellSum = Application.WorksheetFunction.Sum(SellQuantity) BuySum = Application.WorksheetFunction.Sum(BuyQuantity) SellPCount = Application.WorksheetFunction.Count(SellPrice) SellQCount = Application.WorksheetFunction.Count(SellQuantity) BuyPCount = Application.WorksheetFunction.Count(BuyPrice) BuyQCount = Application.WorksheetFunction.Count(BuyQuantity) If SellSum > BuySum Then 'More sales than inventory,throw error FIFO_PROFIT = VBA.CVErr(XlCVError.xlErrValue) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX GoTo FIFO_PROFIT_IS_ERROR '<--------------------ADDED CODE (1 of 3)X 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX End If If (BuyPCount <> BuyQCount Or SellPCount <> SellQCount) Then 'Incomplete data,throw error FIFO_PROFIT = VBA.CVErr(XlCVError.xlErrValue) 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX GoTo FIFO_PROFIT_IS_ERROR '<--------------------ADDED CODE (2 of 3)X 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX End If '----------------------------------------------------------------- '--------------MoreVariables-------------------------------------- Dim RunningSale As Variant Dim RunningBuy As Variant Dim RunningCost As Variant Dim RunningBuyQuantity As Variant Dim RunningSales As Variant Dim RunningProfit As Variant Dim Residual As Variant Dim UsedupResidual As Variant Dim y As Variant y = 1 RunningCost = 0 Residual = 0 UsedupResidual = 0 RunningSales = 0 RunningProfit = 0 '----------------------------------------------------------------- For x = 1 To SellQCount If y <> 1 Then 'BUGtest RunningBuyQuantity = Residual + BuyQuantity(y).Value2 End If While (RunningBuyQuantity <= SellQuantity(x).Value2 And y <= BuyQCount) 'Bugtest If y = 1 Then RunningCost = RunningCost + (BuyPrice(y).Value2 * BuyQuantity(y).Value2) Else RunningCost = RunningCost + ((BuyPrice(y).Value2 * BuyQuantity(y).Value2) + (BuyPrice(y - 1).Value2 * Residual)) End If Residual = 0 RunningBuyQuantity = RunningBuyQuantity + BuyQuantity(y).Value2 y = y + 1 Wend If RunningBuyQuantity > SellQuantity(x).Value2 Then Residual = SellQuantity(x).Value2 - RunningBuyQuantity UsedupResidual = BuyQuantity(y).Value2 - Residual RunningCost = RunningCost + (UsedupResidual * BuyPrice(y).Value2) End If RunningSales = SellPrice(x).Value2 * SellQuantity(x).Value2 RunningProfit = RunningProfit + RunningSales - RunningCost RunningSales = 0 RunningCost = 0 Next x FIFO_PROFIT = RunningProfit 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX FIFO_PROFIT_IS_ERROR: '<--------------------ADDED CODE (3 of 3) X 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX End Function 指令将代码发送到FIFO_PROFIT_IS_ERROR行,该行方便地位于函数末尾。有关GoTo指令here的更多信息。

然后,您也可以使用GoTo指令。它不需要第三行FIFO_PROFIT_IS_ERROR,它也可以工作。这样会导致:

Exit Function