C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: C#でExcelファイルのアクセス方法について


(過去ログ 46 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■25252 / inTopicNo.1)  C#でExcelファイルのアクセス方法について
  
□投稿者/ 超初心者 (6回)-(2008/09/17(Wed) 11:04:17)

分類:[C#] 

2008/09/17(Wed) 15:10:07 編集(投稿者)


1週間前からC#を始めました。課題として

@新フォームを生成する。
Aタイマー(1秒毎)を作る。
B1秒毎にTimerMain()という関数をコールする。
CTimerMain()内でExcelファイルのMTCTAG(シート名)の項番32を監視する。
D値が変化したらログに値を残す。

と言った処理的には難しくないのですが与えられました。Excelファイルへの
アクセスでデータを監視するところまでは出来たのですが、僕の調べたやり方
では毎回Excelファイルが開いてしまって画面がちらついて見難いのでExcelファイル
を開かずにデータの監視をする方法があれば教えて頂きたいです。
よろしくお願いいたします。
引用返信 編集キー/
■25255 / inTopicNo.2)  Re[1]: C#でExcelファイルのアクセス方法について
□投稿者/ オガシン (94回)-(2008/09/17(Wed) 11:12:34)
1週間前からC#を含めてプログラミングを始めたというのであれば
この掲示板のTOPのC#入門サイトからCOMの解放あたりを調べてみてください。

画面を非表示にするのならVisible = FalseにすればOKです。
開放漏れはきちんとチェックするようにしてください。

引用返信 編集キー/
■25260 / inTopicNo.3)  Re[1]: C#でExcelファイルのアクセス方法について
□投稿者/ おてやわらか (17回)-(2008/09/17(Wed) 11:19:46)
>CTimerMain()内でExcelファイルのMTCTAG(シート名)の項番32を監視する。
ですので、
>Excelファイルを開かずにデータの監視をする方法があれば教えて頂きたいです。
は、無理です。ファイルを開かずに、データを取得する方法はありません。
よく、開かずにというのがありますが、開いている方法が違うだけです。

その都度、ブックを開かず、開いているブックのシートの該当セルやオブジェクトを監視する方法、なら可能です。

現状の書込みでは、何時、何処で、誰が:どのプログラムが、Excelのブックを開くのかが不明ですので、
何時、何処で、誰が、Excelのブックを開くのかを、はっきりさせた方がいいと思います。
Excelのシート内のセル、オブジェクトを編集中は、セル、オブジェクトのデータ取得は難しくなるので、
取得する際の条件も必要になると思います。

引用返信 編集キー/
■25261 / inTopicNo.4)  Re[2]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (7回)-(2008/09/17(Wed) 11:22:03)
2008/09/17(Wed) 11:26:29 編集(投稿者)

No25255 (オガシン さん) に返信

早々のご回答有難うございます。

> 1週間前からC#を含めてプログラミングを始めたというのであれば
> この掲示板のTOPのC#入門サイトからCOMの解放あたりを調べてみてください。

はい、もう少し調べてみます。


> 画面を非表示にするのならVisible = FalseにすればOKです。
> 開放漏れはきちんとチェックするようにしてください。
>

一応

  Excel.Application oXls; // Excelオブジェクト
oXls = new Excel.Application();


// Excel を非表示にする
oXls.Visible = false;

は、試してみたのですがやはりExcelが開いてきました。


引用返信 編集キー/
■25268 / inTopicNo.5)  Re[3]: C#でExcelファイルのアクセス方法について
□投稿者/ オガシン (95回)-(2008/09/17(Wed) 11:35:56)
>は、試してみたのですがやはりExcelが開いてきました。
開いてしまったというのはタスクマネージャーに表示されてしまったということですか?
開きたくないって言うのはWindowsのタスクバーに表示されてほしくないってことです?

あと使用しているWindowsとかVisualStudioとかExcelのバージョンとかも分かれば
教えてもらえると。

今確認できるとしたら
WindowsXP SP2
VisualStudio2003、2005、2008
Excel2003です。

引用返信 編集キー/
■25271 / inTopicNo.6)  Re[3]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (8回)-(2008/09/17(Wed) 11:38:28)
2008/09/17(Wed) 12:28:22 編集(投稿者)

No25255 (おてやわらか さん) に返信

早々のご回答有難うございます。

>CTimerMain()内でExcelファイルのMTCTAG(シート名)の項番32を監視する。
>ですので、
>Excelファイルを開かずにデータの監視をする方法があれば教えて頂きたいです。
>は、無理です。ファイルを開かずに、データを取得する方法はありません。
>よく、開かずにというのがありますが、開いている方法が違うだけです。
>’
>その都度、ブックを開かず、開いているブックのシートの該当セルやオブジェクトを監視する方法、なら可能です。
>’

その方法が知りたいです。

>現状の書込みでは、何時、何処で、誰が:どのプログラムが、Excelのブックを開くのかが不明ですので、
>何時、何処で、誰が、Excelのブックを開くのかを、はっきりさせた方がいいと思います。
>Excelのシート内のセル、オブジェクトを編集中は、セル、オブジェクトのデータ取得は難しくなるので、
>取得する際の条件も必要になると思います。

