Typename と TypeOf is ってのがあるんですね。
いろんな図形をVBAで書く私にとっては,事前に不要な図形を消したりという操作をすることがよくありました。
そういうときに,図形があるかどうかをチェックしようとして,無い場合にエラーになり,そこでコードの実行が止められてしまうということがよくあります。
嫌いな方法ですが, On Error Resume Next と On Error Goto 0 でその部分だけ挟んで,エラーが出ても無視でお願いします,という対処しかできていなかった。
それを回避できる方法なのかどうかはわかりませんが,
いつか使えるかも,と思い自分用の備忘録として残します。
Determining Object Type (Visual Basic)
パワーポイントで試しています。スライド1に図形を一個準備した状態で下記のコードを試しています。
Sub test() Dim obj As Shape If TypeName(obj) = "Nothing" Then MsgBox ("カラッポ~") Else MsgBox (obj.Name) End If Set obj = ActivePresentation.Slides(1).Shapes(1) If TypeName(obj) = "Nothing" Then MsgBox ("カラッポ~") Else MsgBox (obj.Name) End If If TypeOf obj Is Shape Then MsgBox ("図形だ") End Sub
IsObjectという関数は知っていたんですが,これを使っても,objをShapeと宣言するだけで,中に代入していなくてもIsObject関数はTrueを返してしまい,全く意味がありませんでした。
TypeOf obj Is Shape のほうは,Shapes(1)を代入する前に持っていくと,怒って終了してしまいます。
よく出てくるこいつです。
でも,TypeNameのほうは,次のような挙動をします。
上のコードを実行した場合です。
同じ内容のIf文を,objに1番目のShapeを参照渡しする前後で確認しているわけですが,
最初は カラッポ~ と言っているように,文字列"Nothing"を返している。
参照渡しで入った後はちゃんと図形の名前をMsgboxで答えています。
エラーで終了することもなく,オブジェクト変数に代入されたかどうかを見れてる。
もうエラー処理でかわす習慣がついていたので,どういう場面でこれが活きたかもう覚えていないんですが,
今度出会ったときに使えるように覚えておきたいと思います。
そもそも,なんでこの関数を検索したのかすら オボエテイナイ。