プロが教えるわが家の防犯対策術!

「VBでExcel上PictureBoxダブルクリックイベントを取得したい」
http://oshiete1.goo.ne.jp/kotaeru.php3?q=203163
について思ったことがありまして、ここに書かせていただきます。
この質問にはTodo36さんが答えられました。
Chika-Fさんの望む処理と違うようなので、サブクラス化の案をTodo36さんは述べられて、σ( ̄ー ̄ ボクに託してくださいました。
僕も全く同じ処理を考えていましたのですが、実現不可能でした。
そんな時に出張にいく事になり、結末が気になりながらも、自分なりに考えながら出張にでました。
そこでWith Eventを考えたのですが、エクセルアプリ・ブック・シートなどのイベントは拾えたのですが、シート内に存在するピクチャボックスのエベントは拾う事ができませんでした。
どうしてもエクセルにコードを書かないとできませんでした。

どのようにしたらそのイベントが拾えるのかが極めて知りたいです。
サンプルを載せてくれませんでしょうか?
よろしくお願いします。

A 回答 (2件)

TAGOSAKU7さん、こんにちは。



サンプルをUPします。参考になると良いのですが・・・

私も質問があります。
サンプルREMARK部分でエラーになります。
質問を投稿してありますが良回答を
得られずに困っています。
ご存知でしたら教えて下さい。

【サンプル準備】
標準フォームを1つ作成
同フォームにボタンを2つ作成
TESTという名前でExcelブックを作成
同Excelシートに「Image1」という名前でPictureBox(イメージ)を1つ作成
同ブックをアプリケーションと同フォルダーに保存
参照設定に気を付けて下さい。

【サンプル】
Option Explicit

Private WithEvents XLApp As Excel.Application
Private WithEvents XLBook As Excel.Workbook
Private WithEvents XLSheet As Excel.Worksheet
Private WithEvents XLImage As MSForms.Image
'--------------------------------------------------
'Excel起動
'--------------------------------------------------
Private Sub Command1_Click()

'AppObjectセット
Set XLApp = CreateObject("Excel.Application")
'Excel起動
XLApp.Workbooks.Open FileName:=App.Path & "\TEST.xls"
'WorkBookObjectセット
Set XLBook = XLApp.ActiveWorkbook
'WorkSheetObjectセット
Set XLSheet = XLBook.Sheets(1)
'PictureObjectセット
Set XLImage = XLSheet.OLEObjects("Image1").object
'Excel表示
XLApp.Visible = True
'フォーム非表示(2重起動防止)
Me.Visible = False

End Sub
'--------------------------------------------------
'アプリケーション終了
'--------------------------------------------------
Private Sub Command2_Click()

Unload Me
End

End Sub
'--------------------------------------------------
'ExcelBookクローズ時処理
'--------------------------------------------------
Private Sub XLApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)

'終了時に保存メッセージを表示させない
XLApp.DisplayAlerts = False
'ExcelApp終了
XLApp.Quit
'変数解放
Set XLImage = Nothing
Set XLSheet = Nothing
Set XLBook = Nothing
Set XLApp = Nothing
'フォーム表示
Me.Visible = True

End Sub
'--------------------------------------------------
'ExcelImageダブルクリック時処理
'--------------------------------------------------
Private Sub XLImage_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim OpenRet As Variant
'確認メッセージ
XLApp.Visible = False
MsgBox ("Get PictureBox Event")
XLApp.Visible = True

'-----------------------------------------------------------
'---私も質問したい箇所です。最初はREM(')して下さい
'--.Pictureでオートメーションエラーが出ます。
'--解決法がありましたら教えて下さい。
' OpenRet = Application.GetOpenFilename _
' ("BMP,*.BMP,JPEG,*.JPG,GIF,*.GIF", , "画像選択")
' If OpenRet = False Then Exit Sub
' With XLImage
' .AutoLoad = True
' .AutoSize = False
' .PictureSizeMode = fmPictureSizeModeZoom
' .PictureAlignment = fmPictureAlignmentCenter
' .Picture = LoadPicture(OpenRet)
' End With
' SavePicture XLImage.Picture, App.Path & "\TmpPict.JPg"
'-----------------------------------------------------------

End Sub
    • good
    • 0
この回答へのお礼

>Private WithEvents XLImage As MSForms.Image
なるほど。。。
FM20.DLLの存在は、以前に見つけていたのですが、それの応用の方法をはじめて見ました。
カンシャです。_(._.)_

・・・で、逆に質問されてしまいましたね。。。(; ̄▽ ̄A あせあせ

LoadPicture
ですが、命令後はVB6ならば
VB6もEXCELもVB6のタイプライブラリを使用していますが、EXCELのイメージやフォームなどのオブジェクト類は全く別のDLLを元に創成されます。

なのでLoadPictureはVB6で使用した場合、VB6用のピクチャタイプで値を返します。
.Picture = MSForms.LoadPicture(OpenRet)
みたいな事ができればよいのですが・・・残念な事にその行は赤々となり、エラーと表示されてしまいます。
同様にSavePictureですが、パラメータはVB6オブジェクトのイメージをパラメータに渡さなければいけません。

回避方法は・・・わかりません・・・お役に立てずすいません。。。

お礼日時:2002/02/08 16:50

> 僕も全く同じ処理を考えていましたのですが、実現不可能でした。



質問180648でエクスプローラのSysListView32のイベントをVBで拾う
処理は成功されているのですよね。
その手法で出来ると思ったのですが..

> With Event

私も詳しく知りたかったのですが...

Chika-Fさんの質問204538より

Excel上にあるPictureBoxオブジェクトを取得
Set Image1 = xlSheet.OLEObjects("Image1").Object

参考になりませんか?

この回答への補足

Chika-Fさん。参考ありがとうございました。
Todoさん。これからもよろしくお願いします。
Chika-Fさんのお礼欄に書いた返答は、Todo36さんの
>Set Image1 = xlSheet.OLEObjects("Image1").Object
がヒントとなりました。感謝です。

それと、、、Chika-Fさん
ぼくはTodoさんの師匠ではないですよ。以前に質問をここで書いて、Todoさんに教えてもらったりしています。
(密かにちょっとした言語友達気分でおります。ボソッ(-。-))

みなさん これからも よろしくです。。。

補足日時:2002/02/10 21:44
    • good
    • 0
この回答へのお礼

>質問180648でエクスプローラのSysListView32のイベントをVBで拾う処理は成功されているのですよね。
>その手法で出来ると思ったのですが..

えーとですねー
エクセルは正式な手続きをしないと、共有メモリを参照する以前に、共有メモリエリアを作成しただけで、落ちるみたいなのです。(EXCEL2000での実験です)
しかしその正式な手続きはわかりません。その擬似手続きとしてWithEventが存在するので、それを利用するしか。。。

さらにピクチャボックスとChika-Fさんは述べられていましたが、実際にはイメージなので、オブジェクトハンドルを持たないので、別アプリからのハンドルでの操作は無理みたいなのです。
エクセル内のオブジェクトをハンドルで操作するのは、コマンドボタンを押させる事や、テキストボックスの文字列を読み取るぐらいしかできないのかなぁ・・・
イベントをプロセス監視で取得しようとすると、落ちまくりでした。
(T▽T) ← かなり泣けました。。。

M○社さんが、どこかでオフィスとVBのオブジェクトのバージョンを一緒にしてくれないと、ちょっと厳しいです。。。

(最後になりましたが、この前書き込みを見ていたのに、何も発言しないまま出張に出てしまい、申し訳ありませんでした。)

お礼日時:2002/02/08 17:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!