[[20210225132255]] 『Functionで#value!が表示される』(アカポン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Functionで#value!が表示される』(アカポン)

以下の式を標準モジュールに書き、sheet1上に式を書き計算させる
B1(x)とC1(y)を足して、D1に表示させ、F1に入っている枠を赤で塗る
この場合、valueが表示される。

Function su(x, y, t) As Variant
su = x + y
t.Interior.ColorIndex = 3
End Function

しかし、interiorではなくFontに変えるときちんと動作し、F1の中の文字を赤にする

Function su(x, y, t) As Variant
su = x + y
t.Font.ColorIndex = 3
End Function

どうして、interiorの場合は、エラーになるのでしょうか
functionではなく sub()でのプログラムではきちんと動作します。
分かる方、お手数ですが、教えてください。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


コード自体は破綻していないので、引数に代入された値に問題があったのだろうと思います。
(めざめるパワー) 2021/02/25(木) 13:43

 Excel のユーザー定義関数の制限について
https://support.microsoft.com/ja-jp/topic/excel-f2f0ce5d-8ea5-6ce7-fddc-79d36192b7a1

 プロパティの設定およびほとんどのメソッドの実行 はできませんので、

 むしろ、Fontに変えるときちんと動作 する方が例外的です。
(´・ω・`) 2021/02/25(木) 13:54

ご返答ありがとうございます。 
subで書く場合は、問題なく動作します。
しかし、Functionで式として書く場合、range("枠").Interior.ColorIndexではエラーがでるので、そのような 場合、プログラムをどのように書けばエラーがでないと思われますか。
よろしければ、ご教授ください。
(アカポン) 2021/02/25(木) 14:10

既に指摘されているように、
ワークシートに入れるユーザー定義関数では
そうしたことができないようになっています。
仕様です。
コードの書き方の問題ではありません。
(γ) 2021/02/25(木) 14:57

もともと関数というのは数値や文字列などを返すものです。
セルの書式などはそういうものと違うので、
それらを変更する「副作用」には禁欲的です。
ある種の関数型プログラミングでは一般的な考え方です。

なおマクロから呼び出す分にはその制約は外れます。
(γ) 2021/02/25(木) 15:06


わかりました。お手数かけました。ありがとうございました
(アカポン) 2021/02/26(金) 11:32

 上記が原則なんですが、こんな方法で回避できるという方法を、
 他の掲示板で、とある方から教えて頂いたことを想い出しました。

 ユーザー定義関数の中では書式変更ができないが、
 他から呼ばれたFunctionプロシージャでは可能、ということを逆用した
 次のような書き方ができるようです。

 Function mySum(r1 As Range, r2 As Range, r3 As Range) As Variant
     Application.Evaluate "setColor(" & r3.Address & ")"
     mySum = r1 + r2
 End Function

 Function setColor(r As Range)
     'r.Interior.Color = vbRed    '赤
     r.Interior.ColorIndex = 3
 End Function

 ただし、この方法が万能かどうかは不明ですが、
 少なくともこのケースでは有効なようです。

 この方法は、国内では余り出回っていないようですが、
 私が最近感心したブレークスルー的手法でした。
 なんでも海外の記事にあったそうです。世の中広いなと思いました。  

 【余談】
 ちなみに、現在のコンセプトは関数の及ぼす範囲を限定的にしていて整合的ですが、
 上記手法はある種の網の破れなんでしょうね。

 ただし、Spill機能ですか?、最近は、MS社そのものがその原則を破っているのではないか
 と言う気がしないでもないのですが、
 便利ではありますが、どこまで進める積もりなのかと、気になりながら拝見しております。

 ついでに言えば、
https://www.publickey1.jp/blog/21/excellambdaexcelceoexcel.html
 なんかでは、Excelの根幹の計算機能をかなりアグレッシブに変えていこうという
 MS社の意気込みが窺えて興味深いです。

(γ) 2021/02/26(金) 12:44


余談の余談。
私がこれを知った時の議論は、
「DisplayFormatプロパティをユーザー定義関数内で使えないか」という議論でした。
こちらの掲示板でも、過去、
・条件付き書式で付けられた色をカウントしたい
・しかも、ユーザー定義関数を使って。
という議論で、ああ、それはユーザー定義関数の制約でできませんよ、
ということになっていたと思いますが、
上記手法を使うと可能になりますね。参考まで。
(γ) 2021/02/26(金) 13:04

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.