わいえむねっと

Contents
Categories
Calendar
2010/03
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 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.018 sec
Chashed: -
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.mi​crosoft.co​m/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.micro​soft.com/ja-jp/library/microsoft.​office.int​erop.excel​.xlcutcopy​mode(office.11).aspx
メンバ名 説明
xlCopy コピー モード
xlCut 切り取りモード

_Application_CutCopyMode プロパティ (Microsoft_Office_Interop_Excel)
http://msdn.micro​soft.com/ja-jp/library/microsoft.​office.int​erop.excel​._applicat​ion.cutcop​ymode(office.11).aspx
XlCutCopyMode で使用できるのは、次に示す 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 がかかっていない場合はクリップボードの警告を抑止する必要があるのはなんでだ。なにか副作用でもあるのか。
根本原因が他のところにあるんじゃないかという気がしてならないけれど、風邪で朦朧としていて検証コードを書く気力がないのでとりあえずここまで。もげる。