【问题标题】:Sumif with multiple criteria具有多个条件的 Sumif
【发布时间】:2021-06-29 08:41:16
【问题描述】:

我想管理我正在购买的股票。我有一个分类帐表,用于存储 TransactionDate、Stock、Ticker、Qty、Price、BrokeFee 和其他一些数据。我还有一个 StockHistory 表,我使用 Excel 中内置的 stockhistory 功能(通过 VBA)拉出每日开盘价、收盘价、最高价、最低价和成交量。

在 StockHistory 表中,我试图在 StockHistory 表中查找 Ticker 并执行 Sumif,其中我想要特定日期的特定代码(或股票)的总数。

工作单元格公式,其中 C 列是 StockHistory 表中的代码,A 列是日期。

=SUMIFS(U:U,S:S,C7,Q:Q,"<=" & A7) 

VBA 中的以下内容似乎忽略了日期标准,并给出了指定日期之前和之后的总体总计。

Ticker = Cells(LastRowD, 3).Value
DateCheck = Cells(LastRowD, 1).Value
Qty = Application.WorksheetFunction.SumIfs(Range("U:U"), _
  Range("S:S"), "=" & Ticker, Range("A:A"), "<=" & Range("A" & LastRowD))

见过类似的问题,但没有一个标准适用而另一个标准被忽略(但完成时没有错误)。

注意:我将这两个表放在不同的工作表上,但在我进行故障排除时已将分类帐复制到 StockHistory 选项卡以消除引用不同工作表的问题。

【问题讨论】:

  • Debug.Print VarType(DateCheck) 在即时窗口中返回什么?
  • 返回 7。但是你确实让我想到了日期,我相信这是问题的一部分。我在澳大利亚,所以我们的日期格式是 dd/mm/yyyy,这就是我在两个表中格式化日期的方式(并已验证)。我扩大了日期范围,任何一天超过 12 天的日期都返回 0,而其他日期是正确/不正确的混合。看这张图片
  • 好吧,看来这是日期的问题,但我尝试过,我无法让它干净地工作。然而,我设法让它工作,没有任何计算错误。我这样做的方法是在每个表中添加一个额外的列,用于以数字格式(即 23/2/21 = 44250)的日期,然后使用这些列来验证日期而不是日期列。如前所述,感觉问题是因为在澳大利亚,我们的日期格式与美国和其他地区不同。在我看来(我记得几年前在 MS Access VBA 中的类似内容)VBA 存在这种格式的问题。
  • 有什么建议可以让我重新使用日期列,这样我就不需要这个额外的列了吗?
  • 如果日期是“真实日期”(即,如果您将单元格格式化为General,它将显示五位数字),然后尝试使用 Range 对象的 .Value2 属性来代替在引用工作表上的日期时,默认的 .Value 属性与您现在一样。 (由于您没有提供说明您的问题的数据示例,并且可以将其粘贴到我的工作表中,因此我无法确定重现您的问题)。阅读 MS 文档以了解差异。

标签: excel vba criteria sumifs


【解决方案1】:

感谢 Ron,使用 value2 有效。昨晚很晚,我尝试了另一个选项,该选项也有效,但对使用 Int(cbdl(.....)) 不满意。不知道为什么日期会发生这种情况。单元格绝对是 dd/mm/yyyy 格式的日期格式,就像我的 Windows 区域设置一样。如前所述,我记得几年前在 MS Access 中遇到过类似的问题。它似乎有时只出现在日期中,在我当前的项目中,所有其他引用日期的代码都按预期工作。有些人甚至在有这个问题的同一列上。当您直接搜索它(例如澳大利亚日期 vba)时,谷歌上的公平位,但现在它的工作,所以只是将它留在那个。 再次感谢罗恩

一些截图 Spreadsheet VBA Screenshot 电子表格版本 1。Invalid totalsHigh day numbers return '0' 工作版。所有 3 个工作版本都返回相同的输出。 Sample, High Day sample working

For LastRowD = LastRowD To LastRowB
    Ticker = Cells(LastRowD, 3).Value
    Qty = Application.WorksheetFunction.SumIfs(Range("U:U"), Range("S:S"), "=" & Ticker, Range("Q:Q"), "<=" & Range("A" & LastRowD).Value2)
    Cells(LastRowD, 4) = Qty
    Cells(LastRowD, 5) = Application.WorksheetFunction.Product(Qty, Cells(LastRowD, 7))
Next LastRowD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2020-04-14
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多