• ベストアンサー

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

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

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

  • ベストアンサー
  • Chika-F
  • ベストアンサー率60% (6/10)
回答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

TAGOSAKU7
質問者

お礼

>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オブジェクトのイメージをパラメータに渡さなければいけません。 回避方法は・・・わかりません・・・お役に立てずすいません。。。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

> 僕も全く同じ処理を考えていましたのですが、実現不可能でした。 質問180648でエクスプローラのSysListView32のイベントをVBで拾う 処理は成功されているのですよね。 その手法で出来ると思ったのですが.. > With Event 私も詳しく知りたかったのですが... Chika-Fさんの質問204538より Excel上にあるPictureBoxオブジェクトを取得 Set Image1 = xlSheet.OLEObjects("Image1").Object 参考になりませんか?

TAGOSAKU7
質問者

お礼

>質問180648でエクスプローラのSysListView32のイベントをVBで拾う処理は成功されているのですよね。 >その手法で出来ると思ったのですが.. えーとですねー エクセルは正式な手続きをしないと、共有メモリを参照する以前に、共有メモリエリアを作成しただけで、落ちるみたいなのです。(EXCEL2000での実験です) しかしその正式な手続きはわかりません。その擬似手続きとしてWithEventが存在するので、それを利用するしか。。。 さらにピクチャボックスとChika-Fさんは述べられていましたが、実際にはイメージなので、オブジェクトハンドルを持たないので、別アプリからのハンドルでの操作は無理みたいなのです。 エクセル内のオブジェクトをハンドルで操作するのは、コマンドボタンを押させる事や、テキストボックスの文字列を読み取るぐらいしかできないのかなぁ・・・ イベントをプロセス監視で取得しようとすると、落ちまくりでした。 (T▽T) ← かなり泣けました。。。 M○社さんが、どこかでオフィスとVBのオブジェクトのバージョンを一緒にしてくれないと、ちょっと厳しいです。。。 (最後になりましたが、この前書き込みを見ていたのに、何も発言しないまま出張に出てしまい、申し訳ありませんでした。)

TAGOSAKU7
質問者

補足

