質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

6回答

904閲覧

EXCELの自作関数の戻り値に数式を出力したい

midoritya_

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/11/06 08:33

編集2018/11/06 09:51

EXCELの自作関数の戻り値に数式を出力したいです。
現状セルの中に数式が結構な量書かれており、動作が重くなっています。
その数式を自作関数に移し、セル毎の容量を少なくすることで軽量化をしたいのです。
ただ、その数式がかなり複雑でマクロに落とし込むのに苦労しています。
Range().Fomula = "=数式"のような形で戻り値に指定できないでしょうか?
やってみたところただの文字列として出力されてしまいます・・・。
お知恵をお借りしたいです。
よろしくお願いいたします。

--追記--
すみません、計算式をではなく、計算結果を戻り値としたい。ですね・・・。
計算式であれば元と変わらないので・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morinatsu

2018/11/06 13:32

「やってみたところただの文字列として出力されてしまいます・・・。」セルの書式設定が「文字列」になっていないか気になります。また、該当セルを一度編集中にしてEnter押せば式が再評価されるかも。
mattuwan

2018/11/07 03:23

やりたいことは、「シート上のセルには値のみにし、数式をなくして、再計算を止めたい。」ですかね?で、その数式はどこかに退避して、復元することがあるのでしょうか?あるいは数式が必要になったら、数式の入力をマクロでやってしまおうという事でしょうか?
midoritya_

2018/11/07 08:28 編集

すみません、本当にやりたいことはセル内のデータ量を少なくし、ファイル自体の容量を抑えることで動作、処理の軽量化を図りたいというものです。 現状セルに数十行程度の数式が書かれており、その処理をマクロなり、自作関数に移してセルのデータ量を削減しようとしております。 再計算を手動にするしないにかかわらず重いという状態なのです・・・。 説明下手ですみません。
guest

回答6

0

無理でしょう。
例えば自作関数がSetFormula()、戻したい数式が=A1+B1だとして、
C1セルにこう書いておくと

=SetFormula()

こう変えたいということですよね。

=A1+B1

自分自身の数式を書き換えることになるので、それは無理だと思います。
ご自身でも書いてますが、この手の処理はマクロ内で.Fomula = "=数式"をするしかないと思います。

投稿2018/11/06 09:25

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

midoritya_

2018/11/06 09:52

すみません、計算式ではなく、計算結果です・・・。失礼いたしました。
guest

0

Evaluateが使えるかもしれません

EXCEL

1=Evaluate([式を文字列で返却するユーザー定義関数])

試してないので、駄目だったらゴメンナサイ。

でも、式を返却するんなら、計算して結果を返すのでいいんじゃないかと・・・

投稿2018/11/06 08:39

編集2018/11/06 08:45
sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

midoritya_

2018/11/06 09:56 編集

Evaluateよかったです!ありがとうございます! ただ、表を指定する時の[@hogehoge]の指定がうまくいかず、Valueエラーとなってしまいました・・・。
guest

0

2018/11/07 17:26 編集

すみません、本当にやりたいことはセル内のデータ量を少なくし、ファイル自体の容量を抑えることで動作、処理の軽量化を図りたいというものです。 現状セルに数十行程度の数式が書かれており、その処理をマクロなり、自作関数に移してセルのデータ量を削減しようとしております。 再計算を手動にするしないにかかわらず重いという状態なのです・・・。 説明下手ですみません。

再計算を手動にしても、ファイルを開くのが重いなら、
数式の問題ではないのでは?
長年使っていて、色々コピペとかしてるなら、
セルの書式設定を一回まとめて設定しなおしてみるとか、
名前の定義の名前が増えすぎているなら削除するとか、
スタイルが増えすぎているなら削除するとか、
いずれにしても、数式が原因じゃないような気がします。

Range().Formula = "数式"で対応しようと思います。

これで何がしたいのか、あるいは何が解決できるのか、僕にはわかりません。

投稿2018/11/07 10:15

mattuwan

総合スコア2167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

midoritya_

2018/11/08 05:15

正しくは Range().Formula = "数式" Range().Value = Range().Value で結果のみを張り付ける形です。 これによってセル内のデータを抑えることができ、軽量化できました。 ありがとうございました。
guest

0

自己解決

みなさま、ご回答いただきまして、ありがとうございました。
Range().Formula = "数式"で対応しようと思います。
本当にありがとうございました。

投稿2018/11/07 08:32

midoritya_

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

マクロではありませんが、計算方法を「手動」にしておくのではダメなのでしょうか?

Excel のパフォーマンスの障害物のパフォーマンスを最適化するためのヒント

上記のサイトによると、ロジックはそのままでワークシート関数とユーザー定義関数それぞれで計算をした場合、ユーザー定義関数の方が遅くなる傾向があるそうです。
数式をマクロの強みが活きる形で落とし込めれば、はるかに高速にもできるようですが。

また、Evaluateを使った場合の話ですが、値の自動計算がされない可能性があります。
値が自動計算されない場合、計算方法を「自動」にしていても表示されている値が正しいのか信用できないことになります。
再計算させるにしても、「再計算実行(F9)」は効果が無いため、ちょっと面倒な操作をする必要があります。

ここまでの話を踏まえて、計算方法を「手動」にした方が良いのではないか?という意見です。

投稿2018/11/06 12:53

編集2018/11/06 15:30
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/11/06 14:57

どちらが早いとかは一概に言えませんよ。 リンク先にも >ただし、ユーザー定義関数の設計と呼び出しが適切であれば、複雑な配列数式よりもはるかに高速になります。 とあります。 ifのネストの繰り返しなどは遅いものの代表なので、同じことを比較すればVBAの方が早いですけど、それよりもSUMPRODUCTなど、配列数式や配列関数に置き換えた方が高速な場合がありますしね。
imihito

2018/11/06 15:34

指摘、情報ありがとうございます。 質問に >数式がかなり複雑でマクロに落とし込むのに苦労しています とあったため、最適化まで手が回らないだろうと勝手に判断し、断定するような形で書いてしまっていました。
midoritya_

2018/11/07 08:31

セル内のデータ量を少なくしたいというのが一番の目標でした。
guest

0

すみません、計算式をではなく、計算結果を戻り値としたい。ですね・・・。

下記で紹介されているようなことでしょうか。

ユーザー定義関数を作る:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

投稿2018/11/06 10:05

hatena19

総合スコア34367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

midoritya_

2018/11/07 08:30

近いといえば近いです。 ただ、マクロに落とし込むとしても元の計算式が複雑なので、なるべく流用したいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問