VB6.0のフォームを使ってExcelのフォーマットへ記入するプログラムを作っています。
ExcelにImageコントロールを配置し、そこにVBにある画像を表示させたいのですが、どうやっても出来ません;;
Image1はExcelに配置したイメージコントロール名です。
Sht.Image1.Select
Sht.OLEObjects("Image1").Object.Picture = LoadPicture(イメージパス)
2行目でエラーが発生します。
どうしたらImageコントロールに収まるのかご指導お願いします。
1 行目のコードは、何のために置いてあるのでしょうか?
コントロールを操作する前に、わざわざ Select する必要は無いですよね。
で、本題ですが:
LoadPicture は、(VB6側ではなく)Excel 側で行う必要があります。
(Excel に限らず、VB6 EXE → VB6 ActiveX EXE の場合も NG だったような…?)
この場合は、LoadPicture を行うプロシージャを Excel VBA で記述し、
それを VB6 側から、Run メソッドで呼び出すようにしてみてください。
某サイトで下記のプロシャージャがあったので実行してみました。
Public Sub SetPicture(PicFile As String)
With Sheet1.Image1
.AutoSize = True
.Picture = LoadPicture(PicFile)
End With
End Sub
VBでは、
xlApp.Run "SetPicture", イメージパス
とやったのですが、やはりエラーになり出来ません。
> 某サイトで
なぜ、その具体的な URL を隠すのでしょうか? (失念したとか?)
> 下記のプロシャージャがあったので
引用元が無いので、下手すると無断転載だと言われかねないような…。
> 実行してみました。
そのプロシージャを、(VB6からではなく)Excel 側から正しく呼べましたか?
>なぜ、その具体的な URL を隠すのでしょうか? (失念したとか?)
サイト名を出していいものかどうか分からなかったので…。
すみません。
>そのプロシージャを、(VB6からではなく)Excel 側から正しく呼べましたか?
ExcelからCallしてみましたが、同じプロシージャではないと呼べませんでした。
魔界の仮面弁士さんのおっしゃった通り、相互にリンクを貼りました。
投稿者は同一人物ではなく、一緒に考えている友達です。
まとまりがなくてすみません…。
> サイト名を出していいものかどうか分からなかったので…。
# サイト名も出さずに無断転載する方が、問題あるような気も。(^^;
で、そのサイトには、そのコードをどこに書くべきか、とか、
どのバージョンの 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"
> 魔界の仮面弁士さんのおっしゃった通り、相互にリンクを貼りました。
[ホームページアドレス]欄って、投稿者自身のサイトを書く場所では
無いのかな…。まぁ良いですけど。
それはそうと、それぞれの掲示板に投稿する前には、ローカルルールにも
必ず目を通しておきましょう。
そのリンク先(モーグ)の掲示板の利用規約には、複数掲示板への投稿(マルチポスト)を、
『マナー違反ですのでやめましょう』と、書かれていますよね。
# ここのサイトや bbs.wankuma.com 等では許容されていますが…。
私の場合、イメージパスはstrWkとなっているのですが
ブックのモジュールは魔界の仮面弁士と同じように記入しました。
VBには↓
xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk
という風に書きましたが、やはり画像だけは表示されません;;
文字列は表示されるのですが…。
たくさんのご指摘ありがとうございます。
今後気をつけます。
それでは、
xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk
MsgBox "待機!"
xlApp.Run "SetPicture", Sht.OLEObjects("Image1").object, strWk
のように、(MsgBox等で)少し時間を置いてから、再実行してみるとどうでしょう?
理由は分かりませんが、私もたまに読み込まれない事があって(エラーにはならない)、
その時は、もう一度 Run しなおすと、なぜか表示されていたので…。
魔界の仮面弁士の記述された
Set oExcelApp = CreateObject("Excel.application")
を
Set xlApp = GetObject(, "Excel.Application")
にして試したところ、待機!メッセージが表示され
ExcelにもImageが表示されるようになりました。
違いがイマイチ分からないのですが…
何度も質問に答えて頂きありがとうございました!
> 魔界の仮面弁士の
(^_^;)
> 違いがイマイチ分からないのですが…
[Ctrl] + [Shift] + [Esc] でタスクマネージャを開き、Excel.exe が
残ってしまっていないか、確認しておいてください。
> Set oExcelApp = CreateObject("Excel.application")
> を
> Set xlApp = GetObject(, "Excel.Application")
> にして試したところ、待機!メッセージが表示され
後者のコードが動作するためには、Excel が起動されている必要があります。
Excel が起動していない場合には、
ActiveX コンポーネントはオブジェクトを作成できません。: 'GetObject'
のエラーになってしまうはずですので。
おそらくは、テストを繰り返しているうちに、アプリを途中で強制終了させていたり、
あるいは、オブジェクトの解放処理を忘れていたなどの理由から、Excel が
終了しきらず、非表示状態でメモリ上に残っていたのでは無いでしょうか。
>> 魔界の仮面弁士の
>(^_^;)
すみません、呼び捨てになってしまいました。
>おそらくは、テストを繰り返しているうちに、アプリを途中で強制終了させ>ていたり、あるいは、オブジェクトの解放処理を忘れていたなどの理由か
>ら、Excel が終了しきらず、非表示状態でメモリ上に残っていたのでは無い>でしょうか。
毎回テスト試行後はタスクマネージャーで、Excel.EXEを終了してやってました。
たぶん、今回の質問のプログラムでExcelを起動するようにしてあったからだと思います。
うまく説明出来なくてすみません;;