web-dev-qa-db-ja.com

VBAを使用しないカスタムユーザー機能

VBAを使用せずにExcelでカスタムユーザー関数を作成することは可能ですか?
私の問題は、1つの非常に長い関数を作成するために標準のExcel関数の長い文字列をつなぎ合わせていることです。この関数は、私のワークブックの25の異なるワークシートで使用されています。変更が必要な場合は、1か所で変更し、変更をすべてのシートに自動的に反映させたいと思います。

たとえば、単純で些細なケースは、SUM()の結果に1を追加することです。 SUM(mySeries)+1とし、それを新しい関数MYSUM()と呼びます。

発生する可能性のある潜在的なエラーと追加された複雑さのために、長い式をVBAに変換することを躊躇しています。

10
DakotaD

はい、Excel Named Formulasを使用すれば可能です。

たとえば、の異なる場所にある2つの連続する列の合計の差(A5:Ax-B5:Bx)を計算する必要があるとします。ワークブック(xは各列の最後の行です):

したがって、A11diffという名前を定義します(任意の名前を指定できます)使用)as= Sum(A $ 5:A10)-Sum(B $ 5:B10)、データが行で始まると仮定5前の行まで。 A11だけでなく、任意のセルにすることができますが、定義も同じように変更されます。

残念ながら、Excel 2010は絶対プレフィックス($)とワークシートプレフィックスを挿入するため、消去する必要がありますプレフィックスですが、感嘆符を保持し、ほとんどの$文字を消去します。

数式を移動すると、ほとんどの参照は相対的です。したがって、行5から始まり、合計行の前の行まで、現在の列と次の列の差を常に計算します。

したがって、C5D100の間にデータがある場合は、= DiffinC101そしてそれはを計算しますSum(C5:C100)-Sum(D5:D100)

明らかに、質問で述べたように、名前付き数式でローカル名またはグローバル名を使用できます。

詳細については、 名前付き数式 を参照してください。

11
Paulo Buchsbaum

VBAがないと言ったのは知っていますが、次のようにすると[〜#〜] not [〜#〜]実際に数式を書き直したり、VBAについてよく知ったり、VBAで数式を維持したりする必要があります。 。あなたはそれを一度書いて、それを忘れることができます。

セルから数式を文字列として抽出するユーザー定義関数を作成します。

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

数式のような文字列を評価するために別のものを作成します。

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Sheet1!a1にマスター数式がある場合は、それを使用する必要があるすべてのセルにこれを配置します。

=eval(getformula(sheet1!a1))
2
Madball73

このスレッドは少し古いですが、何か他のものを探して見つけたので、この正確なことを達成しようとしてしばらく前に作成したワークブックを共有したいと思いました: https://www.dropbox.com/ s/gf5qrjj5q81tpke/Title_Case_Named_Range_Function.xlsx?dl = 1

つまり、Excelの組み込み数式の1つを長さ0の文字列出力でハイジャックし、名前付き範囲の文字列操作を介して挿入されたデータを解釈するメソッドを考え出すことで、VBA(一種)なしでUDFを作成できますが、そうするのは非効率的です。あなたは警告されました! :)

方法:

  1. この例では、= REPT([セル参照または引用符で囲まれたテキスト]、0)= TEXT([セル参照または引用符の間のテキスト]、 ";;;")何らかの形式のユーザー入力をビルドに含めることができるようにするための開始点として-目に見えるテキストを生成しない式では、セル自体になります。

  2. 次に、UDF名と同等の名前付き範囲を作成しました(TCaseがシートの主要な例ですが、他にもいくつかありますそこのバリエーション)。この名前付き範囲は、実際にはワークブック内の他の非表示の名前のホスト全体を参照して、使用されているセルからFormulaTextを抽出し、それにロジックを適用して最終的な名前を生成します文字列として出力します。このメソッドはテキストの結果のみを返し、数値は返さないことに注意してください(ただし、数値をテキストとして返し、別のセルに変換することもできます)。

  3. = TCaseは、解釈するためのセル/文字列参照がないため、それ自体でエラーを生成します(サンプルシートでは、エラーメッセージは従う必要のある形式を思い出させるだけです)。ただし、TCaseを予想される長さ0の文字列Excel数式と組み合わせると、数式からの入力を文字列として読み取り、ロジックを適用できます。結局、式/出力は次のようになります。以下の数式にテキスト文字列を直接挿入したことに注意してください。ただし、サンプルシートでは、単一のセル参照も解釈できることがわかります。

    式:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    出力:

    I Want to Convert This Mixed String Into a Title Case String!!!
    

結局、私はnotは、病的な好奇心以外の目的でこの方法に従って、Excelをプッシュできる制限を確認することをお勧めしません。 VBAははるかにシンプルでエレガントなUDFソリューションですが、少なくとも私は挑戦するのを楽しんでいました。

注:サンプルファイルでどのように機能するかを少し簡単に確認したい場合は、式の評価を使用してください。数式のリボンと、例を挿入したセルの1つで数式にステップイン/ステップアウトします。完了後にすべてをクリーンアップするために、基になる名前付き範囲をすべて非表示にしたので、すべてを再表示しない限り、それらはNames Managerに表示されません。

0
Kirk