僕も課題として前述の項目を渡されただけなのでExcelの値が変わったらログを出せばいいぐらいしか考えていませんでした。
課題なので出題したほうもそこまで考えてないみたいです。

多分、僕が思うに現場で作業してる人がExcelファイルを開いて更新されたらどう変更されたかログに残す様なもので、
監視側は、Read Only で開いてデータを取得すると現場側で、Excelファイルが開けないといった事も無いと思います。
( Read Only で開くやり方もまだ調べていませんが・・・ )

引用返信 編集キー/
■25275 / inTopicNo.7)  Re[4]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (9回)-(2008/09/17(Wed) 11:50:58)
No25268 (オガシン さん) に返信

> >は、試してみたのですがやはりExcelが開いてきました。
> 開いてしまったというのはタスクマネージャーに表示されてしまったということですか?
> 開きたくないって言うのはWindowsのタスクバーに表示されてほしくないってことです?
>

ファイルをオープンしてデータを取得してすぐに

oXls.Workbooks.Close();
oXls.Quit();

しているのですが画面にExcelが開いてしまうということです。
1秒毎(現在は値を変更したりする時間も考えて10秒に設定してありますが)なので
毎回Excelが開くと画面がちらついて鬱陶しいので表示したくないのです。

> あと使用しているWindowsとかVisualStudioとかExcelのバージョンとかも分かれば
> 教えてもらえると。
>
> 今確認できるとしたら
> WindowsXP SP2
> VisualStudio2003、2005、2008
> Excel2003です。
>

環境は、WindowsXP SP3, VisualStudio2005, Office2003 です。
引用返信 編集キー/
■25279 / inTopicNo.8)  Re[5]: C#でExcelファイルのアクセス方法について
□投稿者/ オガシン (96回)-(2008/09/17(Wed) 11:53:46)
もうちょっとでお昼休みなのでお待ちを。。。
Excelの操作の前に調査だなんだでExcelの"資料"ばかり作ってます。
プログラム組みたい。。Orz
引用返信 編集キー/
■25282 / inTopicNo.9)  Re[6]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (10回)-(2008/09/17(Wed) 12:02:51)
No25279 (オガシン さん) に返信
> もうちょっとでお昼休みなのでお待ちを。。。
> Excelの操作の前に調査だなんだでExcelの"資料"ばかり作ってます。
> プログラム組みたい。。Orz

お手数をおかけしましてすみません。
ご自分のお仕事もありますのでお手隙の時で結構です。
引用返信 編集キー/
■25291 / inTopicNo.10)  Re[7]: C#でExcelファイルのアクセス方法について
□投稿者/ オガシン (97回)-(2008/09/17(Wed) 12:59:42)
>oXls = new Excel.Application();
この時点でタスクマネージャーのプロセスにはEXCEL.EXEがいるはずです。
(エクセルが起動している状態)

その後に、WorkSheet.Open();なんてしてませんか?
この行が実行されるからエクセルがWindows上に表示されているものと推測します。

#ちなみに
#Excel.Application oXls
#Excel.Workbooks oXlsBooks
#とすべてのオブジェクトの参照を受けて開放しないとだめです。

1秒おきにエクセルの値を取得して....ってなると
先に対象のファイルを開いた人(アプリ)が編集可能になると思いますので
仕様にちょっと無理があるような気がします。
#このアプリが常に読み取り専用で開くとかにしたら良いのかな。

どんな組み方をしているかソースをUPしてくれると分かりやすいのです。
引用返信 編集キー/
■25295 / inTopicNo.11)  Re[8]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (11回)-(2008/09/17(Wed) 13:19:03)
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();
}

}

}
}
引用返信 編集キー/
■25297 / inTopicNo.12)  Re[9]: C#でExcelファイルのアクセス方法について
□投稿者/ オガシン (98回)-(2008/09/17(Wed) 13:31:55)
>oXls.Visible = true; // 確認のためExcelのウィンドウを表示する
この部分をなくせば画面がちらつくようなことは無いです。

#解放はおわすれなく!
#上記ソースコードだと実行するたびにEXCEL.EXEのプロセスが誕生してしまいます。

引用返信 編集キー/
■25298 / inTopicNo.13)  Re[10]: C#でExcelファイルのアクセス方法について
□投稿者/ 超初心者 (12回)-(2008/09/17(Wed) 13:48:38)
2008/09/17(Wed) 13:49:15 編集(投稿者)

No25297 (オガシン さん) に返信
> >oXls.Visible = true; // 確認のためExcelのウィンドウを表示する
> この部分をなくせば画面がちらつくようなことは無いです。

有難う御座いました。確かに表示されなくなりました。

>
> #解放はおわすれなく!
> #上記ソースコードだと実行するたびにEXCEL.EXEのプロセスが誕生してしまいます。
>

解放については、まだ調べていませんのでこれから調べます。

オガシン さん、おてやわらか さん有難うございました。
今後も、簡単な質問かも解りませんが質問させて頂きますので
その際は、ご教授の程よろしくお願いいたします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -