和風スパゲティのレシピ

日本語でコーディングするExcelVBA

日本語関数はクイックヒントの太字強調がズレる

日本語で命名した関数で発生する落とし穴です。


この関数を呼び出して使うとしましょう↓

Function 図形に影の装飾を設定する(図形オブジェクト, サイズ, 距離, 角度, 透明度, ぼかし)
    ~~
End Function

 
開きカッコまでを入力すると、引数のリストが表示されます↓
クイックヒント1
これをクイックヒントと呼びます。


このクイックヒントには、今入力している引数を太字にしてくれる機能があり、
まずは第1引数「図形オブジェクト」が太字になっていることがわかりますね。


しかし、ここでカンマをひとつ打つと…


クイックヒント2

「ズ, 距離, 角度, 透明度,」と、謎の部分が太字になっていますね…。


このように、関数名・引数名に日本語を使っていると、現在入力の太字強調がズレて表示されます。


仮引数名が日本語だと、引数のヒントは非常に分かりやすくなるのですが、
その代わり、太字の協調機能はあてにはなりません。

たまにピッタリ3つ右の引数を太字にしたりするので、
引数の取違えに、ご注意ください。


いい解決策もないので、太字は無視してしまいましょう。


一応の解決策としては、クイックヒントにはショートカット「Ctrl + I」が設定されています。(画像の通り、仮引数名が斜め文字で表示される機能ですので、Itaricを出すと覚えましょう)


クイックヒントをいったん消し、再度クイックヒントを表示することで、
そのとき選択している引数だけは、正しく太字にすることはできます。


が、次の引数に移るともうズレますので、入力時の解決策にはなりません。

書き終わった後の確認や、デバッグ時のチェックではなんとか使える程度ですね。

引数の取違えを防ぐために

太字機能をしっかり起動させるならこうです↓

クイックヒント3


これで「透明度」のパラメータを、
まちがって「ぼかし」に渡してしまう心配がなくなりますね!




本当に?




「引数の取違え」を招く落とし穴のラスボスは、間違いなく「翻訳」です。



確かに、2バイト文字には、システム上の不具合がつきものです。

実行エラーとして発生することも稀にありますし、
今回のコードのハイライト機能など、開発環境の支援機能は、
実害がないため放置 or もともとサポート外と言うこともあるでしょう。


ですが、1バイト文字には、我々の脳みその不具合がつきものです。


前者を絶対に回避するために2バイト文字を禁止し、
その上で完璧なコードを書けというは、さすがに根性論でしょう。


そんでもって、この対策に、

' 図形に影の装飾を設定する
    ' size               : 影のサイズ
    ' distance         : 距離
    ' angle             : 角度
    ' transparency :透明度
    ' blur               : ぼかし
Function SetShadowFormat(obj, size, distance, angle, transparency, blur)

こんなことしちゃうから、英語コードの(私ですら重宝する)長所である、
「タイピングの楽さ」まで犠牲になるんですよ。



外人さんのために使う英語変数はもちろん必要ですし、
そのための英語の勉強は必要なコストです。


対して稀なシステム不具合を回避するための半角変数については、
代わりに犠牲になるものと釣り合うコストか、都度考えるべきです。


システムリスクと脳みそコストのバランスを見て、
総合的に良い方を選んで使い分けましょう。


ということで、日本語識別子の注意喚起と見せかけた
日本語識別子の啓発キャンペーンを終わります。

ご清聴、ありがとうございました(´∀`)

おまけ:2バイト文字は日本語だけではない

今回の「影」設定は、中でこの計算が出てきます↓

図形オブジェクト.Shadow.OffsetX:=距離 * Cos(角度)

 
Excelのプロパティは距離と角度で設定しますが、
VBAのShadowオブジェクトは縦横のOffsetで指定しますからね。


このような式の読みやすさも日本語のひとつの強みなのですが、
せっかく2バイト文字を使うなら、こんな風にも書けます↓
 

Function 図形に影の装飾を設定する(図形オブジェクト, サイズ, r, θ, 透明度, ぼかし)

    図形オブジェクト.Shadow.OffsetX:=r * Cos(θ)

 
懐かしいですね(笑)
極座標変換「x = r cosθ」、覚えてます?


読みやすいと感じる人が限られるうえに、書くのもえらいめんどくさいので、今回の例では意味は無いですね。

でも変数名にいざとなったら記号もいけるというのは、
覚えておくと何かの役に立つかもしれません。(たぶん)


ループを回して合計値を足していく変数なんかを、Σにして遊んでみてください。


なお補足になりますが、
コサインの引数には角度をラジアンに変換して渡す必要があるため、正確には

Function 図形に影の装飾を設定する(図形オブジェクト, サイズ, r, θ度 As Long, 透明度, ぼかし)
    Dim θ As Double
    θ = θ度 * 2 * WorksheetFunction.Pi / 360
    図形オブジェクト.Shadow.OffsetX:=r * Cos(θ)

こうする必要があります。

「θ=θ°*2π/360」
と公式っぽくやりたいところですが、残念ながらθ°は使えません。

「°」は識別子に使用できない文字ですので、ご注意ください。