@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VB.NET から EXCELオブジェクトの操作

投稿者投稿内容
あるけみすと
会議室デビュー日: 2006/03/14
投稿数: 7
お住まい・勤務地: 兵庫県神戸市
投稿日時: 2006-03-14 16:02
WindowsXP(Pro) + Office2000(EXCEL) + VB.Net(2003)

始めまして。
あるシートから別のシートに作成されたグラフの一部だけを参照するオブジェクトを
作成したいのですが、かなり悩んでおります。

@EXCELで、シートを2枚用意し、シート2に $A$1:$H$30 の範囲の大きさでグラフを
 作成する
Aシート1にImageコントロールを貼り付ける。
B貼り付けたイメージを選択した状態で、数式を以下のように編集する
 変更前: =EMBED("Forms.Image.1","")
 変更後: =シート2!$A$1:$D$20

 これで、シート2にあるグラフの1部がシート1のImage1に表示される

--------------------------------------------------------------------
上記手順1のグラフを埋め込んだファイルが存在するものとし、EXCELファイルを
オープンし、手順A〜Bを自動化するアプリケーションを作成したいのですが、
どうもうまくいきません。

アプリケーションの作成方法として、エクセルでマクロを記録し、それをVB.NET
へ移植しています。

☆エクセルで記録したマクロ
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
DisplayAsIcon:=False, Left:=0.75, Top:=0.75, Width:=383.25, Height:= _
347.25).Select
Selection.Formula = "入力データ!$H$43:$BX$76"

☆VB.NET
objOLEObjects = mobjSht.OLEObjects
objOLEObject = objOLEObjects.Add(ClassType:="Forms.Image.1")
objOLEObject.Name = "TEST"
objShapes = objSht.Shapes
objShape = objShapes.item("TEST")
objShape.Select()

??????

--------------------------------------------------------------------

?????? は VBAの Selection.Formula にあたる部分です。
色々と試してみましたがうまくいきません。
どのたか知恵をお貸しください。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-14 17:02
引用:

あるけみすとさんの書き込み (2006-03-14 16:02) より:

?????? は VBAの Selection.Formula にあたる部分です。
色々と試してみましたがうまくいきません。


いろいろ試したことを示してくれないと、重複したことを提案されるかもしれませんよ?

objShape.Fomula は、ないのかな?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 18:00
引用:

あるけみすとさんの書き込み (2006-03-14 16:02) より:

?????? は VBAの Selection.Formula にあたる部分です。
色々と試してみましたがうまくいきません。


Excel.Application の Selection プロパティの参照を取り、
遅延バインディングで Formula を設定できませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あるけみすと
会議室デビュー日: 2006/03/14
投稿数: 7
お住まい・勤務地: 兵庫県神戸市
投稿日時: 2006-03-14 19:28
引用:

じゃんぬねっとさんの書き込み (2006-03-14 18:00) より:
引用:

あるけみすとさんの書き込み (2006-03-14 16:02) より:

?????? は VBAの Selection.Formula にあたる部分です。
色々と試してみましたがうまくいきません。



Excel.Application の Selection プロパティの参照を取り、
遅延バインディングで Formula を設定できませんか?



じゃんぬねっとさん、Jittaさん、ありがとうございます。
すみません、試したことが多すぎたもので、書き込みの手を
抜いてしまいました。

今、出先で確認できないのですが、objShape.Formula は無かったような…

objApp = Excel.Application (アプリケーションの最初で)
objApp.Selection.Formula = "〜"
試した時は、エラーは出ないもののグラフは出ませんでした。
(最新の状態にするみたいなことが必要なんでしょうか…)

帰ったらもう一度試してみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-14 19:46
引用:

あるけみすとさんの書き込み (2006-03-14 19:28) より:

今、出先で確認できないのですが、objShape.Formula は無かったような…


はい、隠しメンバにもないですね。

引用:

objApp = Excel.Application (アプリケーションの最初で)
objApp.Selection.Formula = "〜"
試した時は、エラーは出ないもののグラフは出ませんでした。


