【问题标题】:How to do addition and subtraction from different sheet and show result on another sheet in excel如何从不同的工作表中进行加法和减法并在excel中的另一个工作表上显示结果
【发布时间】:2021-06-13 15:01:51
【问题描述】:

我有三张 Live、Buy 和 Sell,我正在那里维护项目。在购买表中,我正在跟踪所有购买项目以及购买价格和数量,类似地在销售表中跟踪销售订单。在实时工作表中,我想查看剩余的项目数。

例如,如果我购买了 200 个 XYZ 商品并出售了 100 件商品,那么在实时工作表中它应该针对 XYZ 显示 100 件商品。重要的一点是,我只在买和卖两张表中添加了条目。我希望 Live sheet 应该自动更新。

在我当前的工作表中,我使用以下公式自动更新实时工作表,但它有一个缺点,我无法为同一项目添加多个订单。我正在以多个订单购买商品,如下图所示。

=IF(ISBLANK(Buy!C3)," ",Buy!C:C)

购买表——

销售表 –

Live sheet应该是这样的——

我厌倦了一些基本的公式,如 vlookup、if 等,但这不起作用。 excel中是否有公式/技巧可以做这样的操作?

以下是软件详细信息-

我需要适用于 2013 年后所有版本的 excel 的答案。

这是我的示例文件

https://drive.google.com/file/d/1CFJqTYi75eiUnEqUoHP2py9x7qphGpMHZ/view?usp=sharing

请帮忙,谢谢您的帮助……!

【问题讨论】:

  • 你试过SUMIFSUMIFS吗?

标签: excel excel-formula office365 addition


【解决方案1】:

这是对我之前答案的完整修订,其中包含 VikaS GuttE 的评论。

假设

  • 你可以有一个额外的标签
  • “买入”、“卖出”和“实时”的结构是固定的,例如从第 2 行的标题开始。

改变以前的方法

  • “Buy”、“Sell”和“Live”不需要额外的列。
  • 从 12 个帮助列减少到 3 个。如果一个项目不能在出售选项卡上列出而不能在购买选项卡上列出,则可以进一步减少到 2 个。

标签

计算选项卡

用途:检索唯一项目列表。

突出显示的区域包含以下公式:

  • “购买”(蓝色):=IF(COUNTIF(Buy!B$3:B3,Buy!B3)=1,MAX(B$2:B2)+1))。它计算同一行但在“购买”选项卡上的项目到现在出现的频率。如果它是第一次出现,则将迄今为止的最大值加 1。这样,我就可以为每个独特的项目获得一个独特的序列。
  • “卖出”(绿色):=IF(COUNTIF(buy_item,Sell!B3)>0,FALSE,IF(COUNTIF(Sell!B$3:B3,Sell!B3)=1,MAX(calc_buy)+MAX($C2:C2)+1))。它检查同一行但在 Sell 选项卡上的项目是否已经出现在 Buy 选项卡上。在这种情况下,结果为 FALSE,否则它会检查这是否是该项目在 Sell 选项卡上的第一次出现。在这种情况下,它会使用该列中的当前最大值,加上买入列的最大值和另一个 1,以继续从买入列开始的序列。这样,每件商品都会获得一个唯一编号,无论它是在购买、出售还是两个标签上列出。
  • “独特”(橙色):=IF(ROW()-2>MAX(calc_sell),"",IF(ISNA(INDEX(buy_item,MATCH(ROW()-2,calc_buy,0))),INDEX(sell_item,MATCH(ROW()-2,calc_sell,0)),INDEX(buy_item,MATCH(ROW()-2,calc_buy,0))))。它检查当前行减 2(公式从第 3 行开始)是否高于卖出列的最大值。在这种情况下,不再有唯一的项目,并且单元格保持为空。否则,它会检查当前项目是否可以在“购买”选项卡上找到。如果没有,则从“销售”选项卡中获取该项目。

实时标签

突出显示的区域包含以下公式:

  • “项目”(紫色):=Calc!E3。这只是对唯一项目列表中当前条目的引用。
  • “价格”(红色):=IF(B3="","",SUMIF(buy_item,B3,buy_price)-SUMIF(sell_item,B3,sell_price))。它检查同一行中是否存在有效项目。如果是,它会将该商品的所有购买价格相加并减去所有销售价格。

购买标签

销售标签

命名范围

  • buy_item:=购买!$B:$B
  • buy_price: =Buy!$C:$C
  • calc_buy: =Calc!$B:$B
  • calc_sell: =Calc!$C:$C
  • sell_item: =Sell!$B:$B
  • sell_price: =Sell!$C:$C

使用的公式

  • COUNTIF(Excel 2003+)
  • 索引(Excel 2003+)
  • 匹配(Excel 2003+)
  • MAX(Excel 2003+)
  • (Excel 2003+)
  • SUMIF(Excel 2003+)
  • IFNA(Excel 2013+)

公式深入讲解

计算标签,带有标题购买的“B”列,蓝色区域:=IF(COUNTIF(Buy!B$3:B3,Buy!B3)=1,MAX(B$2:B2)+1))

