[リストへもどる]
一括表示

投稿時間:2004/02/04(Wed) 17:57
投稿者名:Rs
URL :
タイトル:
VBからExcelのグラフをPictureBoxに表示
はじめましてRsという者です。
最近VBを仕事で始めまして、データの検索機能のプログラムを組んでいます。
VBからExcelのグラフをPictureBoxに表示するコードを組んでみたのですがうまくいきません。
ここのHPを参考にさせてもらいまして作ってみたのですが・・・。
以下コードを載せます。

'★プロジェクト→参照設定でMicrosoft Excel *.* ObjectLibraryに
'チェックを入れておいて下さい。
    On Error Resume Next

    'オブジェクトへの参照を格納する変数を宣言(事前バインディング)
    '事前バインディングを使用すると、プロパティの値を設定または取得
    'するのに必要な時間を大幅に短縮できます
    Dim xlApp   As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

    ' 変数にオブジェクトの参照を代入します。Add メソッドを使って
    ' 新規 workbookとworksheet オブジェクトを作成します。
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets(1)

    'エクセルを表示します。(表示しなくてもOK)
    'xlApp.Visible = True

    ' Excel のセルに値を代入します。
    For a = 1 To 36
        
        If a < 13 Then
            xlSheet.Cells(1, a).Value = lblUri(a - 1).Caption
        ElseIf a < 25 Then
            xlSheet.Cells(2, a - 12).Value = lblUri(a - 1).Caption
        Else
            xlSheet.Cells(3, a - 24).Value = lblUri(a - 1).Caption
        End If
        
    Next a

    'グラフを作成する
    Charts.Add
    ActiveChart.ChartType = xlLine
    ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1")
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R1C12"
    ActiveChart.SeriesCollection(1).Name = "=""2002年度"""
    ActiveChart.SeriesCollection(2).Values = "=Sheet1!R2C1:R2C12"
    ActiveChart.SeriesCollection(2).Name = "=""2003年度"""
    ActiveChart.SeriesCollection(3).Values = "=Sheet1!R3C1:R3C12"
    ActiveChart.SeriesCollection(3).Name = "=""2004年度"""
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
    With ActiveChart.Axes(xlCategory)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    With ActiveChart.Axes(xlValue)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    ActiveChart.HasDataTable = False

    'クリップボードを初期化
    Clipboard.Clear
    'クリップボードにコピー
    Set xlSheet = xlBook.Worksheets(1)
    xlSheet.ChartObjects("グラフ 1").Copy

'------- Excelの終了処理 -----------------
    xlApp.DisplayAlerts = False
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
'-------------------------------------------
'---------- クリップボード経由でPictureに貼り付け ------------------
    'クリップボードにメタファイルが入っているかチェック
    If Clipboard.GetFormat(vbCFMetafile) Then
        'メタファイルならピクチャーコントロールに貼り付け
        Set Picture1.Picture = Clipboard.GetData()
    End If

ほとんどがここのHPのコピーなんですが^^;
以上のコードでやってみたところ、一回目に通った場合グラフが表示されるのですが
2回目に通した時にグラフが表示されません。
「クリップボードにメタファイルが入っているかチェック」の場所から2回目の場合
Set Picture1.Picture = Clipboard.GetData()の部分のコードを通りません。
「グラフを作成する」の部分はExcelのマクロを記録し、コードを貼り付けたものです。
ものすごくわかり辛いかも知れませんが、原因と対策をご教授頂きたいのですが、宜しく
お願いします。

投稿時間:2004/02/05(Thu) 13:50
投稿者名:ak
Eメール:
URL :
タイトル:
Re: VBからExcelのグラフをPictureBoxに表示
下記サンプルを試してみてください

Private Sub Command1_Click()
    Dim xlApp   As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    
    Picture1.Picture = LoadPicture()
    
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets(1)

    For a = 1 To 36
        
        If a < 13 Then
            xlSheet.Cells(1, a).Value = lblUri(a - 1).Caption
        ElseIf a < 25 Then
            xlSheet.Cells(2, a - 12).Value = lblUri(a - 1).Caption
        Else
            xlSheet.Cells(3, a - 24).Value = lblUri(a - 1).Caption
        End If
        
    Next a

    With xlBook.Charts.Add
        .Name = "グラフ1"
        .ChartType = xlLine
        .SetSourceData Source:=xlBook.Sheets(xlSheet.Name).Range("A1")
        .SeriesCollection(1).Values = "=" & xlSheet.Name & "!R1C1:R1C12"
        .SeriesCollection(1).Name = "=""2002年度"""
        .SeriesCollection.NewSeries
        .SeriesCollection(2).Values = "=" & xlSheet.Name & "!R2C1:R2C12"
        .SeriesCollection(2).Name = "=""2003年度"""
        .SeriesCollection.NewSeries
        .SeriesCollection(3).Values = "=" & xlSheet.Name & "!R3C1:R3C12"
        .SeriesCollection(3).Name = "=""2004年度"""
        With .Axes(xlCategory)
            .HasMajorGridlines = True
            .HasMinorGridlines = False
        End With
        With .Axes(xlValue)
            .HasMajorGridlines = True
            .HasMinorGridlines = False
        End With
        .HasDataTable = False
        Clipboard.Clear
        .CopyPicture
        If Clipboard.GetFormat(vbCFMetafile) Then
            Set Picture1.Picture = Clipboard.GetData()
        End If
    End With

    xlApp.DisplayAlerts = False
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

