VBからExcelに画像させるには?

解決


RIch  2008-03-06 12:49:06  No: 100395  IP: 192.*.*.*

VB6.0のフォームを使ってExcelのフォーマットへ記入するプログラムを作っています。
ExcelにImageコントロールを配置し、そこにVBにある画像を表示させたいのですが、どうやっても出来ません;;

Image1はExcelに配置したイメージコントロール名です。

Sht.Image1.Select
Sht.OLEObjects("Image1").Object.Picture = LoadPicture(イメージパス)

2行目でエラーが発生します。

どうしたらImageコントロールに収まるのかご指導お願いします。

編集 削除
魔界の仮面弁士  2008-03-06 13:37:52  No: 100396  IP: 192.*.*.*

1 行目のコードは、何のために置いてあるのでしょうか?
コントロールを操作する前に、わざわざ Select する必要は無いですよね。

で、本題ですが:
LoadPicture は、(VB6側ではなく)Excel 側で行う必要があります。
(Excel に限らず、VB6 EXE → VB6 ActiveX EXE の場合も NG だったような…?)

この場合は、LoadPicture を行うプロシージャを Excel VBA で記述し、
それを VB6 側から、Run メソッドで呼び出すようにしてみてください。

編集 削除
RIch  2008-03-06 15:04:37  No: 100397  IP: 192.*.*.*

某サイトで下記のプロシャージャがあったので実行してみました。
Public Sub SetPicture(PicFile As String)
    With Sheet1.Image1
        .AutoSize = True
        .Picture = LoadPicture(PicFile)
    End With
End Sub

VBでは、

xlApp.Run "SetPicture", イメージパス

とやったのですが、やはりエラーになり出来ません。

編集 削除
魔界の仮面弁士  2008-03-06 15:14:23  No: 100398  IP: 192.*.*.*

> 某サイトで
なぜ、その具体的な URL を隠すのでしょうか? (失念したとか?)

> 下記のプロシャージャがあったので
引用元が無いので、下手すると無断転載だと言われかねないような…。

> 実行してみました。
そのプロシージャを、(VB6からではなく)Excel 側から正しく呼べましたか?

編集 削除
RIch  2008-03-06 15:27:27  No: 100399  IP: 192.*.*.*

>なぜ、その具体的な URL を隠すのでしょうか? (失念したとか?)
サイト名を出していいものかどうか分からなかったので…。
すみません。
>そのプロシージャを、(VB6からではなく)Excel 側から正しく呼べましたか?
ExcelからCallしてみましたが、同じプロシージャではないと呼べませんでした。

編集 削除
RIch  URL  2008-03-06 15:47:14  No: 100400  IP: 192.*.*.*

魔界の仮面弁士さんのおっしゃった通り、相互にリンクを貼りました。
投稿者は同一人物ではなく、一緒に考えている友達です。
まとまりがなくてすみません…。

編集 削除
魔界の仮面弁士  2008-03-06 16:08:24  No: 100401  IP: 192.*.*.*

> サイト名を出していいものかどうか分からなかったので…。
# サイト名も出さずに無断転載する方が、問題あるような気も。(^^;


で、そのサイトには、そのコードをどこに書くべきか、とか、
どのバージョンの Excel だと可能/不可能といった追加情報がありませんでしたか?

同じページ内に記載されているか、それとも、別ページに記載されているのか
あるいは、追加情報が無いのかは、URL が不明なのでわかりませんが…。


> ExcelからCallしてみましたが、同じプロシージャではないと呼べませんでした。
? 「同じプロシージャではない」というのは、どういう状況の事でしょうか?



とりあえずこちらで、その Image1  貼ったブック("C:\book1.xls")の標準モジュールに
  Public Sub SetPicture(ByVal Target As MSForms.Image, ByVal PicFile As String)
    Set Target.Picture = LoadPicture(PicFile)
  End Sub
というコードを書いて、VB6 側から
  oExcelApp.Run  "SetPicture", Sht.OLEObjects("Image1").object, "C:\image.jpg"
というコードを書いたら、画像が表示されましたよ。


Dim oExcelApp As Object
Set oExcelApp = CreateObject("Excel.application")
oExcelApp.Visible = True