让我们分解一下: =IF(does_item_occur_for_first_time, next_unique_number)

  • does_item_occur_for_first_time = COUNTIF(Buy!B$3:B3,Buy!B3)=1 Buy!B$3:B3 这引用了“购买”选项卡上的“项目”列。由于标题位于第 2 行,我从第 3 行开始。重要请注意范围的确切定义。只有范围定义开始部分的行(冒号左侧的术语)由其前面的美元符号固定。范围末尾部分(冒号右侧)的行不固定。这样,范围随着每一行而增长,并且它只检查到目前为止的值。 “购买!B3”将“购买”选项卡上单元格 B3 的内容作为“COUNTIF”公式的条件。 重要提示所有四个标签都需要具有相同的结构,这意味着标题应该在同一行开始。此外,“买入”、“卖出”和“实时”三个选项卡上的“项目”和“价格”两列需要处于相同的顺序和列中。也许,将这三个选项卡视为 3D 立方体中的不同 z 级别可能会有所帮助。上面的公式位于“计算”选项卡上的单元格 B3 中,因此它会检查“购买”选项卡上的单元格 B3 的内容。

把这些“does_item_occur_for_first_time”放在一起,它就按照它说的做了。它会检查同一单元格中但在“购买”选项卡上的项目是否第一次出现,这意味着该单元格上方没有已包含该给定项目的条目。

  • next_unique_number = MAX(B$2:B2)+1)。我们看上面的区域(看,只有冒号左边的行是固定的($)来确定最新的数字。当没有数值时(例如空单元格或标题),那么它假定为 0。我们只需要要做的是加 1 以获得下一个数字。请注意,增长范围从第 2 行开始,因为我们要确定第 3 行的数字。

计算标签,带有标题卖出的“C”列,绿色区域:=IF(COUNTIF(buy_item,Sell!B3)>0,FALSE,IF(COUNTIF(Sell!B$3:B3,Sell!B3)=1,MAX(calc_buy)+MAX($C2:C2)+1))

=IF(did_item_occur_on_buy_tab,FALSE,IF(does_item_occur_on_sell_tab_for_the_first_time,next_unique_number_overall))

  • did_item_occur_on_buy_tab = COUNTIF(buy_item,Sell!B3)>0 "COUNTIF" 用于确定 Sell(!) 选项卡上 B3 中的当前项目是否已在“购买”选项卡上列出。如果是这种情况,则此公式的结果为“FALSE”。请注意:这次我们检查“购买”标签上的整个“物品”列。

  • does_item_occur_on_sell_tab_for_the_first_time = ´COUNTIF(Sell!B$3:B3,Sell!B3)=1´ 这个公式类似于上面解释的“does_item_occur_for_the_first_time”。 请注意,Sell 选项卡上的列与公式单元格的列不匹配,因为“Items”位于“Calc”选项卡上已占用的“B”列中。

  • next_unique_number_overall = MAX(calc_buy)+MAX($C2:C2)+1 第二部分(加号之后)类似于上面解释的“next_unique_number”。不同之处在于第一部分,因为我们不想从 1 重新开始您的序列,而是使用“购买”列的最大数量。

计算选项卡,带有标题唯一的“E”列,橙色区域:=IF(ROW()-2>MAX(calc_sell),"-",IF(ISNA(INDEX(buy_item,MATCH(ROW()-2,calc_buy,0))),INDEX(sell_item,MATCH(ROW()-2,calc_sell,0)),INDEX(buy_item,MATCH(ROW()-2,calc_buy,0))))

=IF(is_there_another_unique_item,"",IF(the_item_did_not_occur_on_buy_tab,get_item_from_sell_tab,get_item_from_buy_tab))

  • is_there_another_unique_item = ROW()-2>MAX(calc_sell)。我们检查当前行减 2(因为标题位于第 2 行)是否大于唯一项目的最高数量。如果是这种情况,那么我们什么也不显示(“”)。

  • the_item_did_not_occur_on_buy_tab = ISNA(INDEX(buy_item,MATCH(ROW()-2,calc_buy,0)))MATCH(ROW()-2,calc_buy,0) 在“calc_buy”列中查找等于当前行减去 2 的数字。结果是“N/A”或与具有相应项目名称的“calc_buy”范围有关的行。在这里,该术语包含在“ISNA”中,因为我想确定该数字(项目的第一次出现)是否属于“买入”或“卖出”选项卡。 重要:所有命名范围,这里“buy_item”和“calc_buy”需要有相同的开始和结束行。为方便起见,我将所有范围设置为包含整列。

  • get_item_from_sell_tab = INDEX(sell_item,MATCH(ROW()-2,calc_sell,0))。公式与上面没有“ISNA”包装器的公式相同。它从出售标签中选择物品的名称。

  • get_item_from_buy_tab = INDEX(buy_item,MATCH(ROW()-2,calc_buy,0))。第三次使用相同的公式。在这里,它从购买选项卡中选择商品的名称。

陷阱以及如何避免它们

  • BuySellLive 以及在一定程度上Calc 需要具有相同的结构。每个选项卡的内容必须从同一个单元格(此处为 B2)开始。如果要添加或删除列或行,则应一次选择所有选项卡并执行该操作。 别忘了在完成后取消标签组合。
  • 扩展 Calc 上的公式,直到它们涵盖您在 BuySell 上的所有内容,例如如果买有 100 行,卖 150 行,那么公式也应该包含在标题下方的 150 行中。
  • 所有命名范围需要覆盖具有相同开始行和结束行的相同行。在这里,所有命名范围都覆盖了整个列。如果您无法使用名称,您可以购买相应的范围定义来替换它们(见上文)。

【讨论】:

  • 抱歉,这不是正确的方法,因为我不能使用其他列 Rank, Row & Iterator
  • @VikaSGuttE:感谢您的反馈。我完全修改了我的解决方案。
  • 您能告诉我,您在哪个公式中遇到问题?您之前是否定义了范围名称?
  • 链接失效。我收到文件不存在的消息。
  • 可能是我做错了,如果您想尝试自己的,这是我的文件。谢谢你。 tmpfiles.org/55933/sheet.xlsx
【解决方案2】:

你可以用这样的一个查询来做到这一点:

=arrayformula(query({Buy!A2:B;Sell!A2:A,-Sell!B2:B},"select Col1,sum(Col2) where Col1 is not null group by Col1 label Col1 'Item',sum(Col2) 'Price' ",0))

【讨论】:

  • 不工作似乎Query 函数在Office 365 中不可用
【解决方案3】:

我能找到的唯一方法真的很麻烦。在这里 - 需要 Excel 2019 或 365:

在 Live 的 A2 单元格中,用这个公式推导出所有唯一的项目:

=LET( buys, Buy!A:B,
      sales, Sell!A:B,
       bMatrix, FILTER( buys,NOT( ISBLANK( INDEX( buys, , 1 ) ) )*(INDEX( buys, , 1 )<>"Item") ),
       bItems, INDEX( bMatrix, , 1 ), rB, ROWS( bItems ),
       sMatrix, FILTER( sales,NOT( ISBLANK( INDEX( sales, , 1 ) ) )*(INDEX( sales, , 1 )<>"Item") ),
       sItems, INDEX( sMatrix, , 1 ), sB, ROWS( sItems ),
       idx, MOD( SEQUENCE( rB + sB,,0 ), rB) + 1,
       UNIQUE( IFERROR( INDEX( bItems, idx, 1 ), sItems ) )
      )

在Live的B2单元格中输入这个公式:

=SUMIF( Buy!A:A, A2#, Buy!B:B ) - SUMIF( Sell!A:A, A2#, Sell!B:B )

结果如下:

这运行非常慢,因为它试图从列中发现数组。如果您改用 Excel 表格,它会加快速度。我创建了 tBuy 和 tSell,Live!A2 中的公式变为:

=LET( buys, tBuy,
      sales, tSell,
       bItems, INDEX( tBuy, , 1 ), rB, ROWS( bItems ),
       sItems, INDEX( tSell, , 1 ), sB, ROWS( sItems ),
       idx, MOD( SEQUENCE( rB + sB,,0 ), rB) + 1,
       UNIQUE( IFERROR( INDEX( bItems, idx, 1 ), sItems ) )
      )

在 Live!B2 中变成:

=SUMIF( tBuy[Item], D2#, tBuy[Price] ) - SUMIF( tSell[Item], D2#, tSell[Price] )

【讨论】:

  • 不工作它说功能无效
  • 您有 Excel 365 还是 Excel 2019?
  • 我已经添加了有问题的细节,如果我让你感到困惑,请道歉。
  • 嗯,好的 - 我的依赖于 UNIQUE,没有简单的方法可以绕过它 - 这是 Excel 2019 的功能。
  • 我的有什么办法吗? ?
【解决方案4】:

更新:您可以尝试这种新方法={UNIQUE(Buy!A:A), {"Price";ArrayFormula((SUMIF(Buy!A2:A, UNIQUE(Buy!A2:A), Buy!B2:B))-(SUMIF(Sell!A2:A, UNIQUE(Buy!A2:A), Sell!B2:B)))}}。我的系统上没有 Excel,所以我无法在 Excel 中检查它。但由于这个没有使用Query,它应该也可以在 Excel 上运行。

上一个答案: 在Live 表的A1 中使用此公式:

=QUERY({QUERY(Buy!A1:B, "select A, B where A is not null", 1);QUERY(Sell!A2:B, "select A, -1*B where A is not null label -1*B ''", 0)}, "select Col1, sum(Col2) group by Col1 label sum(Col2) 'Price'", 1)

假设所有数据(包括标题)在BuySell 表中的A1 开始。

【讨论】:

  • 不工作似乎Query 函数在Office 365 中不可用
  • 这适用于您在问题中标记的 Google 表格。
  • 如果我不清楚,请道歉,但我在两个平台上都需要。
  • 刚刚发布了答案的更新。看看这是否有效。
  • UNIQUEOffice 365 中不可用?。
猜你喜欢
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2023-03-31
相关资源
最近更新 更多