将单元格作为公式的输入参数传递到其他电子表格中

时间:2014-06-19 04:06:48

标签: excel vba

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

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中,根据从Sheet1计算的参数和索引,有15种不同的情况。所以基本上我不能将它们硬编码在一起,唯一的入口是在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)

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

1 个答案:

答案 0 :(得分:1)

更新答案:

  

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

     
    

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

  

您需要的自定义函数(UDF)需要更改因Excel环境而无法使用的其他单元格的值。您正在进行的操作(“单元格复制和粘贴”)是通过VBA Sub过程运行的。但你可能也注意到这不是一个好主意,因为细胞复制&amp;粘贴是在前端进行的,屏幕更新速度很慢。 在此信息中查找更多详细信息:Set a cell value from a function

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

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

我不建议您使用VBA方法来完成任务(编写Sub或UDF)。据我所知,您的任务可以通过普通的工作表函数单独完成。我希望你能从下面的工作表图片中得到一些提示。

enter image description here


早期答案:

实际上,您不需要VBA和工作表2.您可以通过一个公式获得结果:

基本工作表公式函数方法

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

事实上,您可以在Sheet1!D102&amp; Sheet2!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)) )

逻辑&amp;算法(不是公式/代码):

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. 现在,您可以在工作表中使用自定义功能。
  3. Sytnax:

    =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,用于最小化自定义函数的输入参数。)


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