- あるけみすと
- 会議室デビュー日: 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
プログラムからエクセルプロセスは解放されているが、終了はしていないような気がする?
# と、指摘されたような気がする
|