まずは、Selection 自体が取れているか確認すべきだと思います。(暗黙の参照で危険という意味も有)
その次に遅延バインディングによる Formula の設定が本当に反映されているか、
式ウォッチで見てください。(これも暗黙の参照になりますのでご注意ください)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あるけみすと
会議室デビュー日: 2006/03/14
投稿数: 7
お住まい・勤務地: 兵庫県神戸市
投稿日時: 2006-03-15 09:09
引用:

まずは、Selection 自体が取れているか確認すべきだと思います。(暗黙の参照で危険という意味も有)
その次に遅延バインディングによる Formula の設定が本当に反映されているか、
式ウォッチで見てください。(これも暗黙の参照になりますのでご注意ください)




じゃんぬねっとさん、ありがとうございます。
昨日、内部で使用しているオブジェクトをウォッチしてみたところ、じゃんぬさん
の指摘どおり、Selection 自体が取れていませんでした。
当然のことなのですが、Formula も設定されていません。
(今となっては何の Formula を設定していたのか…)

そこで、以下のコードを追加したところ Selection は取れるようになったのです
が、今度は Formula 設定がうまくいきません(エラーで落ちる)

---- 追加したコード
objOLEObject.Activate()
objSelection = objOLEObject.Select()

あとは式を設定するだけですが、Formula がどこにあるか見当がつかないまま、
昨日は時間切れになりました。

また何か進展があれば書込みします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-15 10:31
引用:

あるけみすとさんの書き込み (2006-03-15 09:09) より:

じゃんぬねっとさん、ありがとうございます。
昨日、内部で使用しているオブジェクトをウォッチしてみたところ、
じゃんぬさんの指摘どおり、Selection 自体が取れていませんでした。


私のコードでは取得できました。
そして、Formula も変更できました。

とりあえず、遅延バインディング Ver のコードです。
(COM 参照の解放を保証している ので、コードが見にくいですが)

コード:

    Private Shared Sub MosaMosaAA(ByVal workBookPath As String)
        Dim xlApplication As Excel.Application

        Try
            xlApplication = New Excel.Application()
            xlApplication.Visible = True

            Dim xlWorkBooks As Excel.Workbooks

            Try
                xlWorkBooks = xlApplication.Workbooks
                Dim xlWorkBook As Excel.Workbook

                Try
                    xlWorkBook = xlWorkBooks.Add(workBookPath)
                    Dim xlWorkSheets As Excel.Sheets

                    Try
                        xlWorkSheets = xlWorkBook.Worksheets
                        Dim xlSheet1 As Excel.Worksheet

                        Try
                            xlSheet1 = DirectCast(xlWorkSheets("Sheet1"), Excel.Worksheet)
                            Dim xlShapes As Excel.Shapes

                            Try
                                xlShapes = xlSheet1.Shapes
                                Dim xlImageShape As Excel.Shape

                                Try
                                    xlImageShape = xlShapes.Item("Image1")
                                    xlImageShape.Select()
                                    Dim xlSelection As Object

                                    Try
                                        xlSelection = xlApplication.Selection

                                        If Not xlSelection Is Nothing Then
                                            xlSelection.Formula = "Sheet2!$H:$BX"
                                        End If
                                    Finally
                                        If Not xlSelection Is Nothing Then
                                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSelection)
                                        End If
                                    End Try
                                Finally
                                    If Not xlImageShape Is Nothing Then
                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlImageShape)
                                    End If
                                End Try
                            Finally
                                If Not xlShapes Is Nothing Then
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlShapes)
                                End If
                            End Try
                        Finally
                            If Not xlSheet1 Is Nothing Then
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet1)
                            End If
                        End Try
                    Finally
                        If Not xlWorkSheets Is Nothing Then
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheets)
                        End If
                    End Try
                Finally
                    If Not xlWorkBook Is Nothing Then
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
                    End If
                End Try
            Finally
                If Not xlWorkBooks Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBooks)
                End If
            End Try
        Finally
            If Not xlApplication Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
            End If
        End Try
    End Sub


最近 COM Interop 系ばかり回答しているような気がする...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-15 21:12
 プログラムからエクセルプロセスは解放されているが、終了はしていないような気がする?
# と、指摘されたような気がする

スキルアップ/キャリアアップ(JOB@IT)