- PR -

C# フォーム上PictureBoxにExcelグラフを表示

投稿者投稿内容
evo
会議室デビュー日: 2005/08/26
投稿数: 8
投稿日時: 2005-08-26 01:12
C#アプリケーションのフォーム上のPictureBoxにExcelグラフをクリップボード経由
で表示したいのですが、やり方がわかりません。よろしければどなたか教えてください。

Excel自体は、C:¥A.xls グラフはグラフ専用のシート(シート2番目)「Graph」上にあり、
コード自体は、

Excel.Application app;
Excel.Workbook book;
private void button1_Click(object sender, System.EventArgs e)
{
 app = new Excel.Application();
 app.Application.Visible = false;
 book = (Excel.Workbook)(app.Workbooks.Open("C:¥¥A.xls",
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value));
 ・
 ・
 *****ここの記述がぜんぜんわからない*****
 ・
 ・
 app.Quit();
}

上記のように分からない状態です。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-08-26 06:03
コードがわからなくても、手順はわかりますか?

手順がわかれば、その通りの操作を、「マクロ記録」しながら行えば、VBAでのコードができますよ。
_________________
evo
会議室デビュー日: 2005/08/26
投稿数: 8
投稿日時: 2005-08-26 09:43
Jittaさん 返信ありがとうございました。

いろいろやった結果下記のようになり一応実行できました。

private void RunMacro(object oApp, object[] oRunArgs)
文は意味がわかりませんが、
http://support.microsoft.com/default.aspx?scid=kb;ja;306683
を参考にやってみました。

コードが問題あるかは分かりません。

コードに問題がありそうであれば、再度教えていただけないでしょうか?
宜しくお願いいたします。

private void button1_Click(object sender, System.EventArgs e)
{
IDataObject data = Clipboard.GetDataObject();

app = new Excel.Application();
app.Application.Visible = false;
book = (Excel.Workbook)(app.Workbooks.Open("C:¥¥A.xls",
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value, Missing.Value, Missing.Value,
      Missing.Value, Missing.Value));

RunMacro(app, new Object[]{"GraphMacro"});
pictureBox1.Image = (Image)data.GetData(DataFormats.Bitmap);

app.Quit();
}
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oApp, oRunArgs);
}

Excel上マクロ

Sub GraphMacro()
ActiveChart.ChartArea.Select
ActiveChart.ChartArea.Copy
End Sub
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-08-26 13:39
すべてC#側で制御した方がスマートです。
VBAからC#への移植は、慣れれば簡単に出来ます。
扱うオブジェクトは同じなのだから。

また、ネットにもVBAやVBのサンプルが沢山あるので参考にしましょう。
例えば、
http://www.bcap.co.jp/hanafusa/VBHLP/graph01.htm
evo
会議室デビュー日: 2005/08/26
投稿数: 8
投稿日時: 2005-08-26 13:59
todoさん 返信ありがとうございます。

参考ページの

xlSheet.ChartObjects("グラフ 1").Copy

文をC#の場合どのように記載すればよいか分からない状態です。
グラフのあるシートの指定・対象グラフの指定も分かりません。

こんな初心者で申し訳ございません。

[ メッセージ編集済み 編集者: evo 編集日時 2005-08-26 14:01 ]
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2005-08-30 12:56
evoさんの

xlSheet.ChartObjects("グラフ 1").Copy

の部分は

//グラフコピー
Excel.ChartObjects xChart= (Excel.ChartObjects)lSheet.ChartObjectsType.Missing);
//クリップボードにコピー
xChart.Copy();

でできませんか???
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2005-08-30 12:58
Excel.ChartObjects xChart= (Excel.ChartObjects)lSheet.ChartObjectsType.Missing);

あっ!

Excel.ChartObjects xChart= (Excel.ChartObjects)xlSheet.ChartObjectsType.Missing);
↑(xが抜けてました・・・)
evo
会議室デビュー日: 2005/08/26
投稿数: 8
投稿日時: 2005-09-01 00:28
もも さん 返答ありがとうございました。
遅くなり申し訳ございません。

返答を参考にして結果うまくいきました。
ありがとうございました。

ただ1つ問題があるのですが、あるグラフを参照する場合
シート上にグラフしかないシートを選択する場合、
Excel.Workbook book;
Excel.Worksheet xlSheet;
xlSheet = (Excel.Worksheet)book.ActiveSheet;
では、エラー(指定されたキャストは有効ではありません。)
などとなってしまいます。
上記コードではなく、うまく選択する方法はあるのでしょうか?





スキルアップ/キャリアアップ(JOB@IT)