1

マクロを使用せずに Excel の式に書き込もうとしている複雑なシナリオがあります。

シナリオでは、範囲 A と呼ばれる日付範囲が提示されます。つまり、2011 年 10 月 1 日から 2011 年 5 月 4 日です。

3 列のルックアップ テーブルがあります。開始日、終了日、レート。このテーブルには約 50 行が含まれており、各行は一意の 3 か月の期間 (毎年の四半期) と対応する率を表しています。

範囲 A を取得し、各四半期に何日あるかを調べ、それらの日数に 4 分の 1 の割合を掛けられるようにする必要があります。

例 10/1/2011 - 5/4/2011 では、81*2011_Q1_rate + 5*2011_Q2_rate になるはずです。

これは、いくつかの for ループと VLOOKUP を使えば簡単ですが、マクロは避ける必要があります。他に提案はありますか?

ありがとう、

スコット。

4

1 に答える 1

1

最終的な方程式がかなり長くなるので、これをいくつかの部分に分解します。

私たちは2つのことをしなければなりません。最初にあなたの日付範囲を引き離します。私の範囲はテスト用のセルF16にあります。これは、to配列を使用=MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1)して=MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1)実行されます。これらの2つの一致ステートメントは、範囲が該当する第1四半期と第4四半期の行を示します。これらの行番号を使用して、などを使用して参照を作成します。前の式は私のテストケースで吐き出されます。A1C12From DateRateaddress()=ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2)$B$1:$B$9

2番目の部分は合計を見つけることです。を利用しsumproduct()ます。簡単なsumproduct()式は次のとおり=SUMPRODUCT((B1:B7-A1:A7+1),C1:C7)です。範囲は、テストのために静的になっています。四半期の終わりから配列形式で始まる四半期を引いたものを取り、それぞれに1を追加します。これは、1/31/13 - 1/1/13 = 30 days31日にしたい場合に発生します。次に、この配列に各月のレートを掛けます。

これで、すべてをつなぎ合わせるときに、最初の範囲を取得し、を使用indirect()して、ダイナミックレンジを単純なsumproduct()式に代入し、で終了し=SUMPRODUCT((INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),1))+1),INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))ます。

現在、その式は部分的な月を考慮していません。とで部分的な月(前の方程式から盗む)を差し引いて、=((DATEVALUE(LEFT(F16,FIND(" - ",F16)))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)))*INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)))完了=((INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))))*INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))です。

最終的な方程式: =SUMPRODUCT((INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),2)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),1))+1),INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)&":"&ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))-((DATEVALUE(LEFT(F16,FIND(" - ",F16)))-INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),1)))*INDIRECT(ADDRESS(MATCH(DATEVALUE(LEFT(F16,FIND(" - ",F16))),A1:A12,1),3)))-((INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),2))-DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))))*INDIRECT(ADDRESS(MATCH(DATEVALUE(RIGHT(F16,LEN(F16)-2-FIND(" - ",F16))),A1:A12,1),3)))

データ範囲を2つの別々のセルに分割すると、方程式がはるかに小さくなり、エラーの余地が少なくなるため、正しく機能する可能性が高くなります。

于 2013-01-31T00:52:18.987 に答える