我的工作簿看起来像这样:
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)
我可以自动填充内循环因此更快?或任何其他更好的方式来完成我的任务将是受欢迎的。
答案 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)。据我所知,您的任务可以通过普通的工作表函数单独完成。我希望你能从下面的工作表图片中得到一些提示。
实际上,您不需要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创建自定义功能(仍使用上述算法)。
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
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,用于最小化自定义函数的输入参数。)
我希望我没有误解你的工作表计算工作流程。如果是,请告诉我并进行修改。