4

継承した複雑な検索手順を改善しようとしています。ルックアップは、いくつかの標準的なワークシート関数と組み合わせたいくつかの UDF によって生成されていました。ただし、ユーザーがソース シートの一部のデータを更新すると、再計算時間が許容できないという問題がありました。

それで、私は見て、より良いExcel数式のみのソリューションを書くことができるかもしれないと考えました. まあ、私は解決策を見つけましたが、Excel が大きなデータ セットを処理するには大きすぎます。また、VBA がデータセットに対して数式を実行するとクラッシュします (当然のことです!)。

これを VBA で完全に実装することはできますが、ユーザーは変更のたびにボタンなどを押して更新する必要があります。私が望むのは、高度な Excel 2007 数式のいくつかを使用した、より単純なアプローチです。私はこれらの式に精通していないので、助けを求めています!

さて、これが私が取り組まなければならないものです。

ソースシート

Tid's、決済日、および月末価格 (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

ソース シートで価格を調べて、データセットのロジックに基づいて、これらの列に適切な価格変更を入力する必要があります。

擬似フォーミュラでは、フォーミュラシートのレイヤー列ごとにこれを行う必要があります

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

私が作成した怪物よりも効率的な方法で、私が探しているものを取得できるようにする他の数式または数式の組み合わせはありますか?

4

1 に答える 1