在其他电子表格中传递单元格作为公式的input参数

我的工作簿看起来像这样:

Sheet1: ABCD 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: ABC 1 Parameter1 Parameter2 FinalResult 2 100 25 Complicated formulas like =IF(Sheet1!D102<1, 1, Sheet1!D102) Sheet3: ABC 1 Parameter1 Parameter2 FinalResult 2 110 30 ? 3 140 40 ? ...(about 200,000 rows) 

更多信息:在Sheet1和Sheet2中,实际的公式要比这里显示的公式复杂得多。 在Sheet1中,我们有154个中间variables,它们是从Sheet2的7个基本参数计算出来的,而sumproduct只是一个中间函数。 在Sheet2中有15个不同的情况,这取决于从Sheet1计算的参数和索引。 所以基本上我不能拼凑在一起,唯一的入口是在Sheet2中。 我不会更改Sheet1和Sheet2的另一个原因是因为这是从其他公司购买的模型,我们被告知使用它的方式是在Sheet2中input参数。

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

 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) 

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

已更新答案:

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

=传递参数和获取返回值(A2:B2,Sheet2!$ A $ 2:$ B $ 2,Sheet2!$ C $ 2)

您所需的自定义function( UDF )需要更改其他单元格的值,这是由于Excel环境而无法实现的 。 您正在做的方式(“单元格复制和粘贴”)通过VBA Sub过程运行。 但是你也可能会注意到这不是个好主意,因为单元格复制和粘贴是在屏幕更新的前端执行的,这个过程很慢。 在这篇文章中查找更多细节: 从函数中设置单元格值 。

正如我之前所说,无论表格1涉及多lessvariables/公式,表格2都是多余的。 它分开您的计算并增加您的工作stream程。 第2张input参数显然是从第3张开始的虚拟。您可以将第2张公式移到第1张以获得一致性。

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

我不会build议你使用VBA方法来完成你的任务(编码一个Sub或UDF)。 据我所知,你的任务可以完成正常的工作表function。 我希望你能从下面的工作表图片得到一些提示。

在这里输入图像描述


早些时候回答:

其实,你不需要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)) ) 

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

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

VBA方法

如果你真的想要VBA做到这一点,那么你使用VBA来创build自定义函数(仍然使用上述algorithm)。

 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. 创build一个VBA模块并粘贴上面的代码来创build新的自定义函数。
  2. 现在,您可以在工作表中使用自定义function。

Sytnax:

 =FinalResultReturn( SumProductResultCell , Parameter1 , Parameter2 ) 

例:
在Sheet3单元格C2中input:

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

其中Sheet1!$D$999是SumProductResultCell,即=SUMPRODUCT(B2:B100, C2:C100, D2:D100 )。
(PS:我创build此SumProductResultCell用于最小化自定义函数的input参数。)

我希望我没有误解你的工作表计算工作stream程。 如果是,请让我知道并修改。