用户定义函数计算生产增长与variables开始date和增长configuration文件

用excel用户定义的函数挣扎,计算不同细菌贴片产生的总生产量,这些细菌贴片从不同的时间开始,但遵循相同的增长模式; 我试图简化我的问题如下:

示例表

个人资料表:我有一个2列×6行的表格(A2:B9),显示每周的细菌产量取决于菌落的年龄(A栏给出期间,B栏的产量:在前3周细菌产生1 /周,接下来的3周内每周产生2次等); 我把这张表称为我的生产PROFILE,这可能会因我拥有的细菌types(和其他环境参数)而异。 我已经在这个特定的例子中做了决定,为了让每个时期的人口增长都很简单,增长值当然可以通过一个函数(线性的,指数的,衰减因子等等)来生成,我猜如果我可以解决这个问题,增加一个复杂的增长function不应该是一个问题。

结果表格:然后我有一个3列20行的表(A14:C33),显示了超过20周的时间(我的20行,编号1到20列A),当我开始一些细菌培养(第3周,2在第6周等),我称之为我的RESULT表

我想在结果栏C中显示每周殖民地的总产量。
我试着创build一个PROD(周,PROFILE)函数,我把“week”和“PROFILE”定义为变体,其中“PROFILE”实际上与我的PROFILE表相关。 当“星期”是一个单独的单元格(即PROD(A18,PROFILE)= 2)但它不适用于范围时(PROD(A14:A33,PROFILE)返回错误消息)

Function PROD(period As Variant, profile As Variant) As Variant r = profile.Rows.Count If profile(1, 1) >= period Then PROD = profile(1, 2) Else For i = 2 To r If profile(i, 1) >= period Then If profile(i - 1, 1) < period Then PROD = profile(i, 2) End If End If Next i End If PROD = Application.Round(PROD, 2) End Function 

有没有一个优雅的解决scheme来填充RESULT列C?

我在前面的作业(金融)上做了类似的事情,将一个产品与excel pmt函数(-pmt(rate,nper,pv,..)(其中pv是一个范围)相结合,这确实奏效,我设法得到了一个很好的计算我在某一特定时期的总折旧成本,当时我可以在前一时期以不同的数量购买不同数量的商品。 我所使用的公式是在附表的例子中显示的

 SUMPRODUCT(-PMT($C$7,$C6,$C$3:$V$3),N($C$4:$V$4<=C$2),N(($C$4:$V$4+$C6)>C$2)) 

我试图在这里复制它与自定义function与我的细菌人口,但我真的卡住了。

我无法想象你的个人资料表可能会是什么样子,事实上,你想要提取什么。 也许我下面的尝试给你一些想法。 请研究一下,让我知道它需要改进的地方。

 Function PROD(period As Variant, profile As Variant) As Variant Dim Fun As Variant Dim R As Long R = 1 ' should this always be 1? Do Fun = Fun + profile(R, 2).Value R = R + 1 If R > profile.Rows.Count Then Exit Do Loop While profile(R, 1) >= period PROD = Application.Round(Fun, 2) End Function 

但是,我不会把它用作UDF。 相反,我会稍微修改它,直接写入C列。 让该函数从Worksheet_Change事件中调用,链接到configuration文件表,或者两个表,以便数据在更改时自动更新。 只有在重新计算表格时,UDF更新才会发生,而且我发现不容易控制。

如果这不是你想要的,那么它应该比我今天上午做得更接近它。 看一看。

 Function PROD(Period As Range) As Single Dim Fun As Single Dim Periods As Integer Dim Weeks As Integer Dim A As Integer Dim R As Long Periods = Period.Cells.Count For A = 1 To Periods Weeks = CInt(Period.Cells(A).Value) With Range("Profile") For R = 1 To (.Rows.Count - 1) If .Cells(R, 1).Value >= Weeks Then Exit For Next R Fun = Fun + .Cells(R, 2).Value End With Next A PROD = Application.Round(Fun / Periods, 2) End Function 

使用= Prod(A14:A20)或= Prod(A14:A14)或= Prod(A14)调用此函数。将从每个指定星期的Profile表中提取一个结果。 A14:A20有7个结果,A16:A22也有。 该函数绘制一个平均值。 因此,有7个结果,这7个被加起来除以7。也许这还不是你想要的,但是你可能能够操纵函数的结果来满足你的要求。