Excelのグラフをクリップボード経由でPictureBoxに貼付(2個) (SNo.065) 表示したグラフをファイルに保存 ファイルがロックされない読み込み表示 起動中(使用中)のExcel のバージョンを取得 |
|
使用コントロール | PictureBox1 |
その他条件 | WindowsVista VB2010(VS2010 Pro) Framework 4 / ターゲットCPU:X86 Excel 2007/Excel
2010 [Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 プロジェクト→参照の追加→COM→Microsoft Excel 12.0(14.0) ObjectLibrary を参照設定しておいてください。 Excelの起動及び終了・グラフの表示の部分は[VB.NETからExcel にデータを送りグラフを表示する(SNo.067)]をご覧下さい。 |
★ Excelのグラフをクリップボード経由でPictureBoxに貼付 の関係部分のみ
VB.NETからExcel にデータを送りグラフを表示する に下記の部分を追加して下さい。 '追加位置は、VB.NETからExcel にデータを送りグラフを表示する をご覧下さい。 '=========================== ここからが追加分 ============================= Dim xlVersion As Excel.Application xlVersion = xlApp.Application '起動中(使用中)のExcel のバージョンを取得 If CDbl(xlVersion.Version) >= 12 Then 'Excel 2007/Excel 2010 の場合 '-------------------------------------------------------------------------- '★ このグラフをファイルに保存する場合 xlChart1.Export(Filename:=Application.StartupPath & "\test001.GIF", FilterName:="GIF") '--------------------------------------------------------------------------- '画像ファイルを読み込み表示(ファイルのサイズで) 'With PictureBox1 ' '表示する画像のサイズに合わせてPictureBoxを表示します ' .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize ' '画像ファイルを読み込みPictureBoxに表示 ' .Image = System.Drawing.Image.FromFile(Application.StartupPath & "\test001.GIF") 'End With '上記のような方法で読み込むと、再度実行するとファイルがロックされているので 'エラーとなるので、必要により下記のように読み込み表示して下さい。 'FileStream オブジェクトを使用して読み込み表示するとロックされません。 '(使用中でも、test001.GIF を上書き、削除等してもエラーとならない。) Using fs As System.IO.FileStream = New System.IO.FileStream(Application.StartupPath & _ "\test001.GIF", System.IO.FileMode.Open, System.IO.FileAccess.Read) PictureBox1.Image = System.Drawing.Image.FromStream(fs) End Using Else 'Excel 2007 以下の場合 '------ Excelのグラフをクリップボード経由でPictureBoxに貼付 ------------------ 'クリップボードにコピー 'xlSheet.ChartObjects("グラフ 1").Copy() 'これでは、.NET では取得できない xlChart1.CopyPicture(Appearance:=Excel.XlPictureAppearance.xlScreen, _ Size:=Excel.XlPictureAppearance.xlScreen, _ Format:=Excel.XlCopyPictureFormat.xlBitmap) '------------------------------------------------------------------------------- 'Excel 2007 以降では、上記でもクリップボードには、EnhancedMetafile MetaFilePict の '画像しかコピーされない。 'Excel 2007 以降の場合、一度保存してからファイルを読み込むか、サンプルNo.158 の 'サンプルを使ってメタファイルを取得するかしてください。 '------------------------------------------------------------------------------- '現在システム クリップボードにあるデータを取得します Dim iData As IDataObject = Clipboard.GetDataObject() 'クリップボードにBitmapファイルがあれば If iData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then 'PictureBox1にクリップボードの画像を貼り付け PictureBox1.Image = DirectCast(iData.GetData(DataFormats.Bitmap), Image) End If End If MRComObject(xlVersion) '=========================== ここまで ======================================= |
|
通常Excelのグラフをコピーすると、CF_METAFILEPICT : Windows メタファイル CF_ENHMETAFILE : 拡張メタファイル
がクリップボードにコピーされ、それらのファイルのフォーマット形式は.NETでは取得する事ができず、従ってクリップボード経由でPictureBoxに貼付できない為に、掲示板等への書き込みが散見されます。 そこで、色々調べていて解ったのですが、ExcelのグラフをBMP形式でコピーできることを知り、その動作をマクロにとって.NET用のコードにしたものです。 Excel上では、グラフを選択して、[Shift]キーを押しながら、メニューバーの[編集]のメニューの[図のコピー]をクリックすると下記のようなダイアログがでてきます。 又、Excel 上でグラフをファイルに保存する事も可能です。 別途、クリップボード関係のAPI を使用すればメタファイル形式で取得することもできます。 |