|
■No25291 (オガシン さん) に返信 > >oXls = new Excel.Application(); > この時点でタスクマネージャーのプロセスにはEXCEL.EXEがいるはずです。 > (エクセルが起動している状態) > > その後に、WorkSheet.Open();なんてしてませんか? > この行が実行されるからエクセルがWindows上に表示されているものと推測します。 > > #ちなみに > #Excel.Application oXls > #Excel.Workbooks oXlsBooks > #とすべてのオブジェクトの参照を受けて開放しないとだめです。 > > 1秒おきにエクセルの値を取得して....ってなると > 先に対象のファイルを開いた人(アプリ)が編集可能になると思いますので > 仕様にちょっと無理があるような気がします。 > #このアプリが常に読み取り専用で開くとかにしたら良いのかな。 > > どんな組み方をしているかソースをUPしてくれると分かりやすいのです。
ネットのサンプルなどをかき集めて作ったやつでオブジェクト指向など全く理解できていないので 恥ずかしいですが、取り敢えず作成したソースを載せておきます。ちなみにログ出力はまだ作成して いないので間に合せでメッセージBOXで表示する様にしてあります。
間違っている箇所やこうした方が良いというご指摘がありましたら、ソース内に記述頂けたら幸いです。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel;
namespace WindowsApplication2 { public partial class Form1 : Form { Excel.Application oXls; // = new Excel.Application(); Excel.Worksheet oSheet; // Worksheetオブジェクト string sBeforeValue = ""; int OpenFlag = 0;
public Form1() { InitializeComponent(); // 比較変数を初期化する }
private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; }
private void button2_Click(object sender, EventArgs e) { timer1.Enabled = false; //Form1.Enabled = false;
// Excelファイルをクローズする if (OpenFlag != 0) { oXls.Workbooks.Close(); oXls.Quit(); } this.Close(); return; }
private static void TimerMain(string sCellVal, string sBeforeValue) { try { string Text = "[ V_Map ] MCTAGのNo.32(ML20264)の内容が、【 " + sBeforeValue + " 】 から 【 " + sCellVal + " 】 に変更されました。"; // 比較元データと取得してきたデータを比較する if (sBeforeValue != sCellVal && sBeforeValue != "") { // 比較したデータが異なる場合に処理を行う //Yesの時のみ、フォームを表示する MessageBox.Show(Text, "確認", MessageBoxButtons.OK); } } catch { return; } }
// 指定されたワークシート名のインデックスを返すメソッド private static int getSheetIndex(string sheetName, Excel.Sheets shs) { int i = 0; foreach (Excel.Worksheet sh in shs) { if (sheetName == sh.Name) { return i + 1; } i += 1; } return 0; }
private void timer1_Tick(object sender, EventArgs e) { //Excel.Application oXls; // Excelオブジェクト oXls = new Excel.Application();
// Excel.Application の新しいインスタンスを生成する string excelName = "D:\\toyota\\課題変更\\MpSystemV_map.xls";
Excel.Workbook oWBook; // workbookオブジェクト
oXls.Visible = true; // 確認のためExcelのウィンドウを表示する // Excelファイルをオープンする oWBook = (Excel.Workbook)(oXls.Workbooks.Open( excelName, // オープンするExcelファイル名 Type.Missing, // (省略可能)UpdateLinks (0 / 1 / 2 / 3) Type.Missing, // (省略可能)ReadOnly (True / False ) Type.Missing, // (省略可能)Format // 1:タブ / 2:カンマ (,) / 3:スペース / 4:セミコロン (;) // 5:なし / 6:引数 Delimiterで指定された文字 Type.Missing, // (省略可能)Password Type.Missing, // (省略可能)WriteResPassword Type.Missing, // (省略可能)IgnoreReadOnlyRecommended Type.Missing, // (省略可能)Origin Type.Missing, // (省略可能)Delimiter Type.Missing, // (省略可能)Editable Type.Missing, // (省略可能)Notify Type.Missing, // (省略可能)Converter Type.Missing, // (省略可能)AddToMru Type.Missing, // (省略可能)Local Type.Missing // (省略可能)CorruptLoad ));
// Excel を非表示にする oXls.Visible = false;
// 与えられたワークシート名から、Worksheetオブジェクトを得る string sheetName = "MCTAG"; oSheet = (Excel.Worksheet)oWBook.Sheets[ getSheetIndex(sheetName, oWBook.Sheets)];
string sCellVal;
Excel.Range rng; // Rangeオブジェクト
try { rng = (Excel.Range)oSheet.Cells[8, 5]; sCellVal = rng.Text.ToString(); // E8セルの内容
if (sCellVal != sBeforeValue) { TimerMain(sCellVal, sBeforeValue); } sBeforeValue = sCellVal; //System.Threading.Thread.Sleep(5000); //Form.ShowDialog(); OpenFlag = 1; } catch { if (OpenFlag != 0) { oXls.Workbooks.Close(); oXls.Quit(); } return; } TimerMain(sCellVal, sBeforeValue); if (OpenFlag != 0) { oXls.Workbooks.Close(); oXls.Quit(); }
}
} }
|