SSブログ

INDIRECT関数との決別 [システムトレード]

KFシステムクリエイターVer5の完成を目指して、従来システムで用いてきたINDIRECT関数をOFFSET関数に置き換える作業を行なっています。
INDIRECT関数は直感的に分かりやすいという利点があるのですが、列の移動を伴う大掛かりな改定を行なう際には、参照列がずれてしまう場合があります。

数列程度の移動であれば、手作業で直せなくもないのですが、多くの列を移動させるということになると、とても手作業では追いつきません。
しかも修正漏れがあった場合は、システム全体に重大な不具合を来たすことになります。

OFFSET関数であれば、列を移動してもそれに伴って参照列も変更されるため、後で手直しをする必要がなくなり、不具合が発生する可能性も小さくできます。
ただし、数式的にはやや冗長になってしまう場合があるため、処理速度的にはやや不利になるかもしれません。

ただ、現在INDIRECT関数を用いているセルの大半は、性能指標を集計するためのものであり、時系列処理にはほとんど用いていないため、全体に占める割合はさほど多くありません。
そのため、INDIRECT関数をOFFSET関数に置き換えたとしても、トータルの処理時間にはほとんど影響ないものと考えます。

INDIRECT関数をOFFSET関数に置き換えるに当り、技術的な困難はほとんどありません。ただ、INDIRECT関数が列あるいは行を直接的に指定していたのに対し、OFFSET関数では相対的に指定するため、基準セルからの移動量を見誤ると、思わぬ不具合を生じさせてしまいます。

そのような場合、分かりやすいようにA1セルを基準にして参照セルを指定してやれば良いかもしれません。
例えば、C100セルを参照する場合は、「=OFFSET(A1,99,2)」となります。

Cは3番目の列であることを考えると、A1セルから行方向に(100-1)、列方向に(3-1)だけ移動するということになります。
ようするに、参照したいセルのアドレスから、それぞれ"1"を引いてやれば良いわけです。

もっとも、何でもかんでもA1セルを基準にするのもどうかと思いますから、例えば上の場合では「=OFFSET(C1,99,0)」あるいは「=OFFSET(A100,0,2)」とした方が、全体的にはスッキリするかもしれません。

こうして全ての計算式からINDIRECT関数を取り除いてしまえば、後は自由に列を移動することができます。
パズルを解くように、移動したい列を切り取って移動先に貼り付けていけば、基本的には列の移動が可能です。

ただし、マクロに記述されたセル番地は自動的に修正されませんので、そちらは手動で手直ししてやる必要があります。
それが結構大変な作業になりますが、まあ頑張ってやるしかありません。

ちなみに、列を移動しても名前付きセルの参照先は自動的に修正されます。そのため、チャート表示が乱れるということは基本的にはありません。
ただし、一部チャートでは参照先を数値テーブルで相対的に指定しているため、その場合はチャート表示が正しく行なわれなくなる可能性があり、対処が必要です。

最後に、可変ポジションシステムβ版(Ver4.99g)の一部に不具合が見つかりましたので、その箇所と修正内容を以下に記します。お急ぎの方は、手動にて手直しをお願いいたします(近日中に修正版をアップロードする予定です)。
なお、不具合箇所は全てシステムシート上のセルになります。

 BA8:=IF($A$11="単利","ID","AK")
 BE8:=IF($A$11="単利","IE","AN")
 BI8:=IF($A$11="単利","IF","AP")

また、不具合という訳ではありませんが、セルの対称性の観点から、BI9セルも次のように修正いたします。

 BI9:=COUNTIF(INDIRECT(BI1):INDIRECT(BI2),"=1")/INDIRECT($BI$8&10)

ちなみに、これはINDIRECT関数を用いていますが、従来システムということで、現在開発中の内容は反映されておりません。ご了承ください。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。