我正在尝试改进我继承的复杂查找过程。查找是通过几个 UDF 结合一些标准工作表函数生成的。但是,问题是当用户更新源表中的一些数据时,重新计算的时间是不可接受的。
所以,我看了看,并认为我可以编写一个更好的 Excel 公式解决方案。好吧,我确实找到了解决方案,但是 Excel 无法处理大型数据集,并且当我的 VBA 针对数据集运行公式时,它会崩溃(可以理解!)。
现在,我可以在 VBA 中完全实现这一点,但是用户必须在每次更改后按下按钮或其他东西来更新。我想要的是一种更简单的方法,如果有的话,使用一些高级 Excel 2007 公式。由于我对这些公式不太熟悉,因此我正在寻求帮助!
好的,这是我必须处理的。
源表
如下列中的 Tid、结算日期和月末价格(由 1、2、3 等标识的层期)
Tid SettleDate 1 2 3 4 5 6 7 8 9 10 ... n
公式表
在其他专栏中,我有以下专栏
InitLayer LiqdLayer InstrClass Tid SettleDate InitPrice LiqdPrice Position
我在整个数据集右侧的列中也有层号,如下所示:
1 2 3 4 5 ... n
我需要做的是通过查找源表上的价格,根据数据集中的一些逻辑在这些列中填写适当的价格变化。
在伪公式中,这是我需要为 FormulaSheet 中的每一层列发生的事情
If Layer < InitLayer OR Layer > LiqdLayer Then Return "-"
ElseIf Layer = InitLayer Then (Layered Price - InitPrice) * Position
where Layered Price is obtained by finding the Intersect of the LayerNumber
Column and Tid Row in the SourceSheet
ElseIf Layer = LiqdLayer Then Previous Layered Price * Position
where Previous Layered Price is obtained by finding the Intersect of the Previous
LayerNumber Column and Tid Row in the SourceSheet
Else (LayeredPrice - Previous Layered Price) * 6
where Layered Price and Previous Layered Price are defined as above
End If
我确实提出了这个公式,它在小数据集上效果很好,但是对于大数据集来说它太大了太糟糕了,或者只是太大太糟糕了!
=IF(OR(CH$3<$AT6,CH$3>$AU6),"-",IF($AT6=CH$3,(HLOOKUP(CH$3,layered_prices,RIGHT(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4),LEN(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4))-1)-1,FALSE)-$AV6)*$C6,IF($AU6=CH$3,($AW6-HLOOKUP(CG$3,layered_prices,RIGHT(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4),LEN(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4))-1)-1,FALSE))*$C6,(HLOOKUP(CH$3,layered_prices,RIGHT(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4),LEN(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4))-1)-1,FALSE)-HLOOKUP(CG$3,layered_prices,RIGHT(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4),LEN(ADDRESS(MATCH(IF($AX6="CUR",$T6 & " " & $G6,$T6),IF($AX6="CUR",layered_curtid,layered_tid),1),1,4))-1)-1,FALSE))*$C6)))
公式键
CH = Layer Number
CG = Previous Layer Number
AT = InitLayer
AU = LiqdLayer
AX = InstrClass (used to find a separate lookup for Currencies)
T = Tid
G = SettleDate (used to find a separate lookup for Currencies)
AV = InitPrice
AW = LiqPrice
C = Position
layered_prices = named range for the range of prices under the layer columns in SourceSheet
layered_tid = named range for tid rows in SourceSheet
layered_curtid = named range for currency tid rows in Source Sheet (just a separte lookup if InstrType = Currency, formula the same
是否有任何其他公式或公式组合可以让我以比我创造的怪物更有效的方式获得我正在寻找的东西?