トップ «前の日記(2009-03-26) 最新 次の日記(2009-03-28)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-03-27

_ Excel2007の美点

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はうまくできていると結論。

_ ASR191更新

ASR191

Globalオブジェクトの取得時にSTLへNULLを与えてクラッシュするバグの修正。(kanegonさんが報告してくれたバグ)

本日のツッコミ(全4件) [ツッコミを入れる]
_ FILE (2009-03-27 21:11)

以前作成したExcelファイルのテキスト化ツール(VBScript製)では、s.OLEFormat.Object.Text で取得していました。<br>s の判定はしておらず、部分的に「On Error Resume Next」しておいて、「エラーが無い And 文字列長が1以上」の場合を<br>有効とみなしていました。その部分のコメントに、「いちいち.AutoShapeTypeで判定していられない」と書いていました…。<br>TextBox限定ではない上、全てのテキストを拾っているかどうかは判りませんが、ご参考まで。(2007で構成が変わったんですね…)

_ kanegon (2009-03-27 22:08)

ASR修正ありがとうございます。RubyScript、RubyScript.1.9、GlobalRubyScript.1.9ともにOKでした。確認ですが、現在RubyScript.1は動作しませんが、次期のリリースなどでこちらも修正されると考えてよいでしょうか。RubyScriptに一本化する方向で考えたいので。

_ arton (2009-03-27 23:12)

>kanegonさん<br>修正します。とりあえず例の?RScript.dllだけの更新パッケージは入れ替えます。<br>>FILEさん<br>ありがとうございます。その方法を試してみます。<br>この後、結局GroupItemsも試してうまくいかないので調べていたら、http://qa.asahi.com/qa2050170.html では2000と2007ではTextFrame.Charactersで取れるけど……となっていて、どうもExcel2003のGroupについては、僕の書いた方法は使えないようでした。

_ kanegon (2009-03-28 00:27)

ありがとうございます。お手数ですがよろしくお願いします。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え