5.Excel のグラフをクリップボード経由で PictureBox に貼付(09_Xls_05) (旧、SampleNo.065) |
1.Excel のグラフをクリップボード経由で PictureBox に貼付 2. 3. 4. 5. 6. ※ 起動及び終了処理及び使用関数等の記載が漏れていたらExcel 操作ワンポイントテクニック集その1(09_Xls_02)の方をご覧下さい。 |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 / Excel 2013 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :Microsoft.Office.Interop 参照設定:Microsoft Excel 15.0 Object Library / WaitTime.dll 参照設定方法参照 使用コン:Button1 PictureBox1 トロール: このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.Excel のグラフをクリップボード経由で PictureBox に貼付 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call ExcelOpen("", "") '新規ファイルをオープンして、Excel を起動 '============================================================================= '---------------- グラフデータを作成及びセルに値を代入 ---------------- 'Excel のセルに値を代入します。 Dim i, j As Integer Dim xlRange1 As Excel.Range = Nothing '科目用 Dim xlRange2 As Excel.Range = Nothing '氏名用 Dim xlRange3 As Excel.Range = Nothing '点数用 Dim graphData1(4, 0) As String '科目用 Dim graphData2(0, 4) As String '氏名用 Dim graphData3(4, 4) As Integer '点数用 xlRange1 = xlSheet.Range("A2:A6") xlRange2 = xlSheet.Range("B1:F1") xlRange3 = xlSheet.Range("B2:F6") For i = 0 To 4 For j = 0 To 4 '30 〜100 の範囲のランダムなデータを作成 graphData3(j, i) = CInt(70 * Rnd() + 31) Next j Next i '系列名の設定 graphData1(0, 0) = "国語" graphData1(1, 0) = "数学" graphData1(2, 0) = "英語" graphData1(3, 0) = "社会" graphData1(4, 0) = "体育" ''項目名の設定 graphData2(0, 0) = "石原" graphData2(0, 1) = "小泉" graphData2(0, 2) = "田中" graphData2(0, 3) = "平沼" graphData2(0, 4) = "森山" 'セルに各データを設定 xlRange1.Value = graphData1 xlRange2.Value = graphData2 xlRange3.Value = graphData3 MRComObject(xlRange1) '使い終わった時点で直ぐにデクリメントをしておく MRComObject(xlRange2) MRComObject(xlRange3) '=============== グラフの表示設定 ======================= Dim xlCharts As Excel.ChartObjects Dim xlChart As Excel.ChartObject Dim xlChart1 As Excel.Chart '表示位置・グラフの大きさを指定して新しい埋め込みグラフを作成 xlCharts = DirectCast(xlSheet.ChartObjects, Excel.ChartObjects) xlChart = xlCharts.Add(10, 90, 550, 300) Dim xlRange As Excel.Range xlRange = xlSheet.Range("A1:F6") 'データの入力セル範囲 xlChart1 = xlChart.Chart With xlChart1 '系列を列に変更 行は xlRows .SetSourceData(xlRange, Excel.XlRowCol.xlColumns) MRComObject(xlRange) 'xlRange の解放 ''縦棒グラフを指定 .ChartType = Excel.XlChartType.xlColumnClustered ''グラフのタイトルを表示 .HasTitle = True Dim xlChartTitle As Excel.ChartTitle xlChartTitle = .ChartTitle xlChartTitle.Text = "中間テスト結果" MRComObject(xlChartTitle) 'xlChartTitle の解放 ''目盛りの設定 Dim xlAxes As Excel.Axes Dim xlAxis As Excel.Axis xlAxes = DirectCast(xlChart1.Axes, Excel.Axes) xlAxis = xlAxes.Item(Excel.XlAxisType.xlValue) '-------------------------------------------------------------- 'データラベルの表示(すべて表示の場合) .ApplyDataLabels(Excel.XlDataLabelsType.xlDataLabelsShowValue) '個別に表示する場合 Dim xlSeries As Excel.Series xlSeries = DirectCast(.SeriesCollection(1), Excel.Series) xlSeries.ApplyDataLabels(Excel.XlDataLabelsType.xlDataLabelsShowValue) MRComObject(xlSeries) '-------------------------------------------------------------- With xlAxis .MajorUnit = 20 '目盛り間隔 .MaximumScale = 120 '目盛りの最大値 End With MRComObject(xlAxis) MRComObject(xlAxes) '作業中のシートにグラフを表示する場合 Dim xlChart2 As Excel.Chart xlChart2 = .Location(Excel.XlChartLocation.xlLocationAsObject, xlSheet.Name) MRComObject(xlChart2) End With '----------------------------------------------------------------------------------------------- '※ Excelのグラフをクリップボード経由でPictureBoxに貼付 のコードはここへ追加する '=========================== ここからが追加分 ============================= Dim xlVersion As Excel.Application xlVersion = xlApp.Application '起動中(使用中)のExcel のバージョンを取得 If CDbl(xlVersion.Version) >= 12 Then 'Excel 2007/Excel 2010 /Excel 2013 の場合 '-------------------------------------------------------------------------- '★ このグラフをファイルに保存する場合 xlChart1.Export(Filename:=Application.StartupPath & "\test.GIF", FilterName:="GIF") '--------------------------------------------------------------------------- '画像ファイルを読み込み表示(ファイルのサイズで) 'With PictureBox1 ' '表示する画像のサイズに合わせてPictureBoxを表示します ' .SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize ' '画像ファイルを読み込みPictureBoxに表示 ' .Image = System.Drawing.Image.FromFile(Application.StartupPath & "\test.GIF") 'End With '上記のような方法で読み込むと、再度実行するとファイルがロックされているので 'エラーとなるので、必要により下記のように読み込み表示して下さい。 'FileStream オブジェクトを使用して読み込み表示するとロックされません。 '(使用中でも、test001.GIF を上書き、削除等してもエラーとならない。) Using fs As System.IO.FileStream = New System.IO.FileStream(Application.StartupPath & _ "\test.GIF", System.IO.FileMode.Open, System.IO.FileAccess.Read) 'グラフを PictureBox のサイズに合わせて拡大・縮小表示 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage 'PictureBox1に保存した画像を表示 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 'グラフを PictureBox のサイズに合わせて拡大・縮小表示 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage 'PictureBox1にクリップボードの画像を貼り付け PictureBox1.Image = DirectCast(iData.GetData(DataFormats.Bitmap), Image) End If End If MRComObject(xlVersion) '=========================== ここまで ======================================= '----------------------------------------------------------------------------------------------- MRComObject(xlChart1) MRComObject(xlChart) MRComObject(xlCharts) '============================================================================= 'Excelファイルを上書き保存(True 又省略すれば)して終了処理を実行 Call ExcelClose(IO.Path.GetFullPath(".\Test.xlsx"), False) 'False の場合保存しないで終了 'Excel.EXE がタスクマネージャーに残っていないか調査(実使用時は必要なし) WT.WaitTime(1000) Call ProcessCheck() End Sub |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |