DrawingObject

テキストボックスなどの図形にセルにある値を引用して表示させることができる。
図形を選んで、数式をいれるところに=A1などと打ち込めば良い。
これをVBAならどうするかと言えば以下のようになる。 テキストボックスを生成し、そこにA1の値を引用する。
Dim obj As Shape
Set obj = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 171, 91, 191, 56)
obj.DrawingObject.Formula = "=A1"
このDrawingObjectというところになかなか到達しなかった。
例えば
obj.Formula = "=A1"
と書いてもエラーとなってしまう。ヘルプのプロパティを一通り調査したがそれらしいものがない。

それもそのはず、古いExcel時代の名残で、ヘルプにはないという。
本来ならShape型に引き継がれているものだが、FormulaプロパティはShapeのメンバー(またはなんらかのメンバーのメンバー)にも存在しないのでエラーになる。つまり引き継がれていない。酷い話である。

さてもうちょっと追求してみよう。 obj.DrawingObjectを受けるオブジェクト名はなんだろうか。
Dim a As DrawingObject
と書いてもエラーになる。 答えは
Dim a As TextBox
のようだ。やってみればわかるが、このオブジェクト名はポップアップに出てこない。
これも同様に古いExcel時代の名残らしい。
以上を踏まえてプログラムを書いてみると
Dim obj As Shape
Dim tbox As TextBox
Set obj = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 171, 91, 191, 56)
Set tbox = obj.DrawingObject
tbox.Formula = "=A1"
このようにも書くことができる。
しかし、サポート外のオブジェクト名を使っているので、余り良いプログラムとは言えない。しかし他に方法はない。(Select/Selectionを使うのもどうかと思う)

これらのことは このサイトに書いてあり、とても参考になった。
TextBox以外の図形に対応するオブジェクト名やコレクション名もまとめられている。
検索エンジンで色々キーワードを工夫してもなかなか良い具合に出てこないので忘れないようにリンクを張っておくという意味もある。
-

プロシージャの引数の数を可変にする(Optional)

Function conv(val, Optional rate = 90)
conv = val * rate
End Function
Sub main()
Dim a
a = conv(100, 76)
MsgBox a
a = conv(100)
MsgBox a
End Sub

Function conv(val, Optional rate = 90)
conv = val * rate
End Function
引数の一部を省略可能にすることができます。
実行すると一つ目のメッセージボックスでは7600、二つ目は9000が表示されます。

main()の一つ目の呼び出しではval=100/rate=76
二つ目の呼び出しではval=100/rate=90
として処理されます。
このように引数を省略した場合の値を定義することができます。
値を省略すると、その時は文字列としてはNULL、数値としては0となるようです。

なお、一度Optional指定するとそれ以降の引数は必ずOptionalにする必要があります。
Function d(val, Optional rate = 90, count)
みたいなのはNGです。

Optional指定により省略できるようにした場合は、省略されたことを確認して適切な処理を行う必要があります。
省略されたかどうかはIsMissing()を使えば判定ができます。
-