AX
Excel VBA周り。。。Wordとの連携関係で落とし穴。。。
仕事の関係上、エクセルをよく使うが、時間の関係上VB(Visual Basic)は、必要に迫られたときに「えぃやっ!」とばかりに集中して組み上げる程度で、あまりに奥深いところ(?)までは触っていなかった。

ところで毎年、一定量のワードファイルの書式をチェックする必要があり、五月雨式に送られてくるファイルをその都度チェックすることを手作業でおこなっていた。

数としては100件に満たない程度で、2週間程度の間にばらばらと送られてくる。
ワードのVBまで手を出す余裕もなく、それほど苦にはならないので、いままでそのままにしていたが、ふとしたことからエクセルシート上にファイル書式情報を自動的に展開する方法のあることを知り、少しばかり手を伸ばしてみた。

ネットで「Excel Word VBA」等で検索すると
Excel VBA 他のプログラムとの連係 ExcelVBA で Word オブジェクトを操作
http://makoto-watanabe.main.jp/vba_Word.html

等引っかかってくる。

こちらを参考にし、シートの追加部分は日付情報にて名前の重複判定をしなくても良いように改良し、一枚のシート上にて各行に複数ファイルの書式設定関係の情報を列方向に展開することとした。

で、やはり引っかかった。
「VB恐るべし」。。。といったところか。。。

エクセルのVBにてワードファイルを扱う場合に注意すべき点
ワードのオブジェクトに関連する関数類を使用するとき、初回のマクロ・VBA動作では問題なくても、2回目のマクロ・VBA動作にてエラーが発生する

修正前のコード概要例 --- エキサイトへの投稿時、変なところで引っかかるので、部分的に全角英数にしています。
Set fileSysObj = CreateObject("Scripting.FileSystemObject")
(中略)
Set wordApp = CreateObject("Word.Application")
Set targetDoc = wordApp.Documents.Open(略)
(中略)
Range("A1").Cells(lineNum,colNum).Value
= PointsToMillimeters(targetDoc.PageSetup.TopMargin)
'--- 2回目のマクロ・VB実行時、ここでエラー発生
(中略)
targetDoc.Close savechanges:=False
(中略)
wordApp.Quit

 症状:
  初回は問題なく動作する。エクセルシートを閉じずに2回目の実行を試みると、
PointsToMillimeters(targetDoc.PageSetup.TopMargin)
の部分で「実行時エラー '462': リモート サーバーがないか、使用できる状態ではありません。」が発生する。
エラートラップ(on error)等にて捕捉して中断しても、うまく対処しないと
Set wordApp = CreateObject("Word.Application")
にてバックグラウンドで稼働しつづけているワードソフトが残った状態に陥るので、副作用が生じ、原因の特定にたどり着きにくくなる。
上記のような背景事情もあるためか、ネット上で、同様の症状について検索できるが、根本的な理由を説明しているものにはなかなかたどり着けなかった。(ざっくりと検索しただけなので、探せば的確なものが参照できたかもしれない。見つけ出したらリンクを貼り付ける予定。)

最終的に探し当てた下記が最も根本的な理由になっていると思われる。

MicroSoft サポート
「2 回目のコード実行時に Excel のオートメーションが失敗する」
https://support.microsoft.com/ja-jp/kb/178510/ja?wa=wsignin1.0
原因の要約(私が理解しうる範囲での要約なので間違っているかもしれない):エクセルのVBAでのオブジェクトの捕捉の仕方に(仕様上の?)問題があるようで、ワードのオブジェクトであっても、2回目以降の実行時にエクセルへの(今回はワードへの?)独自の参照が設定されてしまうためにエラーが発生する場合があるようです。


2015.05.17 02:50 追記、上記URL内の文章を今回のものとして(私なりに解釈した内容に)変更し引用(今回の状況に応じて変更した点の内、重要部分をオレンジにしています)
5.(前略)プログラムを開始します。
6.エラーは発生しません。ただし、オートメーションとして作成されたWordオブジェクトへの参照が作成され、解放されません。
7.プログラムを再度実行します。「現象」に記載されているいずれかのエラー メッセージが表示されます。
注 : エラー メッセージが表示されるのは、このコードでは、word関連の オブジェクト変数で修飾せずに呼び出したオブジェクトのメソッドを直接参照しているためです。

修正(というより追記)した部分(赤)
wordApp.PointsToMillimeters(targetDoc.PageSetup.TopMargin)

修正後のコード概要
Set fileSysObj = CreateObject("Scripting.FileSystemObject")
(中略)
Set wordApp = CreateObject("Word.Application")
Set targetDoc = wordApp.Documents.Open(略)
(中略)
Range("A1").Cells(lineNum,colNum).Value
= wordApp.PointsToMillimeters(targetDoc.PageSetup.TopMargin)
'--- 2回目のマクロ・VB実行時でもエラーは発生しなくなった。
(中略)
targetDoc.Close savechanges:=False
(中略)
wordApp.Quit


2015.05.17 02:50 追記
その他、Excel VBAでワードオブジェクトを扱うときに注意すべき点(見つけたら追記していきます)
1.用紙の縦横に関するプロパティに割り当てられた数字が統一されていない。
ワード --- 縦;0、横:1
エクセル --- 縦:1、横:2

[PR]
by kisugi_jinen | 2015-05-10 23:05 | program。。。 | Comments(0)
<< 人工知能マシン、プログラマーに... 自らを崇高なる戦闘員と信じてい... >>



「ともし火に我もむかはず燈(ともしび)もわれにむかはず己がまにまに」(光厳院) --- 厳然とした境界を越え得ぬとき、その上でなお、越えうるものがあるとすれば、それは「情」である。
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
検索
カテゴリ
最新の記事
お知らせとリンク。。。
お知らせ
●コメントスパム対策のため、承認制に変更しました(2010.09.29)
●トラックバックのリンクチェック機能を追加しました。excite以外からのトラックバックをされる場合、当該記事へのリンクを埋め込んでください。
リンク
ゲストブック
---全体的なコメント等は、こちらへどうぞ。。。
来生自然のホームページ
---私の知の思想史。。。
鉄鼠
---「考える」ということに向き合う。。。
Genxx.blog
移転後http://blog.genxx.com/
---「情」を含めて専門的な立場から「こころ」を模索し続けるGenさんのブログ。。。
研幾堂
---山下裕嗣氏による哲学のサイト。以前、形而上学についてやりとりさせていただいた。
記事ランキング
最新のコメント
Kandomonmasa..
by kisugi_jinen at 01:29
Kandomonmasa..
by kisugi_jinen at 03:51
kisugi_jinen..
by Kandomonmasa at 14:28
> SumioBabaさ..
by kisugi_jinen at 10:41
「神」を完全に解明しまし..
by SumioBaba at 05:06
最新のトラックバック
venuspoor.com
from venuspoor.com
venushack.com
from venushack.com
whilelimitle..
from whilelimitless..
http://while..
from http://whileli..
http://www.v..
from http://www.val..
以前の記事
フォロー中のブログ
外部リンク
ブログパーツ
ライフログ
ファン
ブログジャンル
画像一覧