【问题标题】:Passing cells as input parameters of formula in other spreadsheet将单元格作为其他电子表格中公式的输入参数传递
【发布时间】:2014-06-21 04:26:11
【问题描述】:

我的工作簿如下所示:

Sheet1:
      A       B            C            D
1     VarName Multiplier1  Multiplier2  Multiplier3
2     Var1    0.3          0.8          0.4
3     Var2    0.4          0.9          0.1
...  
100   Var100  0.2          0.2          0.7
101           Parameter1   Parameter2   Index
102           Sheet2!A2    Sheet2!B2    Complicated formulas like =SUMPRODUCT(B2:B100, C2:C100, D2:D100)+C102/B102

Sheet2:
         A            B            C
1        Parameter1   Parameter2   FinalResult
2        100          25           Complicated formulas like =IF(Sheet1!D102<1, 1, Sheet1!D102)

Sheet3:
         A            B            C
1        Parameter1   Parameter2   FinalResult
2        110          30           ?
3        140          40           ?
...(about 200,000 rows)

更多信息: 在 Sheet1 和 Sheet2 中,实际公式比此处显示的公式要复杂得多。在 Sheet1 中,我们从 Sheet2 的 7 个基本参数计算出 154 个中间变量,sumproduct 只是一个中间函数。在 Sheet2 中有 15 种不同的情况,具体取决于从 Sheet1 计算的参数和指数。所以基本上我不能把它们硬编码在一起,唯一的入口是在 Sheet2 中。我不会更改Sheet1和Sheet2的另一个原因是因为这是从其他公司购买的模型,我们被告知使用它的方式是在Sheet2中输入参数。

如何在 Sheet3 的 C 列中编写公式,以便计算每对 Parameter1 和 Parameter2 的结果?我尝试录制宏以复制和粘贴如下:

Sub ToEnd()

Dim i As Long

Application.ScreenUpdating = False

i = 1

While i < 200000
    Worksheets("Sheet3").Range("A1:B1").Offset(i, 0).Select
    Selection.Copy
    Sheets("Sheet2").Select
    Range("A2").Select
    ActiveSheet.Paste
    Range("C2").Select
    Selection.Copy
    Sheets("Sheet3").Select
    Range("C1").Offset(i, 0).Select
    Selection.PasteSpecial Paste:=xlValues
    i = i + 1
    Wend
End Sub

但是在 6 秒内我只得到 200 个结果,我估计一个案例的时间复杂度最多为 10^4,所以它比我预期的要慢得多。我想知道Sheet3的C2中是否可以写一些东西看起来像

=PassingParameterAndGetReturnValue(A2:B2, Sheet2!$A$2:$B$2, Sheet2!$C$2)

我可以用内循环自动填充因此更快吗?或者任何其他更好的方式来完成我的任务都会受到欢迎。

【问题讨论】:

  • 您是否尝试记录类似假设分析的内容,您更改Sheet2 的参数并记录索引?

标签: excel vba


【解决方案1】:

更新答案:

我需要一个函数 f 看起来像 f(x) {将 x 放在 Sheet2 的正确位置;等到Sheet2完成计算;从 Sheet2 的另一个地方获取结果并返回}

=PassingParameterAndGetReturnValue(A2:B2, Sheet2!$A$2:$B$2, Sheet2!$C$2)

您想要的自定义函数 (UDF) 需要更改其他单元格的值,这在 Excel 环境中是不可能的。您正在做的方式(“单元格复制和粘贴”)是通过 VBA Sub 过程运行的。但是您可能也注意到这不是一个好主意,因为单元格复制和粘贴是在前端执行屏幕更新的,这看起来很慢。 在这篇文章中了解更多详情:Set a cell value from a function

正如我之前所说,无论表格 1 中涉及多少变量/公式,您的表格 2 都是多余的。它将您的计算分开并增加您的工作流程。表 2 的输入参数显然是表 3 的虚拟参数。您可以将表 2 的公式移动到表 1 以保持一致性。

如果您真的需要自定义函数,唯一的方法是按照我之前发布的以下步骤修改工作表结构。或者,您也可以编写一个需要高度定制编码的 Sub,通过查看每个计算工作流程细节。同样,代码/公式可以根据您的场景的实际情况而有所不同。除非我得到整个工作簿,否则我不能在这里为你硬编码。

