アーリーバインドでグラフ

解決


 2010-01-13 20:04:12  No: 143063  IP: [192.*.*.*]

環境:VB.net2002
OS, XP

お忙しい中、すみません。
レイトバインドで、エクセルにグラフを書こうとしています。


        Dim xlApp As New Object()
        Dim xlBook As Object
        Dim xlSheet As Object
       
        xlApp = CreateObject("Excel.Application")
        xlBook = xlApp.Workbooks.Add
        xlSheet = xlBook.Worksheets("sheet1")



        Dim MyCharts As New Object()
        Dim MyChart As Object
        Dim MyChart1 As Object

        MyCharts = CreateObject("Excel.Chart")
        MyCharts = xlSheet.ChartObjects
        MyChart = MyCharts.Add(10, 90, 650, 500)

        Dim xlRange As Object
        xlRange = xlSheet.Range("A1:F6")
        MyChart1 = MyChart.Chart
      
        MyChart1.SetSourceData(xlRange, ???)

この行でつまずいています。
そもそも、MyCharts = CreateObject("Excel.Chart")から間違えているのでしょうか?

お忙しい中、誠にすみません、どうかご教授の程よろしくお願いします。

編集 削除
 2010-01-13 20:07:24  No: 143064  IP: [192.*.*.*]

やりたいのは、レイトバインドでグラフです!
タイトル間違えてしまいました。ごめんなさい。

編集 削除
特攻隊長まるるう  2010-01-14 10:49:24  No: 143065  IP: [192.*.*.*]

>環境:VB.net2002
大幅な仕様変更後の第一段ということで、あまり良い話を聞きません。
1年で VB.NET2003 が出ました。2002 を使い続けるのはお勧めできません。

レイトバインドでも COM の解放処理を入れないと Excel のプロセスが
残って、次に開いた Excel ファイルが正常に表示されないなどの
不具合が起こります。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm

また、xlApp を Workbooks.Add した時点で、必要なオブジェクトは
一式作られるので、参照するだけでいいです。New や CreateObject
を使うと、別のオブジェクトが生成され、解放漏れの原因になります。

VB.NET で Excel を扱う基礎を勉強されていないように見えますが、
レイトバインドを使う理由は何ですか?

編集 削除
 2010-01-14 12:24:54  No: 143066  IP: [192.*.*.*]

特攻隊長まるるう様、色々とご教授ありがとうございます。

レイトバインドを使う理由は、実行環境のパソコンが複数台ありまして、そこに入ってるExcelがExcel2000とExcel2002バージョンという事なんですけど、やっぱり無理でしょうか?

とりあえず、MyChartsのNewとCreateObjectをやめる件は了解しました。

自分でも色々頑張ってみますが、また他にヒントになるような事があれば、出来ればまたご教授下さいますようお願いします。

編集 削除
特攻隊長まるるう  2010-01-14 13:04:32  No: 143067  IP: [192.*.*.*]

Excel はバージョンによって仕様が違うから、レイトバインドにしたから何でもいいという
わけではなく、それぞれのバージョンでアーリーバインドの動作確認ができてる前提で
レイトバインドにしておけば実行時に対象のオブジェクトと結びつくから実行できると
いうに過ぎません。

VB.NET で Excel を扱う場合、そういった知識が必要とされます。
そのような事を1つ1つ掲示板で指摘する気はありませんので、自分で勉強して
ください。

        Dim xlApp As Object
        Dim xlBooks As Object
        Dim xlBook As Object
        Dim xlSheets As Object
        Dim xlSheet As Object

        xlApp = CreateObject("Excel.Application")
        xlApp.Visible = True
        xlBooks = xlApp.Workbooks
        xlBook = xlBooks.Add
        xlSheets = xlBook.Worksheets
        xlSheet = xlSheets.Item("Sheet1")

        Dim xlChartObjects As Object
        Dim xlChartObject As Object
        Dim xlChart As Object

        xlChartObjects = xlSheet.ChartObjects
        xlChartObject = xlChartObjects.Add(10, 90, 650, 500)
        xlChart = xlChartObject.Chart

        Dim xlRange As Object
        xlRange = xlSheet.Range("A1:F6")
        xlRange.Value = 1
        xlChart.SetSourceData(xlRange)

        'MRComObject については先リンク先参照。
        Call MRComObject(xlRange)
        Call MRComObject(xlChart)
        Call MRComObject(xlChartObject)
        Call MRComObject(xlChartObjects)
        Call MRComObject(xlSheet)
        Call MRComObject(xlSheets)
        Call MRComObject(xlBook)
        Call MRComObject(xlBooks)
        Call MRComObject(xlApp)

編集 削除
特攻隊長まるるう  2010-01-14 13:23:28  No: 143068  IP: [192.*.*.*]

定数はレイトバインドの場合、自分で宣言する必要があります。
定数の値は ExcelVBA のヘルプとか、アーリーバインドして
VB のオブジェクトブラウザで検索するとか。
http://hanatyan.sakura.ne.jp/dotnet/Excel03.htm#teisuu

編集 削除
 2010-01-14 14:11:01  No: 143069  IP: [192.*.*.*]

特攻隊長まるるう様、ご教授に感謝します。

とりあえず、アーリーバインドでは出来ましたが、レイトバインドへの書き換えで、つまずいている所です。
確かにおっしゃるとおり対象のオブジェクト(グラフの種類とかへの参照など)がイマイチ理解出来てないです。
ちょっと調べて頑張ってみます。

途中までサンプルまで書いて戴き、本当に有難うございます。

編集 削除
特攻隊長まるるう  2010-01-14 15:38:03  No: 143070  IP: [192.*.*.*]

> グラフの種類とかへの参照
引数で指定している xlColumns とか xlRows の事ではないの?
アーリーバインドのプログラムができているなら、そのまま
オブジェクトブラウザで定義を見れば分かると思うけど、定数だよ。
Excel のライブラリ(DLL)に定義されているから、レイトバインド
(参照設定を外した)時点で使えなくなります。

だから自分で定義すればいいだけですが。。。
Namespace Excel
    Public Enum XlRowCol
        xlRows = 1
        xlColumns = 2
    End Enum
End Namespace

↑のようにまとめておけばアーリーバインドのコードを
ほとんど修正せずに切り替えられますね。

編集 削除
 2010-01-14 17:09:08  No: 143071  IP: [192.*.*.*]

特攻隊長まるるうさま、何度もすみません、有難うございます。

お陰さまでずいぶん進みました、ほんと感謝です。
おっしゃる通りで自分で定義を全くしていませんでした。

後は、ピクチャーボックスにコピーするのと、目盛り間隔の設定だけになりました。
なんとか頑張ってみます。

編集 削除
 2010-01-14 21:08:39  No: 143072  IP: [192.*.*.*]

特攻隊長まるるうさま、感謝です。

お陰さまで今無事解決、エクセルにグラフを描き、ピクチャーボックスにコピーまで出来ました。

ヘルプはもちろん、教えて戴いた花ちゃんさんのサイトや、組込み定数のサイト(http://park18.wakwak.com/~achiwa/magic/tips/08ox/002.html)、グラフ種類設定用定数のサイト(http://www.nurs.or.jp/~ppoy/access/excel/xlA021.html)をあちこち調べました。

非常に分かりやすくサンプルを書いて戴いたり、定義のやり方までご教授くださり大変助かりました。

これで解決とさせて戴きます、ありがとうございました!

編集 削除