ExcelのグラフをPictureBoxに貼付

このQ&Aのポイント
  • VB.NETからExcelにデータを送り、グラフを表示する方法とExcelのグラフをクリップボード経由でPictureBoxに貼り付ける方法について質問があります。
  • 質問者はエクセルでグラフ作成まで成功しましたが、グラフの貼り付けができない状況に困っています。
  • プログラムでクリップボードから画像を取得する処理がうまく動作していないようです。環境はVB2005とExcel2007です。
回答を見る
  • ベストアンサー

ExcelのグラフをPictureBoxに貼付

下記のサイトの http://hanatyan.sakura.ne.jp/dotnet/index.html ●VB.NETからExcel にデータを送りグラフを表示する ●Excelのグラフをクリップボード経由でPictureBoxに貼付 を組み合わせたものを作りたいのですが、ソースコードが実行できなくて困っています。 エクセルでグラフを作成までは、エラーもなく、実行できたのですが、貼り付けができません。どうも、 If iData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap) Then PictureBox1.Image = CType(iData.GetData(DataFormats.Bitmap), Image) Else End If でElseの方にいってしまっているみたいです。 ですが、確認したところ、クリップボードにはBitmapの画像はあるみたいです。 (プログラムが終了した後、ペイントに貼り付けてみました。) 環境は、VB2005、Excel2007です。 よろしくお願いします。 もし、動作確認できましたら、どこかにサンプルプログラムをUPしてもらえると非常に助かるのですが

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのようなデータがクリップボードに登録されているか確認して見ましょう dim ss as String for each ss in iData.GetFormats   Debug.WriteLine( ss ) Next といった具合で 取得可能なデータ形式を取得可能です VBでグラフを作成している部分のコードなどを投稿して見たほうがいいかもしれませんよ

sutoroma
質問者

お礼

ご回答ありがとうございます。 非常に参考になりました。で、クリップボードデータは、メタファイルでした。 そりゃできませんよね。 問題の方も解決でき無事表示されました。 ありがとう。