我不建议您使用 VBA 方法来完成您的任务(编码 Sub 或 UDF)。据我了解,您的任务可以完全由正常的工作表功能完成。我希望你能从下面的工作表图片中得到一些提示。


之前的回答:

实际上,您不需要 VBA 和 Sheet 2。您可以通过一个公式得到结果:

基本工作表公式函数方法

我可以看到您的 sheet2 的目的仅用于单次计算(公式Sheet2!D102)。 另一个公式存储在 Sheet1 中(公式Sheet1!D102)。

实际上,您可以将Sheet1!D102Sheet2!D102 中的两个公式合并为一个公式。

例如,在 Sheet3 单元格 C2 中,您可以使用以下公式:

=IF((SUMPRODUCT(Sheet1!$B$2:$B$11,Sheet1!$C$2:$C$11,Sheet1!$D$2:$D$11)+(B2/A2))<1,1,(SUMPRODUCT(Sheet1!$B$2:$B$11,Sheet1!$C$2:$C$11,Sheet1!$D$2:$D$11)+(B2/A2)))

上面的公式逻辑可以简化为:

=IF( (SumProductResult+(Parameter2/Parameter1))<1 , 1 , (SumProductResult+(Parameter2/Parameter1)) )

逻辑和算法(不是公式/代码):

If (SumProductResult+(Parameter2/Parameter1)) < 1  
Then show/Return 1  
Else show/Return (SumProductResult+(Parameter2/Parameter1))  
End If 

VBA 方法

如果你真的希望 VBA 这样做,那么你使用 VBA 来创建自定义函数(仍然使用上述算法)。

Function FinalResultReturn(SumProductResultCell As Double, Parameter1 As Double, Parameter2 As Double) As Double
    ComputedValued = SumProductResultCell + (Parameter2 / Parameter1)

    If ComputedValued < 1 Then
        FinalResultReturn = 1
    Else
        FinalResultReturn = ComputedValued
    End If
End Function

如何使用这个 VBA:

  1. 创建一个 VBA 模块并粘贴上面的代码以创建新的自定义函数。
  2. 现在您可以在工作表中使用自定义函数了。

语法:

=FinalResultReturn( SumProductResultCell , Parameter1 , Parameter2 )

示例:
在 Sheet3 单元格 C2 中输入:

=FinalResultReturn(Sheet1!$D$999,A3,B3)  

其中Sheet1!$D$999 是 SumProductResultCell,即=SUMPRODUCT(B2:B100, C2:C100, D2:D100)。
(PS:我创建这个 SumProductResultCell 是为了最小化自定义函数的输入参数。)


我希望我没有误解您的工作表计算工作流程。如果是,请告诉我并进行修改。

【讨论】:

  • 谢谢你的回答,我可能让它看起来像一个简单的公式,但实际上它要复杂得多,所以我不能把它们硬编码在一起。我在帖子中添加了更多信息,希望现在更清楚。
  • 使用 VBA 复制和粘贴不是一个好主意。我可以想象你的情况有多复杂。但是我无法计算出您的实际情况,因为代码/公式可能会有所不同(例如,取决于参数/输入变量)。正如您在标题中所问的那样:“将单元格作为其他电子表格中公式的输入参数传递”。我的 VBA 方法对您来说是一个很好的起点。尝试修改代码。一旦您了解了工作流程以及如何创建自定义函数,您就可以轻松编写代码。如果您在编码方面需要更多帮助,请随时留下您的问题。
  • 我通过你的代码学习了如何创建自定义函数,但我仍然无法得到我需要的,基本上我需要一个函数 f 看起来像 f(x) {将 x 放在 sheet2 的正确位置;等到 sheet2 完成计算;从 sheet2 的另一个地方获取结果并返回},你能帮我编写一个这样的函数吗?
  • 很遗憾地告诉您,您想要的自定义功能无法实现,详情请参阅我的更新答案。希望对您有所帮助。
  • 我按照你说的尝试了,把所有东西都合并到sheet1中,做了一些繁琐的硬编码,现在速度快了大约6倍,虽然它仍然需要大约20分钟才能运行,我已经很满意了.谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多