End Sub

追記
>On Error Resume Next
エラーを流すのはやめましょう。
Rsさんのサンプルでエラーが発生していました。
これをコメントアウトすればエラー箇所が直ぐ分かるはずです。
よほどのことが無い限り「On Error Resume Next」使用すべきでないと
思います。バグのもとです。

投稿時間:2004/02/05(Thu) 17:47
投稿者名:Rs
URL :
タイトル:
Re^2: VBからExcelのグラフをPictureBoxに表示
レスありがとうございます。
サンプルコードの方早速試してみたのですが、実行時エラーの1004
「ChartクラスのSeriesCollectionプロパティを取得できません。」というエラーが出てしまいます。
Form_Load()などでも使用しているのですが、その辺関係ありますかね?
とりあえず自分も原因を探してみます。

投稿時間:2004/02/06(Fri) 10:05
投稿者名:ak
Eメール:
URL :
タイトル:
Re^3: VBからExcelのグラフをPictureBoxに表示
> レスありがとうございます。
> サンプルコードの方早速試してみたのですが、実行時エラーの1004
> 「ChartクラスのSeriesCollectionプロパティを取得できません。」というエラーが出てしまいます。
> Form_Load()などでも使用しているのですが、その辺関係ありますかね?
> とりあえず自分も原因を探してみます。

こちらの環境(VB6SP5,Excel2000)では問題なく動きます。
「Microsoft Excel X.X Object Library」を参照設定してますよね?
フォームにCommandButton,PictureBoxを1つずつ配置し、ソースはその
ままコピーして試してみてください。

投稿時間:2004/02/06(Fri) 10:25
投稿者名:Rs
URL :
タイトル:
Re^4: VBからExcelのグラフをPictureBoxに表示
> こちらの環境(VB6SP5,Excel2000)では問題なく動きます。
> 「Microsoft Excel X.X Object Library」を参照設定してますよね?
> フォームにCommandButton,PictureBoxを1つずつ配置し、ソースはその
> ままコピーして試してみてください。

レスありがとうございます。
「Microsoft Excel X.X Object Library」は参照設定しています。
試しに新しいプロジェクトでCommandButton,PictureBoxを1つずつ配置し
For文の部分

    For a = 1 To 36
        If a < 13 Then
            xlSheet.Cells(1, a).Value = lblUri(a - 1).Caption
        ElseIf a < 25 Then
            xlSheet.Cells(2, a - 12).Value = lblUri(a - 1).Caption
        Else
            xlSheet.Cells(3, a - 24).Value = lblUri(a - 1).Caption
        End If
    Next a

を削って試みましたが、やはり同じエラーが出てしまいます。
環境はVB5.0,Excel2000です。

投稿時間:2004/02/06(Fri) 11:19
投稿者名:ak
Eメール:
URL :
タイトル:
Re^5: VBからExcelのグラフをPictureBoxに表示
> > こちらの環境(VB6SP5,Excel2000)では問題なく動きます。
> > 「Microsoft Excel X.X Object Library」を参照設定してますよね?
> > フォームにCommandButton,PictureBoxを1つずつ配置し、ソースはその
> > ままコピーして試してみてください。
>
> レスありがとうございます。
> 「Microsoft Excel X.X Object Library」は参照設定しています。
> 試しに新しいプロジェクトでCommandButton,PictureBoxを1つずつ配置し
> For文の部分
>
>     For a = 1 To 36
>         If a < 13 Then
>             xlSheet.Cells(1, a).Value = lblUri(a - 1).Caption
>         ElseIf a < 25 Then
>             xlSheet.Cells(2, a - 12).Value = lblUri(a - 1).Caption
>         Else
>             xlSheet.Cells(3, a - 24).Value = lblUri(a - 1).Caption
>         End If
>     Next a
>
> を削って試みましたが、やはり同じエラーが出てしまいます。
> 環境はVB5.0,Excel2000です。

lblUri(a - 1).Caption を 変数aに変えて実行してみてください。

xlSheet.Cells(1, a).Value = lblUri(a - 1).Caption
          ↓
xlSheet.Cells(1, a).Value = a

恐らくデータ参照する範囲にデータが無い為エラーになっているような気がします。

投稿時間:2004/02/06(Fri) 15:13
投稿者名:Rs
URL :
タイトル:
解決しました!!akさんThx!!
レスありがとうございます。
指摘通りやってみましたところ正常にグラフが表示されました。
akさん何度もお付き合い頂いてありがとうございます。
これを参考に目的の物を作りたいと思います。
またよろしくお願いします。