タイトル | : Re: VB2005とエクセルの文法の違い |
記事No | : 6617 |
投稿日 | : 2007/12/06(Thu) 16:27 |
投稿者 | : YuO |
> VBAとVB2005では多少文法が変わるのでしょうか? > それとも全く別の所が問題なのか..
別物と考えた方がよいです。 特に,ExcelをCOMで扱うのは変更が面倒な部類に入ります。
Excel VBAはExcelの内部で動作していますが, VB2005で(VSTOを使わずに)Excelを操作する場合, そのコードはExcelを外部から操作することになります。
そのため,Marshal.ReleaseComObjectを適切なタイミングで呼び出す必要があるなど, 大量の変更を行う必要があります。 # MSのKBのコードですら問題が指摘されていたりします。
> ちなみにマクロでは以下のような記述です。 > ActiveChart.SeriesCollection(1).Select > ActiveChart.SeriesCollection(1).Trendlines.Add(Type:=xlPolynomial, Order:=3 _ > , Forward:=0, Backward:=0, DisplayEquation:=False, DisplayRSquared:= _ > False).Select
これだけだと, Imports System.Runtime.InteropServices Imports Microsoft.Office.Interop.Excel
Dim chartObject As Chart Dim seriesCollectionObject As SeriesCollection Dim seriesObject As Series Dim trendlinesObject As Trendlines Dim trendlineObject As Trendline
Try chartObject = book.ActiveChart ' bookはWorkbookのインスタンス seriesCollectionObject = _ TryCast(chartObject.SeriesCollection(), SeriesCollection) seriesObject = seriesCollectionObject.Item(1) seriesObject.Select()
trendlinesObject = TryCast(seriesObject.TrendLines(), Trendlines) trendlineObject = trendlinesObject.Add( ... ) trendlineObject.Select() Finally If Not trendlineObject Is Nothing Then Marshal.ReleaseComObject(trendlineObject) End If If Not trendlinesObject Is Nothing Then Marshal.ReleaseComObject(trendlinesObject) End If If Not seriesObject Is Nothing Then Marshal.ReleaseComObject(seriesObject) End If If Not seriesCollectionObject Is Nothing Then Marshal.ReleaseComObject(seriesCollectionObject) End If If Not chartObject Is Nothing Then Marshal.ReleaseComObject(chartObject) End If End Try といった感じでしょうか。 # 動作確認はしていません。
|