4

(別のタイトル: なぜ Excel は、VB とそれに伴う問題に頼らずに、パラメーターを含むユーザー定義の数式をサポートしないのですか?)

[私の質問を明確にするために更新]

Excel では、テーブルを定義すると、列の数式が自動的に複製される傾向があります。これは「埋める」によく似ています。

しかし... ルールの例外が必要な場合はどうすればよいでしょうか?

私がいくつかの計算を行うために作成しているテーブルでは、最初の行は何らかの形で「特別」になる傾向があります。だから、私はオートフィルを下げたいのですが、最初の行ではなく、カスタムとしてマークされたセルではありません。Excel ドキュメントでは、計算された列の例外について言及していますが、それらを見つけて排除することに関してのみ言及しています。

たとえば、最初の行は初期値を計算しています。残りのすべての行は、増分変化を計算します。簡単な例 - 1 列と 4 行のテーブル:

    A
1 Number
2 =42
3 =A2+1
4 =A3+1

最初の数式は残りの数式とは異なる必要があります。これにより、A2=42、A3=43、A4=44 の単純な番号付きリストが作成されます。しかし、ここで、1 ではなく 2 ずつ増加するように変更したいとします。A3 を「A2+2」に編集すると、Excel はテーブルを次のように変更します。

    A
1 Number
2 =A1+2
3 =A2+2
4 =A3+2

もちろん、これは無効です。A2 は引き続き特殊なケースである必要があります。

これ (例外 - 特にテーブルの最初の行) は非常に一般的な要件ではないでしょうか?

4

3 に答える 3

4

データをテーブルとしてフォーマットした場合、A1 フォーマット (A1、$C2 など) の代わりにテーブル式 ([@ABC] など) を使用できます。ただし、説明する 2 つのトリックがあります。

まず、前の行の表数式構文はありません。代わりに、Excel はデフォルトで A1 形式に戻りますが、以下に示すように、オフセット数式を使用して現在のセルを前の行に移動できます。ただし、この場合、「ABC」に +1 できないため、# 値エラーが返されます。

     ABC
1   =OFFSET([@ABC],-1,0)+1
2   =OFFSET([@ABC],-1,0)+1
3   =OFFSET([@ABC],-1,0)+1
4   ....

したがって、2 番目のトリックは、if ステートメントを使用して値を初期化し、前の行の値 = 見出しの値かどうかを確認することです。同じ場合は初期値を使用し、それ以外の場合は増分を追加します。テーブルの名前が Table1 であると仮定することに注意してください

     ABC
1   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
2   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
3   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],42,OFFSET([@ABC],-1,0)+1)
4   ....

以下のように、初期値をテーブル外のセルに設定して、初期値 ($A$1 など) とインクリメント ($A$2 など) を定義できることに注意してください。

     ABC
1   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
2   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
3   =IF(OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]],$A$1,OFFSET([@ABC],-1,0)+$A$2)
4   ....

私はこの IF OFFSET の組み合わせを、テーブルの反復とループに常に使用しています。

最初の行であるかどうかを判断する必要がある列がたくさんある場合は、最初の行であるかどうかを 1 つの列でテストし、残りの列をより単純な if で機能させることができます。たとえば、ABC は最初の行に true を返し、他の行には false を返し、DEF は初期値をインクリメントします

     ABC                                            DEF
1   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
2   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
3   =OFFSET([@ABC],-1,0)=Table1[[#Headers],[ABC]]   =IF([@ABC],$A$1,OFFSET([@DEF],-1,0)+$A$2)
4   ....

それが役立つことを願っています

于 2014-03-14T00:48:22.520 に答える