2016-10-17 7 views
0

私はインターネットでvbaブログの1つで見つけた一般的なカスタム関数を使用します。テキストセルを数式(= "A2 + B2"または "= ABS(A2 + B2)"のように読み込み、CONCATENATE関数を使用して作成しました。コードが行く:私のワークブックでCustonの機能は、ブック全体ではなくワークブック全体に適用されます

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

を私は正確ないくつかの記述統計を計算データ、の2列(すなわち合計、平均、標準偏差など)を除いて同じコピーである複数のシートを持っている、式がです私のソースシート、コピーされたシートはEval(sourceSheet!A1)のような公式を持ち、A1は上記のような式のテキストを含んでいます。問題は、読み込んだ後にマクロを適用するために、F9をリフレッシュする(時には数回)必要があることです。ワークシートにあるデータを使ってコピーしたワークシートをすべてリフレッシュしています。たとえば、ワークシート3でリフレッシュしたデータの合計が5だった場合、他のすべてのシートで合計が5に変更されます。私は何とか私のコードは、他のすべてのExcel機能のような単一のワークシートではなく、ブック全体に機能を適用させると思います。

だから私は2つの質問がある:

は私のカスタム関数が唯一の私はそれを置くワークシートに適用されますので、コードを変更する方法はありますか?

マウスの左ボタンをクリックするごとにブック全体をリフレッシュするためのマクロコードを投稿できますか?

ではなく、UDFをバギーザッツ事前

+0

いいえ、あなたのコードが変更されていない何も参照してください。ワークブックのすべての数式を再計算するのはF9です。アクティブシートのみを再計算するには、Shift + F9を試してください。だからQ1:いいえ、あなたのコードを変更する必要はありません、それは他のシートに "適用"しません。 Q2:実際には、私たちはStackOverflowで自由なコーディングをしません。私たちは他のプログラマーに問題を助けますが、私たちは自由な仕事をしません。 – vacip

答えて

2

にありがとう:評価は常にアクティブシートを参照するものとして未修飾の参照を取ります。 本当にWorksheet.Evaluateを使用する必要があります。文献のいずれかの未修飾の参照は、refは

Function Eval(Ref As range) 
Application.Volatile 
Eval = ref.parent.Evaluate(Ref.value) 
End Function 

それとも、それはUDFはこれを試して

Function Eval(Ref As variant) 
Application.Volatile 
Eval = Application.Caller.Parent.Evaluate(Ref) 
End Function 
から呼び出されているシートを参照したい場合は上にあるシートにしていることを前提とし、このような何かを試してみてください

はまた、あなたが知っておくべきことを評価して奇妙なこと/癖/バグの数があります。私のブログの記事 https://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast/

+0

したがって、範囲に含まれる文字列ではなく、 'Range'を渡すことができますか? –

+0

これはやや繰り返される質問です。あなたの答えをSO 'ドキュメント'に挿入することはできないでしょうか? – user3598756

関連する問題