OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

「VBでExcel上PictureBoxダブルクリックイベントを取得したい」について

  • 暇なときにでも
  • 質問No.214053
  • 閲覧数349
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 90% (37/41)

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

どのようにしたらそのイベントが拾えるのかが極めて知りたいです。
サンプルを載せてくれませんでしょうか?
よろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル7

ベストアンサー率 60% (6/10)

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
お礼コメント
TAGOSAKU7

お礼率 90% (37/41)

>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:09
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2
レベル13

ベストアンサー率 59% (729/1235)

> 僕も全く同じ処理を考えていましたのですが、実現不可能でした。 質問180648でエクスプローラのSysListView32のイベントをVBで拾う 処理は成功されているのですよね。 その手法で出来ると思ったのですが.. > With Event 私も詳しく知りたかったのですが... Chika-Fさんの質問204538より Excel上にあるPictureB ...続きを読む
> 僕も全く同じ処理を考えていましたのですが、実現不可能でした。

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

> With Event

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

Chika-Fさんの質問204538より

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

参考になりませんか?
補足コメント
TAGOSAKU7

お礼率 90% (37/41)

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

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

みなさん これからも よろしくです。。。
投稿日時 - 2002-02-10 21:44:39
お礼コメント
TAGOSAKU7

お礼率 90% (37/41)

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

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

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

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

(最後になりましたが、この前書き込みを見ていたのに、何も発言しないまま出張に出てしまい、申し訳ありませんでした。)
投稿日時 - 2002-02-08 17:07:41


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