関連するQ&A

  • エクセルグラフがピクチャボックスに上手く表示しない

    vb.netにて。。。 excelのグラフをピクチャーボックスにて 表示するプログラムを組んでおります。 使用するexcelは、excel2007(.xlsx形式)とexcel2002(.xls形式)です。 パソコンによって、入っているexcelが違うので、 どちの形式でも実行できるようにしたいです。 (問題) 2007では、正規のものがちゃんと表示されますが、 2002では、グラフの1/4程度の部分しか表示されません。      'クリップボードを初期化 Clipboard.Clear()       'クリップボードにコピー Dim ChartSheet As Object Dim ChartSheets As Object = objWorkBook.Sheets Dim Chartobj As Object 'Dim ChartGraph As Object ChartSheet = objWorkBook.Sheets((exlsht)) Chartobj = ChartSheet.ChartObjects((exlgra)) Chartobj.CopyPicture(Appearance:=1, Format:=2) System.Threading.Thread.Sleep(2000) Application.DoEvents() '---------- クリップボード経由でPictureに貼り付け ------------------ If Clipboard.ContainsImage() Then 'クリップボードにあるデータの取得 Dim img As Image = Clipboard.GetImage() If img IsNot Nothing Then System.Threading.Thread.Sleep(2000) 'データが取得できたときは表示する Form_PictureBox.PictureBox1.AutoSize = True Form_PictureBox.PictureBox1.Image = img System.Threading.Thread.Sleep(2000) End If End exlshtは.xlsx形式か.xls型式かを選択したものが exlgraは”グラフ1”を指定します。 クリップブックを使用してみてみると、 その段階で1/4程度のものをコピーしています。 Chartobj.CopyPicture ではだめなのでしょうか? ちなみに、エクセルの参照をすると、 2002ではえらーになるので、 Object型式で呼び出しています。 非常に困っております。 よろしくご教授願います。

  • VB2005でクリップボードにコピー

    VB2005でPicture1のイメージをクリップボードにコピーし Picture2.imageにペーストすると Picture2の画面がすべてブルーになつてしまいます。 プログラムはサンプル(microsoft Document explorerから)をダウンロードしべつのプログラムに貼り付けただけなのですが。 'ピクチャをピクチャ ボックスからクリップボードにコピーします My.Computer.Clipboard.SetImage(PictureBox1.Image) 'クリップボードにイメージが存在する場合、そのイメージをピクチャ ボックスに貼り付けます If My.Computer.Clipboard.ContainsImage Then PictureBox2.Image = My.Computer.Clipboard.GetImage Else MsgBox("Clipboard does not contain an image", MsgBoxStyle.Exclamation And MsgBoxStyle.OKOnly) End If

  • pictureboxの画像を削除するには?

    Visual C# 2008を使用しています。 ボタンを押すとpictureboxに画像が表示されるプログラムを作成しました。 今度は、その表示された画像をクリックし、別のボタンを押すことでその画像が削除できるようにしたいと思っているのですが、うまくプログラムできません。 誰か教えていただけないでしょうか? ソースコードは以下のようになっています。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace algorithm { public partial class Form1 : Form { int space = 10; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void kihonsyori_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\基本処理箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 50; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void groupBox1_Enter(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } private void hanpuku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\反復箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sentaku_Click(object sender, EventArgs e) { if (this.pictureBox1.Image == null) { Bitmap img = new Bitmap(@"C:\Documents and Settings\admin\My Documents\Visual Studio 2008\Projects\algorithm\algorithm\picture\選択箱.png"); Graphics g = pictureBox1.CreateGraphics(); g.DrawImage(img, 0, space, 0.4F * img.Width, 0.3F * img.Height); space += 80; img.Dispose(); g.Dispose(); } else { this.pictureBox1.Image.Dispose(); this.pictureBox1.Image = null; } } private void sakujyo_Click(object sender, EventArgs e) { pictureBox1.Image = null; space = 0; } } }

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

  • VB.NETでのPictureBoxによる画像保存について

    またお世話になります。 VB.NETでプログラムでPictureBoxに絵を描かせているのですが、そこまでは表示させることができました。このできた画像をBitmapなりjpegなりに保存させて、ほかの画像ビューワ等でも見れる形にしたいのですがうまくいきません。 ちなみに今はこのように書いて、 Dim gra1 As Graphics = PictureBox1.CreateGraphics FileOpen(2, myfile2, OpenMode.Output) (絵を描かせるプログラム) PictureBox1.Image.Save(myfile2, System.Drawing.Imaging.ImageFormat.Bmp) FileClose(2) としてまわしたところ、 System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.drawing.dll で発生しました。 追加情報 : GDI+ で一般的なエラーが発生しました。 といわれました。 どなたかご教授いただけたらお願いしますm(__)m

  • VB.NET ピクチャーボックスのImageの一部をクリップボードにコピー

    Picturebox1.Image = New Bitmap(Picturebox1.Width, Picturebox1.Height) Dim g As Graphics = Graphics.FromImage(Picturebox1.Image) これ以降 g.DrawLine 等で描画を行っています そして、ピクチャーボックスの一部の領域(矩形)を指定して クリップボードにコピーしたいのですがどうしたらいいでしょうか よろしくお願いします 他のピクチャーボックスにその一部をコピーできるだけでもいいのですが

  • VB2010 でのPictureboxのフォント指定

    VB2010 でのPictureboxのフォント指定 現在 Pictureboxのフォントをプログラムの先頭で定義しているのですが、 '------------------------------------------------------------------------- Dim fnt As New Font("MS ゴシック", 9) With PictureBox1 .Image = New Bitmap(.Size.Width, .Size.Height) g1 = Graphics.FromImage(.Image) g1.Clear(.BackColor) End With g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) '------------------------------------------------------------------------- 下記のようにループ内で指定したいのですが、どう定義すればいいでしょうか。 For i=1 to 10 <------------------------ここでfont指定したい g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) next

  • VC++2008 で クリップボードの監視を行いたい

    いつもおせわになっております。 ただいま、Visual C++ 2008 Express Edition を使いまして、クリップボード拡張アプリを作っております。 実装したい機能として・・・  A.クリップボードにデータがコピーされる度に、クリップボードのデータを取得する。  B.ただし、クリップボード上のデータは消さない。 というものがあります。 この使用を実装するために、下記のようにデータ存在の有無をタイマーな どでポーリングすれば良いと考えました。 >IDataObject ^data = System::Windows::Forms::Clipboard::GetDataObject(); >pictureShowPicture->Image->Dispose(); >if(data->GetDataPresent(DataFormats::Bitmap) == true){ しかし、この方法だと、一回でもデータがクリップボードにコピーされると、その後もずっと「データが存在する」状態となってしまい、新しいデータが来たのかどうか判断が出来ません。 クリップボード上のデータを消せば、「データが存在しない」状態となり、次にデータがコピーされたことが分かるのですが、クリップボード上のデータは消さない実装としたいのです。 このため、下記のようにすれば問題が解決できると思いました。  1.何らかの方法でクリップボードにデータがコピーされたという通知を受け取る。  2.現在のデータが直前のデータと同じか異なるかを判断する。    (ポーリングしておいて、データが異なれば新規データと判断) 上記1,2について、実現方法をご存知の方は教えていただけませんでしょうか。 ちなみに、受け取りたいデータ形式は、ビットマップ形式画像およびテキスト形式です。 お忙しいところ恐縮ですが、よろしくお願いいたします。

  • VB.NET/PictureBoxのサイズ

    お世話になります。 VB.NETにて、アプリケーションの実行時にForm上のPictureBoxのサイズをマウスのドラッグで変更できるようにしたいのですが、そういったことは可能でしょうか? Windows標準のペイントの様に、境界線をドラッグしてサイズ変更する、といったイメージです。 開発環境はVB.NET 2003 です。

  • 【エクセルのマクロ】クリップボードのbitmapをフォームに表示させたい

    こんにちは! クリップボードにビットマップが入っていたとき、そのデータをフォームに表示させたりすることはできませんか?API関数にgetclipboarddata(cf_bitmap)というものがあり、これを使うことでデータは取得していると思うのですが、例えばImage1.Picture=GetClipBoardData(CF_BITMAP)というようにやっても〔オブジェクトが必要です〕というエラーが出てしまいます。 openclipboard(0)とかcloseclipboardとか、これらの宣言とか、概ね必要と思われるものはコードに組み込んであると思います。 正直申し上げて、完全な初心者です。どなたかお分かりになる方いらっしゃいますか? また、エクセルのグラフやシェイプをマクロを使い、bitmap形式で保存する方法はありませんか?VBの参考サイトで調べてみるとメタファイル形式で取得してやってらっしゃったのですが、エクセルのマクロではこれはできないでしょうか(自分が見たサイトではエクセルでサポートしていない関数を使っていました)? どなたか助けてください。よろしくお願いいたします。