如何将值从一个表复制到另一个表并计算结果? (VBA Excel)

时间:2016-12-18 13:38:54

标签: excel vba excel-vba

我有以下示例:

Sheet1

enter image description here

Sheet2

enter image description here

Main

enter image description here

主表需要Sheet1的所有值。这意味着,我需要整列,因为它总是会添加新的ID。在Sheet2列出了一些文章的折扣。因此,目标是,当用户点击“开始”按钮时,程序需要首先将Sheet1的值加载到main。之后,它会检查Sheet2中是否包含ID。例如,在sheet2中为ID 100,然后将Volume与值Up to进行比较。在Sheet2中,您有3个条目。那么,它检查50.000< 100.000。如果是,则计算50.000 * 0,2 / 100并将值返回到相应ServiceType的结果列。在这种情况下=> Service1。如何在VBA中定义它?

1 个答案:

答案 0 :(得分:1)

我会同意CMArg - 你的问题不是很好,也不清楚。想必你至少还会尝试一些东西?你应该在这里包括任何尝试以及它们失败的方式。

您并不真正需要VBA,除非您对主表的长度自动调整为Sheet1中表的长度非常重要。我只会使用表格。对于较新的用户(使用固定范围,记录宏等),VBA往往不可靠。无论如何,您可以单独处理 - 在该特定元素之外仍然不需要VBA。

其他评论:"服务"似乎与ID直接相关。因此,您应该将它存储在Sheet1而不是表2和表2中。重复它......

因此,制作3个表并将它们命名为tMain,tSheet1和tSheet2(或根据您的命名约定调整以下公式),每张表一个。虽然我没有真正看到有必要将所有这些放在单独的表格上,但是根据您提供的详细信息。这看起来像这样:

tSheet1

tSheet2

tMain

在tMain中,您需要在ID列中返回一个公式,该公式将返回Sheet1中相应行的第n个条目。你可以做到

tSheet1[@[ID]]

然而,只要你得到了& tSheet1标题不在同一行,它不会起作用。因此,更安全的方法是将tMain的标题称为起点和点。然后使用index()从tSheet1返回1,2,3 ...元素。在tMain中的ID列中如此:

=INDEX(tSheet1[ID],(ROW()-ROW(tMain[[#Headers],[ID]])))

NAME& tMain的volumn列只是一个索引匹配:

=INDEX(tSheet1[Name],MATCH([@ID],tSheet1[ID],0))
=INDEX(tSheet1[Volume],MATCH([@ID],tSheet1[ID],0))

棘手的一点是返回"服务值" (例如,您的服务1,2,3列)。根据您的解释,我不认为需要3个这样的列。无论如何,公式可以返回值而不管它是哪个服务,因此我很想将它们作为两个单独的步骤来做。所以我将添加一个" service_value"列到你的tMain。它将返回与您的"相对应的百分比列的MAX值。基于tMain音量。因此,以您的示例为例,这意味着50,000 * 0.2。如果音量为110,000,它将乘以0.3等。

{=MAX(IF([@ID]=tSheet2[ID],IF([@Volume]<tSheet2[upto],[@Volume]*tSheet2[percent]),0))}

(注意这是一个数组公式,用ctlr + alt + enter输入。不要输入{})。

您未指定的内容是,如果卷大于该文章/服务的tSheet2中指定的最大数量,该怎么办。我们需要知道要正确调整公式。

最后,如果您确实希望填充service1,service2和service3的列,则可以在每个列中执行此操作:

=IF(INDEX(tSheet1[Service],MATCH([@ID],tSheet1[ID],0))=tMain[[#Headers],[Service1]],[@[service_value]],"")
=IF(INDEX(tSheet1[Service],MATCH([@ID],tSheet1[ID],0))=tMain[[#Headers],[Service2]],[@[service_value]],"")
=IF(INDEX(tSheet1[Service],MATCH([@ID],tSheet1[ID],0))=tMain[[#Headers],[Service3]],[@[service_value]],"")

换句话说,它检查(在tSheet1中,我已经按照上面的建议放置了服务号码的规范),如果&#34; service&#34; tSheet1中的列与当前列的标题(Service1,Service2,Service3 ...)匹配。当然,您需要确保列标题与tSheet1中编写的服务名称相匹配。好处是,如果您更改了服务名称,则只需编辑列标题(而不是在某处对其进行硬编码)。