【问题标题】:SumIfs VBA function not working properly in macroSumIfs VBA 函数在宏中无法正常工作
【发布时间】:2020-08-10 08:57:01
【问题描述】:

我有一个表格,它应该显示两个日期(开始日期和结束日期)之间不同数值的总和。为此,我认为最好的选择是使用SumIfsWorkSheetFunction。但是,在尝试对此进行编码后,该功能无法正常工作。我不确定出了什么问题。如果我在包含我的示例数据的表格的工作表上键入完全相同的公式,它会完美运行。

所以,我设计的表格如下:

将为完成(或结束)日期添加第二个标签和文本框。但是,我认为一旦我让代码在开始时使用单个日期,这样做会更好。用户将在其中插入开始日期的文本框称为tbxDate,将显示结果总和的文本框称为tbxBalance。触发SumIfs 功能的按钮称为cmdCalculate

另外,存储数据的表(到目前为止只有一行数据用于测试目的)是这个:

表名称为Sales,工作表名称为SalesWS。我认为代码应该非常简单,除非我缺少某些东西。我所做的是:

Private Sub cmdCalculate_Click()

  Set SalesRange = Worksheets("SalesWS").Range("Sales[TOTAL]")
  Set DatesRange = Worksheets("SalesWS").Range("Sales[DATE]")
  tbxBalance = Application.WorksheetFunction.SumIfs(SalesRange , DatesRange , ">=" & tbxDate)

End Sub

问题是条件的>= 部分失败。我只使用大于或小于条件才能得到正确的结果。例如,如果我在文本框中输入日期 09/08/2020,则余额文本框中的结果为 0,但如果我输入日期 08/08/2020 或任何在它工作之前的日期。如果日期等于输入的值,它只是忽略对值求和的条件。它仅适用于大于或小于用户在文本框中输入的日期,不包括所选日期。

我已经检查了表格中包含日期的列的格式是否正确。

【问题讨论】:

  • @RonRosenfeld 那是因为如果我这样做,代码会中断得更多。如果我将Dim tbxDate As Date 放在其他任何内容之前,无论我在文本框中输入什么日期,它都会汇总表中的所有内容。如果我在SumIfs 公式的最后一个参数中执行CDate(tbxDate),则没有任何变化。它只是添加大于或小于我输入的日期,而不是相等的日期。
  • 你的日期列中日期的数据类型是什么?
  • 如果你得到那些有趣的结果,你的数据类型可能有问题。将所有数据类型都设置为变体类型几乎不是一个好主意。
  • 存储所有日期的表格列被格式化为dd/mm/yyyy格式的日期。如果我将文本框调暗为日期,则没有任何效果。有什么建议吗?
  • 确保不要将苹果与梨进行比较。您的“tbxDate”代表tbxDate.Value,它是一个看起来像日期的字符串。如果您在 DATE 范围内有类似的字符串,则您正在执行文本比较。如果范围包含真实日期,您也需要将 tbxDate 中的字符串转换为真实日期。

标签: excel vba


【解决方案1】:

如果您的 DATE 范围包含真实日期并且 tbxDate 包含 VBA 可以识别为日期的字符串,则下面给出的代码版本应该可以工作。

Private Sub cmdCalculate_Click()

    Dim Fun As Double
    
    Set SalesRange = Worksheets("SalesWS").Range("Sales[TOTAL]")
    Set DatesRange = Worksheets("SalesWS").Range("Sales[DATE]")
    Fun = Application.WorksheetFunction.SumIfs(SalesRange, DatesRange, ">=" & CLng(CDate(tbxDate.Value)))
    tbxBalance = Format(Fun, "#,##0.00")
End Sub

请记住,tbxBalance 将包含一个文本字符串,而不是一个数字。使用 Excel 的 NUMBERVALUE 函数将上述代码后 tbxBalance 中的格式化数字转换回您可以计算的数字。

【讨论】:

  • 那个技巧解决了它。现在它完美无缺。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多