玄関へお回り下さい。
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 を使用すればメタファイル形式で取得することもできます。


2004/07/03
2005/09/28
2012/06/08

VBレスキュー(花ちゃん)

VB.NET2003/VB2005/VB2008/VB2010
Excel 2007/Excel 2010/Excel VBA