5

マクロを定義せずに Excel でユーザー定義の宣言関数を作成する簡単な方法がないことは、少し省略されているように思えます。エンタープライズでの厳しい戦いで XSLM を使用することはできませんが、意図を持って関数を定義できるようにしたいと考えています。

私はこれをしたいです。

=BreakEven(C1:C20)

ただし、「名前付き式」は使用できますが、マクロは使用できません。問題は、それにパラメータを渡す方法ですか? 私はいくつかのトリック (巧妙な回避策) を見てきましたが、xslx では見られませんでした。

別のタブで Breakeven() 関数を定義し、ここでそれを参照して、1 つ以上のパラメーター、実際には 2 つの範囲を渡すことができるようにしたいと考えています。文字列解析を使用する方法があると確信していますが、わかりません。

関数がセル内で評価され、「意図」を解析できる限り、関数がそのように見えなくてもかまいません。たとえば、xlsx では動作しなかったこの例 ( http://www.jkp-ads.com/articles/ExcelNames09.asp ) では、この構文を使用しています。

=IF(ROW(D3),CellColor)

「cellcolor」は関数の名前で、D3 は範囲パラメータです。私がいじっている他の解決策は、可変引数リストを使用して列形式で関数を定義することです (これは Excel スプレッドシートの 2 行です)。

[Value][function][parameter1][parameter2][parameter3]
 24050  BreakEven C1:C20      A1:A20

きれいではありませんが、後者の利点は、関数を外部の読者に説明できることです。これが損益分岐点関数であることはわかっていますが、実際の式「OFFSET,INDIRECT,SUM()()()()etc」を入れると、読み取り/解析できなくなります。もちろん、その場合、Excel で右側のセルを解析して値フィールドを作成する必要があります。これにより、値の数式が乱雑になりますが、少なくとも自己記述的な行になります。

誰でもより良い方法を提案できますか?

4

3 に答える 3

2

貧乏人のUDF

ですから、私たちがしなければならないのはこれだと思います。

      A      B         C           D           E
1    [Value][function][parameter1][parameter2][parameter3]
2     24050  BreakEven     C1:C20      A1:A20
3       111      mySum          1          10         100

ここで、「BreakEven」は「名前付き関数」です。これが「mySum」の式です。

=sum(C1:E1)

Bにリストされている関数を評価するには、これを列Aに配置します(列Aのすべての行に同じ値を転置します。

=value(B)

これが機能するのは、A2とA3の両方が列Bを値として評価し、A2とA3のコンテキストでBreakEvenとSumが(貧乏人のUDFとして)実行されるためです。もちろん、範囲(C1:E1)は相対的です。

したがって、実際には、列Bに任意の関数名を書き込むことができます(ワークブックに対応する名前付き関数が定義されていて、必要に応じて複雑にすることができます)。列C、D、およびEは、同じ行の関数のパラメーターとして機能します。

代わりに、列Aに次のように記述できればよかったと思います。

=mySum(1,10,100)

しかし、そのサポートがない場合、上記のメカニズムは、ユーザーが理解できる読み取り可能なパラメーター化された関数を提供するのに役立ちます。これは、機械可読でもあり(CSVでも機能します)、再利用可能な関数をライブラリシートにオフロードできます。メンテナンスのためのワークブックのどこかに。

完璧ではありませんが、単一のセルでこれを行う賢い方法がない限り、許容できる妥協点はありますか?

于 2012-10-09T16:45:11.003 に答える
0

実際には答えではありませんが、コメントよりもここで説明する方が簡単です。数式の名前を単純な方法で変更することはできませんが、実際には、これまで考えたことのない提案が気に入っています。しかし、私は非マクロ環境で作業したことがないので、これは発生していません。実際の数式に、それが何をするのかを説明するメモを追加できます。例えば:

=N("This is a really complex BreakEven Formula")+SUM(3,4,5)

完全に有効な式です。私が言ったように、実際には答えではありませんが、複雑な式に明確さを追加する可能性があります

于 2012-10-09T15:56:25.583 に答える
0

これはちょっとしたコツでできます

たとえば、=cuberoot(x) をエミュレートするキューブルート UDF を効果的に作成するには、次のような「値」を持つキューブルートとして変数に名前を付けます。

=(RC[-1])^(1/3)

ここで、一時的に RC モードに切り替えてこれを行うか、カーソルをセル E5 に置き、名前の値を =(D5)^(1/3) のように入力します。

これで、cuberoot が必要なときはいつでも、任意のセルに引数を入れて、その右側のセルに =cuberoot を入れることができます。それは実際に機能し、真の Excel ルールに従います。

従属変数として単一の「引数」Time を持つマルチパラメーター モデルに使用します。次に、Model という用語をモデル方程式として定義します。例: =a+b Time+c Time^2

ここで、a、b、c は、一意のパラメーター値を保持する場所に既に名前が付けられています -

次に、時間を =RC[-1] として定義します

私のシートは単に =Model と言っているセルで満たされ、左側に必要な時間値 (つまり、その引数) があります。複数のセルを使用して複数引数関数に拡張するのは簡単です。通常、スプレッドシートのレイアウトにうまく適合します。名前の定義ボックスでモデルの定義を一度変更すると、すべての場所が同時に変更されます。

前のセルの 10 進数の値を取り、それを deg Min と Sec の文字列に変換する ToDMS という関数があります。度を単一のセルに入れる必要がありますが、alt に入れる必要があります。別のセルでフォーム

エレガントでシンプル、そして機能します

ボブ・ジョーダン

于 2015-08-20T09:54:22.613 に答える