Dim oBook As Object
Set oBook = oExcelApp.workbooks.open("C:\book1.xls")

Dim Sht As Object
Set Sht = oBook.Sheets(1)

oExcelApp.Run "SetPicture", Sht.OLEObjects("Image1").object, "C:\image_01.jpg"

編集 削除
魔界の仮面弁士  2008-03-06 16:17:58  No: 100402  IP: 192.*.*.*

> 魔界の仮面弁士さんのおっしゃった通り、相互にリンクを貼りました。

[ホームページアドレス]欄って、投稿者自身のサイトを書く場所では
無いのかな…。まぁ良いですけど。


それはそうと、それぞれの掲示板に投稿する前には、ローカルルールにも
必ず目を通しておきましょう。

そのリンク先(モーグ)の掲示板の利用規約には、複数掲示板への投稿(マルチポスト)を、
『マナー違反ですのでやめましょう』と、書かれていますよね。

# ここのサイトや bbs.wankuma.com 等では許容されていますが…。

編集 削除
RIch  2008-03-06 16:24:49  No: 100403  IP: 192.*.*.*

私の場合、イメージパスはstrWkとなっているのですが
ブックのモジュールは魔界の仮面弁士と同じように記入しました。

VBには↓
xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk
という風に書きましたが、やはり画像だけは表示されません;;
文字列は表示されるのですが…。

編集 削除
RIch  2008-03-06 16:26:12  No: 100404  IP: 192.*.*.*

たくさんのご指摘ありがとうございます。
今後気をつけます。

編集 削除
魔界の仮面弁士  2008-03-06 17:11:08  No: 100405  IP: 192.*.*.*

それでは、

  xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk
  MsgBox "待機!"
  xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk

のように、(MsgBox等で)少し時間を置いてから、再実行してみるとどうでしょう?


理由は分かりませんが、私もたまに読み込まれない事があって(エラーにはならない)、
その時は、もう一度 Run しなおすと、なぜか表示されていたので…。

編集 削除
RIch  2008-03-06 18:01:45  No: 100406  IP: 192.*.*.*

魔界の仮面弁士の記述された
Set oExcelApp = CreateObject("Excel.application")

Set xlApp = GetObject(, "Excel.Application")
にして試したところ、待機!メッセージが表示され
ExcelにもImageが表示されるようになりました。
違いがイマイチ分からないのですが…
何度も質問に答えて頂きありがとうございました!

編集 削除
魔界の仮面弁士  2008-03-06 18:58:01  No: 100407  IP: 192.*.*.*

> 魔界の仮面弁士の
(^_^;)


> 違いがイマイチ分からないのですが…
[Ctrl] + [Shift] + [Esc] でタスクマネージャを開き、Excel.exe が
残ってしまっていないか、確認しておいてください。


> Set oExcelApp = CreateObject("Excel.application")
> を
> Set xlApp = GetObject(, "Excel.Application")
> にして試したところ、待機!メッセージが表示され

後者のコードが動作するためには、Excel が起動されている必要があります。
Excel が起動していない場合には、
  ActiveX コンポーネントはオブジェクトを作成できません。: 'GetObject'
のエラーになってしまうはずですので。

おそらくは、テストを繰り返しているうちに、アプリを途中で強制終了させていたり、
あるいは、オブジェクトの解放処理を忘れていたなどの理由から、Excel が
終了しきらず、非表示状態でメモリ上に残っていたのでは無いでしょうか。

編集 削除
RIch  2008-03-07 09:29:52  No: 100408  IP: 192.*.*.*

>> 魔界の仮面弁士の
>(^_^;)
すみません、呼び捨てになってしまいました。

>おそらくは、テストを繰り返しているうちに、アプリを途中で強制終了させ>ていたり、あるいは、オブジェクトの解放処理を忘れていたなどの理由か
>ら、Excel が終了しきらず、非表示状態でメモリ上に残っていたのでは無い>でしょうか。

毎回テスト試行後はタスクマネージャーで、Excel.EXEを終了してやってました。
たぶん、今回の質問のプログラムでExcelを起動するようにしてあったからだと思います。
うまく説明出来なくてすみません;;

編集 削除