環境: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")から間違えているのでしょうか?
お忙しい中、誠にすみません、どうかご教授の程よろしくお願いします。
やりたいのは、レイトバインドでグラフです!
タイトル間違えてしまいました。ごめんなさい。
>環境: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 を扱う基礎を勉強されていないように見えますが、
レイトバインドを使う理由は何ですか?
特攻隊長まるるう様、色々とご教授ありがとうございます。
レイトバインドを使う理由は、実行環境のパソコンが複数台ありまして、そこに入ってるExcelがExcel2000とExcel2002バージョンという事なんですけど、やっぱり無理でしょうか?
とりあえず、MyChartsのNewとCreateObjectをやめる件は了解しました。
自分でも色々頑張ってみますが、また他にヒントになるような事があれば、出来ればまたご教授下さいますようお願いします。
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)
定数はレイトバインドの場合、自分で宣言する必要があります。
定数の値は ExcelVBA のヘルプとか、アーリーバインドして
VB のオブジェクトブラウザで検索するとか。
http://hanatyan.sakura.ne.jp/dotnet/Excel03.htm#teisuu
特攻隊長まるるう様、ご教授に感謝します。
とりあえず、アーリーバインドでは出来ましたが、レイトバインドへの書き換えで、つまずいている所です。
確かにおっしゃるとおり対象のオブジェクト(グラフの種類とかへの参照など)がイマイチ理解出来てないです。
ちょっと調べて頑張ってみます。
途中までサンプルまで書いて戴き、本当に有難うございます。
> グラフの種類とかへの参照
引数で指定している xlColumns とか xlRows の事ではないの?
アーリーバインドのプログラムができているなら、そのまま
オブジェクトブラウザで定義を見れば分かると思うけど、定数だよ。
Excel のライブラリ(DLL)に定義されているから、レイトバインド
(参照設定を外した)時点で使えなくなります。
だから自分で定義すればいいだけですが。。。
Namespace Excel
Public Enum XlRowCol
xlRows = 1
xlColumns = 2
End Enum
End Namespace
↑のようにまとめておけばアーリーバインドのコードを
ほとんど修正せずに切り替えられますね。
特攻隊長まるるうさま、何度もすみません、有難うございます。
お陰さまでずいぶん進みました、ほんと感謝です。
おっしゃる通りで自分で定義を全くしていませんでした。
後は、ピクチャーボックスにコピーするのと、目盛り間隔の設定だけになりました。
なんとか頑張ってみます。
特攻隊長まるるうさま、感謝です。
お陰さまで今無事解決、エクセルにグラフを描き、ピクチャーボックスにコピーまで出来ました。
ヘルプはもちろん、教えて戴いた花ちゃんさんのサイトや、組込み定数のサイト(http://park18.wakwak.com/~achiwa/magic/tips/08ox/002.html)、グラフ種類設定用定数のサイト(http://www.nurs.or.jp/~ppoy/access/excel/xlA021.html)をあちこち調べました。
非常に分かりやすくサンプルを書いて戴いたり、定義のやり方までご教授くださり大変助かりました。
これで解決とさせて戴きます、ありがとうございました!