著作一覧 |
Excel2003をインストールしてあるマシンは画面が小さいので、Excel2007が入っている開発機で、xls用(2003互換ということ)のマクロを作り、さて配ったら、いきなり動かないという声が。
はて? とExcel2003で試すと確かにエラーになる。このメソッドはWordなんとか用ですとか出てくる。
具体的には、シート上に図形がたくさん張り付けてあって、個々の図形(主にRectangleだが)には小さなRectangleとTextBoxと複数のLineが接続されていてそれがグループ化されている。で、おれがやりたいのは、各グループのTextBox内のテキストの更新だった。
For Each s in ActiveSheet.Shapes If InStr(s.Name, "Group") > 0 Then s.textEffect.Text = Left(s.TextEffect.Text, 4) ' とかなんとか End If Next
というような感じで、Excel2007では100個近くの四角の中のテキストが変更できる。
が、どうやら、TextEffectを持つTextBoxにGroupのShapeがデリゲートするような気の利いたオブジェクトモデルはExcel2007からの提供らしい。
しばし、MSDNを眺めて、次のように書き換えた。
For Each s in ActiveSheet.Shapes If InStr(s.Name, "Group") > 0 Then s.TextFrame.Characters.Text = Left(s.TextFrame.Characters., 4) ' とかなんとか End If Next
が、あえなく撃沈。上のコードではsは、Groupだが、GroupはとにかくText Boxではないということが良くわかった。わかったが、ではどうしろと。
たぶん、Shape#GroupItemsから列挙してTextBoxを探してやれば良いのだろうとは思ったが、面倒になったので、Excel2007専用にした。
で、動的にメソッドを追加できるオブジェクトモデルであれば、コンポジションの内側に勝手にデリゲートしてやるように作るべきだよなぁとつくづく思った。
というわけで、Excel2007はうまくできていると結論。
ジェズイットを見習え |
以前作成したExcelファイルのテキスト化ツール(VBScript製)では、s.OLEFormat.Object.Text で取得していました。<br>s の判定はしておらず、部分的に「On Error Resume Next」しておいて、「エラーが無い And 文字列長が1以上」の場合を<br>有効とみなしていました。その部分のコメントに、「いちいち.AutoShapeTypeで判定していられない」と書いていました…。<br>TextBox限定ではない上、全てのテキストを拾っているかどうかは判りませんが、ご参考まで。(2007で構成が変わったんですね…)
ASR修正ありがとうございます。RubyScript、RubyScript.1.9、GlobalRubyScript.1.9ともにOKでした。確認ですが、現在RubyScript.1は動作しませんが、次期のリリースなどでこちらも修正されると考えてよいでしょうか。RubyScriptに一本化する方向で考えたいので。
>kanegonさん<br>修正します。とりあえず例の?RScript.dllだけの更新パッケージは入れ替えます。<br>>FILEさん<br>ありがとうございます。その方法を試してみます。<br>この後、結局GroupItemsも試してうまくいかないので調べていたら、http://qa.asahi.com/qa2050170.html では2000と2007ではTextFrame.Charactersで取れるけど……となっていて、どうもExcel2003のGroupについては、僕の書いた方法は使えないようでした。
ありがとうございます。お手数ですがよろしくお願いします。