- 2010/03/12 Fri
-
Excel.Application.Run でVBマクロを叩いていたコードをVBマクロなんか使う必要ないよ!なんだよこれ!と削除したら、Excel.Workbook.Close が終了しなくなってしまったので調べる。
(環境)
Microsoft Visual C# 2008
Microsoft Excel 10.0 Object Library
・Excel.Application.DisplayAlerts を true にしたところ
クリップボードの警告ダイアログが表示された。
ダイアログを操作すれば Excel.Workbook.Close が通る。
・ダイアログは表示させたくないのでプログラムでクリップボードの警告メッセージを無効にする方法
http://support.microsoft.com/kb/287392/ja方法 2 : CutCopyMode を終了する
Visual Basic for Applications マクロを使用してセルの切り取りまたはコピーを行う場合、ブックを閉じる行の直前に次の行を挿入します。
workbook.Application.CutCopyMode = False
を参考に Excel.Workbook.Application.CutCopyMode を False にしようしたけど
XlCutCopyMode の定義がpublic enum XlCutCopyMode { xlCopy = 1, xlCut = 2, }
とかで入らない。なんでだ。(参考)
XlCutCopyMode 列挙型 (Microsoft_Office_Interop_Excel)
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.xlcutcopymode(office.11).aspxメンバ名 説明
xlCopy コピー モード
xlCut 切り取りモード_Application_CutCopyMode プロパティ (Microsoft_Office_Interop_Excel)
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel._application.cutcopymode(office.11).aspxXlCutCopyMode で使用できるのは、次に示す XlCutCopyMode 列挙型の定数のいずれかになります。
取得する値 説明
False 切り取りモードとコピー モードがいずれも選択されていない状態。
xlCopy コピー モード。
xlCut 切り取りモード。
・とりあえず xlCopy をセットしてみたところ警告ダイアログはでなくなった。
・xlCut でも同様。セッターでなんかやってるっぽい。
・と思ったら、Excelのプロセスが残るようになってしまっていた。
・と思ったら、それは Excel.Workbook.Application にアクセスしたせいで
余計なオブジェクトが増えたせいだった。
・CutCopyMode のセットを Excel.Application に対して行うように修正して解決。
・COM オブジェクトの操作はいろいろめんどくさいねという話。
状況は解決したけれど、そもそも Excel.Application.Run を叩いていたときはなんで平気だったのさともうちょっと調べてみる。
・Excel.Application.Run で叩いているVBマクロを空にすると終了しなくなる。
・徐々に削ってみたころ、Selection.AutoFilter を削ったところで終了しなくなった。
・逆に Selection.AutoFilter だけの場合は問題なし。
・と思ったら、AutoFilter のかかり具合によって挙動が違う。
・ただ、正常に終了する状態でも Excel.Application.DisplayAlerts を true にすると
クリップボードの警告はでる。
AutoFilter がかかっている場合はクリップボードの警告は関係なく、AutoFilter がかかっていない場合はクリップボードの警告を抑止する必要があるのはなんでだ。なにか副作用でもあるのか。
根本原因が他のところにあるんじゃないかという気がしてならないけれど、風邪で朦朧としていて検証コードを書く気力がないのでとりあえずここまで。もげる。