「VBでExcel上PictureBoxダブルクリックイベントを取得したい」
http://oshiete1.goo.ne.jp/kotaeru.php3?q=203163
について思ったことがありまして、ここに書かせていただきます。
この質問にはTodo36さんが答えられました。
Chika-Fさんの望む処理と違うようなので、サブクラス化の案をTodo36さんは述べられて、σ( ̄ー ̄ ボクに託してくださいました。
僕も全く同じ処理を考えていましたのですが、実現不可能でした。
そんな時に出張にいく事になり、結末が気になりながらも、自分なりに考えながら出張にでました。
そこでWith Eventを考えたのですが、エクセルアプリ・ブック・シートなどのイベントは拾えたのですが、シート内に存在するピクチャボックスのエベントは拾う事ができませんでした。
どうしてもエクセルにコードを書かないとできませんでした。
どのようにしたらそのイベントが拾えるのかが極めて知りたいです。
サンプルを載せてくれませんでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
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
>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オブジェクトのイメージをパラメータに渡さなければいけません。
回避方法は・・・わかりません・・・お役に立てずすいません。。。
No.2
- 回答日時:
> 僕も全く同じ処理を考えていましたのですが、実現不可能でした。
質問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さんに教えてもらったりしています。
(密かにちょっとした言語友達気分でおります。ボソッ(-。-))
みなさん これからも よろしくです。。。
>質問180648でエクスプローラのSysListView32のイベントをVBで拾う処理は成功されているのですよね。
>その手法で出来ると思ったのですが..
えーとですねー
エクセルは正式な手続きをしないと、共有メモリを参照する以前に、共有メモリエリアを作成しただけで、落ちるみたいなのです。(EXCEL2000での実験です)
しかしその正式な手続きはわかりません。その擬似手続きとしてWithEventが存在するので、それを利用するしか。。。
さらにピクチャボックスとChika-Fさんは述べられていましたが、実際にはイメージなので、オブジェクトハンドルを持たないので、別アプリからのハンドルでの操作は無理みたいなのです。
エクセル内のオブジェクトをハンドルで操作するのは、コマンドボタンを押させる事や、テキストボックスの文字列を読み取るぐらいしかできないのかなぁ・・・
イベントをプロセス監視で取得しようとすると、落ちまくりでした。
(T▽T) ← かなり泣けました。。。
M○社さんが、どこかでオフィスとVBのオブジェクトのバージョンを一緒にしてくれないと、ちょっと厳しいです。。。
(最後になりましたが、この前書き込みを見ていたのに、何も発言しないまま出張に出てしまい、申し訳ありませんでした。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/03/28 14:52
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Visual Basic(VBA) Excel VBA 複数ブックシートごとにデータを統合する方法について 4 2022/05/20 14:23
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBA メッセージボックスを自動...
-
ACCESS側からEXCELの書式を設定...
-
エクセルVBAでクリップボード内...
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
シャットダウン時のExcel強制終...
-
Application.ScreenUpdating=Fa...
-
VB6 コマンドボタン クリック...
-
VC++2008にて、画面の動的変更...
-
起動後直に実行するコードはど...
-
B列に特定の文字列が入っている...
-
Timerのカウントダウンのしかた...
-
【C#】 あるイベントから別イ...
-
サスペンド(休止やスタンバイ...
-
VBA、UserFormを前面に出力して...
-
EXCEL VBA「Application.Displa...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
VBSで応答不要のメッセージボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報