Chika-Fさん。参考ありがとうございました。 Todoさん。これからもよろしくお願いします。 Chika-Fさんのお礼欄に書いた返答は、Todo36さんの >Set Image1 = xlSheet.OLEObjects("Image1").Object がヒントとなりました。感謝です。 それと、、、Chika-Fさん ぼくはTodoさんの師匠ではないですよ。以前に質問をここで書いて、Todoさんに教えてもらったりしています。 (密かにちょっとした言語友達気分でおります。ボソッ(-。-)) みなさん これからも よろしくです。。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBでExcel上PictureBoxダブルクリックイベントを取得したい

    VBでOpenしたExcelシート上にあるPictureBoxをダブルクリックした際に発生するイベントを取得したいと思っております。 ExcelVBAでは普通にPictureeBox_DblClick()で取得できますがVBで取得する場合はPictureBoxオブジェクトをどの様に取得・宣言し、プロシージャ名はどの様に書いたらよいのでしょうか。教えて下さい。お願いします。

  • 現在、VB2005でDrawLineにてPictureBox上にライン

    現在、VB2005でDrawLineにてPictureBox上にラインを描いています。 しかし、VB6とは違いラインを描いているFormが隠れるとラインが消えてしまいます。 PictureBoxのPaintイベントで描くようにすれば良いのでしょうが、ラインを描くのに 数万ループして演算しながら座標を決めてるため、Formが隠れて現れるたびに座標演算処理が働き 重くなり実用的ではありません。 Formが隠れてもラインが消えないように出来れば良いのですが、方法をご存知の方がいらっしゃいましたら 宜しくお願いいたします。

  • VBから、エクセルでファイルを開くには・・・

    またまた、お世話になりますm(__)m 環境はVB.net2003、エクセルは2002でプログラミングの勉強、データ処理をしているのですが、VBでエクセルを開き、そのエクセル上でファイル(csvやテキストなど)を開きたいのですが、VB上でどのように書けばよいのでしょうか? VBでエクセルをたちあげたり、bookやsheetを開くことはできました。 どなたかご教授お願いしますm(__)m

  • VBからEXCELを保存

    VBからEXCELに保存したいのですが、前準備としてEXCELのsheet2で保存します。VBを実行したときにExcelのsheet1に保存したいのですが、どうすればいいかわかりません、おしえてください。多分、保存するときにSheet2を対象にしていると思うので、sheet1を対象にしたいのですが・・・ /****************** VBを実行したときの処理 ********************/ 'アプリケーションの参照 Set xlApp = CreateObject("Excel.Application") 'ブックの参照 Set xlBook = xlApp.Workbooks.Open("C:\テスト\テスト.Xls") 'シートの参照 Set xlSheet = xlBook.Worksheets("Sheet1")

  • PictureBoxのMouseUpイベントを意識的に発生させる方法

    VB.Netで開発しています。 表記の通り、PictureBoxのMouseUpイベントを意識的に発生させる方法はありますでしょうか? 具体的な処理の流れは PictureBox1をドラッグ&ドロップすることで ドロップされた位置によって処理を行っているのですが 制限時間をタイマーで設けていて、制限時間が来たら 現在の位置でドロップ(MouseUp)したいのです。 どなたかいい方法ご存知の方いましたらアドバイスお願いします。

  • ダブルクリックイベントで良いのかどうか?

    お世話になります。 ダブルクリックイベントで、そのセルを赤く色を塗り、尚且つ、 そのセルをダブルクリックした事により、別のワークブックを開き、 また、開いたワークブックのシートの中からある単語を検索して その属性を現在アクティブにしている、ブックのシートに記入しよう としていますが、 まず、下記の様に、ダブルクリックイベントで、セルを赤く塗るまではうまくいったのですが、別のブックを開く事がうまく出来ません。 記述が悪いのか、または標準モジュールに記述するべきなのか分からなく困っています。 どなたかご教授頂きたく宜しくお願い申し上げます。        記 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Set Rng = Range("c2:d2,f2") Set myRng = Intersect(Target, Rng) If myRng Is Nothing Then Exit Sub Rng.Interior.ColorIndex = xlColorIndexNone myRng.Interior.ColorIndex = 3 Cancel = True If Intersect(Target, Range("c2")) Then Workbooks.Open Filename:="C:\Documents and Settings\Owner\デスクトップ\台帳.xls" End If End Sub

  • EXCEL VBAから、VBのフォームを開くためには?

    EXCEL VBAからVBへプログラムを移そうと努力しています。 そこで、エクセルのシートのコマンドボタンを押すと、 VBで作成したフォームが開き、そこからEXCELの処理を させたいと考えています。 VBからエクセルの処理は Excel.Application のあたりをつかうことでなんとかなりそうなんですが その逆がわからず行き詰まっています。 EXCELは2000 VBは6.0 です ご存じの方、よろしくお願いします。

  • VB6からExcelにマクロが使われているかを知るには

    VB6でExcelファイルを読み込み、各シートにマクロが使われているかを 知る方法を探しております。(ブック単位でもよいです) Worksheetsオブジェクトのプロパティにはなさそうですし、 何か情報をお持ちの方、ご教授いただければと思います。

  • VBからエクセルファイル作成

    VBでエクセルファイルを作成する処理を作っていて、ファイルは作成されるのですが、自動的にシートが3シート作られます。 作成時にシート数を指定することはできるのでしょうか? ネットでいろいろ調べるのですが、VBからのエクセル操作について書かれているサイトがあまりみつかりません。 よいサイトがありましたら、あわせて教えてください。 よろしくお願いします。

  • VB.NETからエクセルを起動して、エクセルでVBを閉じたい。

    こんにちは。 先日、エクセルのフォームを最前面に配置したいという 質問をさせて頂いたものでございます。 それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、 最前面にする事は出来たのですが、フォームを動かすと ブックはその一つ下に現れてしまい、 ブックを最背面に配置するなどを試みてみたのですが、 どうもうまく行かないので、 エクセルから直に立ち上げることが出来ないようにして VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。 それで、データを送る方法は何とかなりそうなのですが、 VB.NETのフォームからエクセルを起動して、 次にエクセルからそのフォームを出したり、隠したりしたいのですが、 その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか? IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。 そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。 よろしくお願いいたします。m(__)m

このQ&Aのポイント
  • 大学卒業後、ブラック企業に勤務した知人の息子さんが食品製造会社に就職。現在は33歳で年収400万円位。奥さんは高校卒業後に中小企業で事務職を勤め、結婚と同時に退職し、現在はパートで年収は100万円程度。ご両親は健在で年金生活だから経済支援はできない。夫側の義両親と同居している夫婦には2階建ての家と軽自動車がある。二人の子供を望んでいるが、質問者は難しいと思っている。
  • 子供を2人も持つことができるのか疑問です。知人の息子さんが大学卒業後にブラック企業で2年間働き、その後食品製造の会社に就職しました。現在は33歳で年収は約400万円です。奥さんは高校卒業後に事務職として勤め、結婚と同時に退職しました。現在はパートとして働いており、年収は約100万円です。質問者のご両親は年金生活で経済支援はできません。夫側の義両親と同居しており、ローンのある2階建ての家と軽自動車があります。質問者は二人の子供を望む夫婦について難しいと思っています。
  • 子供を2人も持つことは可能なのでしょうか?質問者の知人の息子さんは大学卒業後にブラック企業で働き、その後食品製造の会社に転職しました。現在は33歳で年収は約400万円です。奥さんは高校卒業後に中小企業で事務職を務め、結婚と同時に退職しました。現在はパートとして働いており、年収は約100万円です。質問者のご両親は年金生活なので経済支援はできず、夫側の義両親と同居しています。質問者は二人の子供を望む夫婦について、難しいと考えています。
回答を見る

専門家に質問してみよう