質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

5843閲覧

C#のEXCEL操作について

yamashita166

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/02/09 00:25

###前提・実現したいこと
実行環境
OS:WindowsServer2012R2
Office:EXCEL2013

###発生している問題・エラーメッセージ

C#で規定のフォルダに格納されている大量(700近く)のEXCELを
特定のシートだけを削除して保存するというのをループで行っています。
ループで最後のブックを保存した時だけ、
「データ リンク プロパティ」というダイアログが表示されて、処理がとまってしまいます。
(最後のブックを保存した時はタイムスタンプで判断)

何故、ダイアログが表示されてしまうのか。
どうしたらダイアログが表示されないようにできるか教えて下さい。
(規定は×ボタンでダイアログを閉じた時の動作で良い)

###該当のソースコード
Excel.Application vApplication = null;
Excel.Workbooks vBooks = null;
Excel.Workbook vBook = null;
Excel.Worksheet vSheet1 = null;
Excel.Worksheet vSheet2 = null;

DirectoryInfo target1 = new DirectoryInfo("D:TEST"); vApplication = new Excel.Application(); vApplication.DisplayAlerts = false; foreach (FileInfo file1 in target1.GetFiles()) { if (file1.Exists) { try { vBooks = vApplication.Workbooks; //ブックを開く vBook = vBooks.Open(file1.FullName, Type.Missing, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); if (vBook.ReadOnly) { //取得したEXCELが読み取り専用であった場合 continue; } vSheet1 = (Excel.Worksheet)vBook.Worksheets["Sheet1"]; vSheet2 = (Excel.Worksheet)vBook.Worksheets["Sheet2"]; vSheet1.Delete(); vSheet2.Delete(); vBook.Save(); } catch (Exception ex) { continue; } finally { // COM オブジェクト解放 if (vSheet1 != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(vSheet1); vSheet1 = null; } if (vSheet2 != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(vSheet2); vSheet2 = null; } if (vBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(vBook); vBook = null; } if (vBooks != null) { vBooks.Close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(vBooks); vBooks = null; } } } } if (vApplication != null) { //Excel終了 vApplication.Quit(); // COM オブジェクト解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(vApplication); vApplication = null; }

###試したこと
EXCELの詳細設定にて「リンクの自動更新前にメッセージを表示する」のチェックを外した

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

解決しました。

関係ないと思っていた部分(ソースも掲載していない)で問題が解決しました。

実は今回の処理をする前に特定フォルダからEXCELファイルをコピーしてきて今回の処理をする
という流れでした。

その特定のフォルダからコピーをしてきて処理をする時だけ発生していました。

解決方法としては、
①EXCELの退避用フォルダを作成
②EXCELを退避用フォルダに移動
③コピー基となったフォルダを削除
④退避用フォルダをコピー基フォルダと同名に変更
で、解決しました。

ただ、セキュリティ権限も同一の筈なのに何故フォルダを再作成しただけで直ったのか未だにわかりません。。

ーーー追記
解決したと思ったのですが、本日現象が再発しました。
根本的な原因がわからないと同じ対応を何度もしないといけなくなると思うので
ご助言をお願い致します。。

・セキュリティ権限は同一
・コピー基もコピー先も退避用フォルダも共有フォルダ
・退避用フォルダはコピー基フォルダからコピーペーストで作成

ーーー追記
問題点がかわってしまっているので新しく質問し直させて頂きます。
ご迷惑おかけしました。

投稿2017/02/16 02:59

編集2017/03/07 08:00
yamashita166

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらくですが、
EXCELのブック側がデーターソースの参照をしていて、その更新のためににExcel側がビジー状態になっているのではないでしょうか。
参照の更新で手一杯の時にQuitが送られてきたけどすぐは終了できず、C#側では参照を開放している状況が想像できます。
Workbooks.Openの引数に、UpdateLinks がありますので弄ってみてください。
それでだめなら、適当にウェイトを入れるぐらいしか思いつきません。

PS.
コードを見るに、開発環境は Visual Studio 2008 以前でしょうか?
最近であれば、Excelファイルの操作は、NPOI, EPPlus, ClosedXML の何れかを選択したほうが簡単です。

投稿2017/02/09 02:11

編集2017/02/09 03:57
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamashita166

2017/02/09 04:01

回答ありがとうございます。 諸事情により1週間に1回しか実行チャンスがないのでまた来週実行してみます。 お察しの通りVisualStudioは2008以前です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問