このところまたVBA関連の仕事をやっているので、ネタもVBAばかりです。(^^;)
最近引っかかったのは、ワークシート上に複数のコメントがあって、それらの内容の一部をVBAで一括で修正する、というコード。
CommentsコレクションをFor Eachで処理します。
最初は、CommentオブジェクトのTextプロパティで取得した内容をReplace関数で置換して、もう一度Textプロパティに戻せばいいんじゃないの、と軽く考えていたのですが……実はCommentオブジェクトにはTextプロパティなんてない、ということを、恥ずかしながら今回初めて知りました。(^^;)
その代わりに見つかったのが、Textメソッドです。
Excel 2007でこのメソッドのヘルプを見ると、説明は「コメントの文字列を設定します。」だけで、3つある引数はすべてオプション。
「戻り値」として「文字列型 (String)。」とあるところから、具体的な説明はまったくない(^^;)ものの、引数をすべて省略すれば現在のコメントテキストを取得できるんだろうな、と想像しました。
また、第1引数Textの説明で「追加するテキストを指定します。」とあるので、次のようなコードでコメントテキストの修正ができるのではないかと考えました(コメントを表すオブジェクトを「c」とします)。
c.Text Text:=Replace(c.Text, 検索語, 置換語)
ところが、これではコメント内のすべての文字列が、先頭部分の文字の書式である、太字のフォントスタイルになってしまいます。
紙面の都合上、コードの文字数にも制約があるので、とりあえず検索置換方式はあきらめ、「○文字目から○文字分を変更」という形のコードにすることにしました。
で、Textメソッドの説明をもう一度見直すと、第2引数Startで「文字列を配置する文字の位置番号を指定します。」とあります。
一方、第3引数Overwriteの説明は、「True を指定すると、既存の文字列が指定した文字列に置き換えられます。既定の設定の False を指定すると、既存の文字列に指定した文字列が追加されます。」
……ということは、「○文字目から」は指定できても、「○文字分」という指定はできない、ということ?
結論から言うと、実はこのOverwriteの説明はまったくの間違いで(^^;)、これがまさに「○文字分」の指定でした。
なので、Falseは0なので問題ありませんが、True(-1)なんか指定しようものならエラーになります。
省略した場合は、すべての文字列が置き換えられます。
まあ、コメントはShapeとしても扱えるので、TextFrame経由で処理するとかいった方法はあるのですが、それはそれで説明することが増えるし、あくまでもCommentオブジェクトの範疇でとどめたいということもあったので。
(ちなみに、Shapeとして扱うことで、コメントに画像を表示したりすることも可能です)
なお、一般的なShapeは、Excel 2007ではTextFrame2でさらにいろいろな文字設定ができるようになりましたが、コメントのShapeはTextFrame2には対応していないようです。
2009年05月26日
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/29385739
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/29385739
※言及リンクのないトラックバックは受信されません。
この記事へのトラックバック