引数を付ける事もできますが、普通はApplication.Volatileとだけ書いていると思います。文法的にはこの3パターンが有りえます。Function引数が使える事を活用するため、外部から揮発性化を制御するための引数を付けるというのは面白い試みかもしれません。Function他にも、特定の条件を満たすまで(例えばエラー値の間)は揮発性にするとかも考えられます。上記のように、ユーザー定義関数を揮発性にするだけなら簡単です。関数流入直後にApplication.Volatileと書けば良いのですから。問題はどんな時に揮発性関数にするべきか。ないでしょうか?少ないですが、私が過去に作成した揮発性関数を紹介しておきます。警告:地味に需要のある関数ですが、これは失敗談です。利用にはご注意ください。必要なセル範囲を引数に収めているので、問題ないように見えます。背景色の変更は再計算が起こるキッカケにはならないので、どんなに待っても「再計算」はされません。再計算を起こるキッカケは、値の変更であることに注意が必要です。揮発性関数にしておけば何かある毎に再計算をしてくれるので、不完全とはいえある程度はリアルタイムに再計算させることが可能になります。この方法を使うならば「再計算」ボタン(F9キーに相当)を設置すると良いでしょう。Sub尚、揮発性関数にしておかないと、ActiveSheet.Calculateを実行しても再計算されない。これまた注意が必要です。Calculateメソッドは、Excelが再計算が必要だと認識しつつも、手動計算モードで計算が保留にされていたものにしか適用されないのです。何らかの別のVBAからRange("C16:CC18").Dirtyを実行しておくという手もあります。F9に相当)を実行すれば、揮発性関数にしなくてもOKです。Subこっちのほうが幾分かマシですね。こと、選択セルを変更しただけで再計算させたほうが便利かも知れません。Sub背景色によるCOUNTIF関数の撤回さて、私も昔はここまでのようなギミックを使った経験がありますが、いま開発するとしたら別のアプローチを取ります。セルには該当する作業番号を入力し、着色は条件付き書式により自動で行います。(文字色を背景色に合わせて見えなくすることもあります)集計は組み込みのワークシート関数のCOUNTIF関数を使用し、リアルタイムで計算されます。これに加えてCtrl+Enterで一括入力すれば操作性は損なわれない。Deleteキーで着色を消すことができる。コピーされて罫線等の書式が破壊される心配が少ない。(※要教育)というメリットもあります。教育が足りていないと、結局コピー&ペーストが使用されて罫線とともに条件付き書式が破壊される恐れがあるので、注意が必要かもしれません。それもあって、例え文句を言われようと、作業番号の文字はわざと見える仕様に留めています。Excelの標準機能で出来るのであれば、このようなユーザー定義関数を作る必要ありませんでしたね。標準のINDIRECT関数を使うには、列番号を文字列にしなければならないという制約があります。それを回避するためにこのような関数を作ったことがありました。Function警告:これは失敗談です。よい子のみんなは真似しないで下さい。?=INDIRECTidx(F1,F2)が、この関数は無価値です。行列番号によるINDIRECT関数の撤回なぜならば、OFFSET関数で要件を満たすことが出来るからです。=OFFSET(A1,F1-1,F2-1)どう見てもOFFSET関数の方が汎用性が高いですね。引数にシートを特定するための情報が無いため、別のシートがアクティブの時に誤った計算結果が出ます。別シートにこの結果を参照している式があったら、一生正しい計算結果が表示されないという、とても面白いことが起きます。これはシートに限らずブックについても言えることです。従って、このような事がしたい場合は、必ず引数にセル参照を1つは設定しましょう。セル参照さえあれば、Range.Worksheet.で明示的にシートを指定できるようになります。訂正Application.CallerやApplication.ThisCellにより、呼び出し元のセルを特定することが可能であることを教えて頂きました。ありがとうございます。以下のように記載することで、別シートがアクティブな時にも対応できます。Application.Callerこれは、プロシージャを呼び出したボタンオブジェクト等を知るためにもよく使われるプロパティですね。そのセルを示すRangeオブジェクトを指定します。セルの範囲を指定するrangeオブジェクトを指定します。ドキュメントの名前をテキストとして指定します。Application.ThisCellこちらは、呼び出し元のセルを取得できるピンポイントなプロパティのようです。Functionというわけで、せっかく作った関数はOFFSET関数で十分だったのでした。作る必要なかったですね?(何故紹介した!?)まとめ今回は「揮発性関数」と「ユーザー定義関数の揮発性化」について説明しました。揮発性関数はどこのセルが変更された時でも再計算を行う関数です。限られた場面でしか必要無いものだということがお分かり頂けたかと思います。他にも揮発性には「ブックが常に変更済み状態になる」ので変更してないのに保存確認メッセージが表示される一つの数式が連続して5回くらいコールされるブック全体が常に重くなるという厄介な性質もあります。今回記事を書くにあたって、なんとか揮発性のユーザー定義関数の良い使い道を紹介したかったのですが、私の経験の中で最後まで使えた物が思い当たりませんでした。当時は使えると思った技術でも、Excelの基礎知識が増えていくにつれて「もっと良いやり方がある」と気がついて廃止されてしまったのです。私のように揮発性関数にしたいと思って来訪された方は実装方法を変えることで標準機能だけで実現できないかを一度検討すると良いと思います。本シリーズを読んだ上でユーザー定義関数(の揮発性関数)の有効な使い道を思いついた方は、ぜひ公開してもらえると嬉しいです。次回は「ユーザー定義関数自体が不安定なので使い方に気をつけたほうが良いよ」という話をして、このシリーズは完結にしたいと思います。Part3游ゴシック大嫌いな同志諸君!お久しぶりです。part1今回はExcelで高度な数式を組むのに必要な技術を紹介します。E...www.excel-chunchun.com週1回の更新を目指して活動中です。ヶ月)私がExcelを使っていて気になったことを記事に書いていきます。VBAを使い初めて、もう10年ほど経ちましたが、楽しくて楽しくて毎日自宅でもVBA書いてます。自作PCとかサーバー立てたりするのも好きなのでPCとかサーバーのことも書くかもしれません。記事の元ネタは主にTwitterの方で呟いてますので、最速で情報を仕入れたい方は是非フォローしてください。part12019-11-12SpecialFoldersの引数にString型変数を指定すると意図した通りに動かない2019-11-03ワークシート用ユーザー定義関数は使い方を誤ると危険である2019-10-28VBAのコメントの書き方の試行錯誤2019-10-27VBAでの広域コメントアウトの代替案2019-10-26VBAで戻り値のある複数シートをコピーする関数を作ってみた2019-10-22Outlookでメール受信者がローカルパスをクリックできるようにUNCパス化するマクロを作ってみた2019-10-21Outlookでメール受信者がローカルパスをクリックできるようにするマクロを作ってみた2019-10-20VBAでWin32APIの64bit対応自動変換プログラムを作ってみた2019-10-06ワークシート用ユーザー定義関数を揮発性にする方法2019-10-04VBAによる安定したワークシート用ユーザー定義関数の作り方2019-10-02VBA関数のライブラリ名やモジュール名の省略を検知するアイディア2019-09-29EnumWindowsを使って別プロセスのExcelを取得してみた2019-09-24エクセルマクロで野生のマグロを駆逐するミニゲームを作ってみた2019-09-19VBAでIIF関数が全ての項を評価してしまうのは当然である2019-09-16VBAの裏技?コロンで好きな位置にブレークポイントを設置する2019-09-15VBAのStopとDebug.Assertステートメントの違い2019-09-13VBAのInStr関数の不思議な挙動について調べてみた2019-09-08VBAで文字列中の文字をカウントする関数を作ってみた2019-08-31VBAで環境に依存しないWindowsMediaPlayerの使い方もっと見る最新記事(ハードウェア)2019-10-31Realforceを買ってみた。TS-932X-2Gを購入しました。広告プライバシーポリシースターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。