VBAを使用しないカスタムユーザー関数


10

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

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

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


いい質問ですが、答えが見つかるとは思いません。VBAで必要な機能を構築するための支援を求めるのがより良いコースだと思います。
EliadTech 2014

回答:


11

はい、Excelの名前付き数式を使用している場合は可能です。

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

したがって、A11でdiff(任意の名前を使用できます)という名前を= Sum(A $ 5:A10)-Sum(B $ 5:B10)として定義します。データは5行目から前の行までと想定しています。A11だけでなく、どのセルでもかまいませんが、定義は同じように変化します。

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

数式を移動する場合、ほとんどの参照は相対的です。そのため、行5から合計行の前の行まで、常に現在の列と次の列の差が計算されます。

したがって、C5D100の間にデータがある場合、C101に= Diffだけを入力すると、Sum(C5:C100)-Sum(D5:D100)が計算されます。

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

詳細については、名前付き数式をご覧ください。


2

VBAはないと言っていましたが、次のようにすると、実際に数式を書き直したり、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))

Excelの名前付き数式よりもこの方法を使用する利点は何ですか?
DakotaD 2017

これは実際には関数を定義しますが、「名前付き式」は結果への参照を定義するだけです。たとえば、セルが空白か空白だけかをチェックする関数を作成する場合は、のように呼び出します=IF(BlankOrWhitespace(A5),true,false)。セルの数式の内容を参照していて、新しい関数を定義していないため不可能である名前付き数式の場合
mtalexan

1
VBAの使用から生じる別の問題があります。セキュリティ。VBAが悪用される可能性があるため、ワークブックは安全ではないと考えられます。ワークブックはウイルスに感染していると誤解されます。
Akangka 2018年

@Akangkathe私がVBAを避ける理由。それはとても悲しいことです。
Pedro77

0

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

要するに、長さ0の文字列出力を持つExcelの組み込み数式の1つをハイジャックし、名前付き範囲文字列操作を介して挿入されたデータを解釈するメソッドを考え出すことで、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!!!

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

注:サンプルファイルでの動作を少し簡単に確認したい場合は、[数式]リボンの[数式の評価]を使用して、例を挿入したセルの1つで数式をステップイン/ステップアウトします。基になる名前付き範囲をすべて非表示にして、すべてをクリーンアップしたので、すべて非表示にしない限り、名前マネージャーに表示されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.