利用excel用户定义的函数进行挣扎,计算不同细菌斑块在不同时间开始但遵循相同生长模式生成的总产量;我试图在下面简化我的问题:
PROFILE表:我有2列x 6行表(A2:B9)显示每周细菌产量取决于菌落的年龄(A栏给出期间,B栏为生产:在最初3周内,细菌在接下来的3周内产生1周/周,每周产生2次等);我将此表称为生产概况,这可能会因我所拥有的细菌类型(以及其他环境参数)而异。我已经在这个特定的例子中做出了决定,并且为了简单地显示表中每个时期的人口增长,增长值当然可以通过函数生成(线性,指数,衰减因子等)我想如果我可以解决这个问题,用增长函数增加一定程度的复杂性应该不是问题。
结果表:然后我有一个3列20行表(A14:C33),当我开始时,显示超过20周的时间段(我的20行,在A列中编号为1到20)一些细菌培养物(第3周1个,第6周2个等),我称之为我的结果表
我想在RESULT的C栏中显示每周殖民地的总产量 我尝试创建一个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
是否有一个优雅的解决方案来填充RESULT的C列?
我在之前的任务(财务)上做了类似的事情,结合了sumproduct和excel pmt函数(-pmt(rate,nper,pv,..),其中pv是一个范围)这确实有效,我设法如果我可以在之前的时间段内以不同的数量和不同的价格购买物品,那么可以很好地计算给定期间的总折旧成本。我当时使用的公式,显示在附件Example of DepTable&Formula上
SUMPRODUCT(-PMT($C$7,$C6,$C$3:$V$3),N($C$4:$V$4<=C$2),N(($C$4:$V$4+$C6)>C$2))
我试图用我的细菌种群定制功能复制它,但我真的被卡住了。
答案 0 :(得分:0)
我无法想象你的个人资料表可能会是什么样子,事实上,你究竟想要提取什么。也许我下面的尝试会给你一些想法。请研究它,让我知道它需要改进的地方。
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事件中调用,链接到配置文件表或两个表,以便在发生更改时自动更新数据。只有在重新计算工作表时才会进行UDF更新,并且我发现不容易控制。
答案 1 :(得分:0)
如果这不是你想要的那么它应该比我今天早上做的更接近它。看一看。
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.也许这还不是你想要的,但你可能能够操纵函数的结果来满足你的要求。