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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qblenderでのマットオブジェクト作成方法

blenderとvoodoo camera trackerというソフトを用いてマッチムーブ動画を作ろうとしています。
カメラトラッキングは無事に終了し、後はマッチムーブさせたオブジェクトの影と反射を入れるだけの状態です。
ここで、その物体に映った影だけを表示するためのオブジェクトはマテリアル設定のonly shadowボタンにより実現できたのですが、
反射だけを表示するためのオブジェクトの作り方がわかりません。
blenderではそのようなオブジェクトの作成はできないのでしょうか?
できるのなら、その方法を教えていただきたいと思います。
よろしくお願いします。

Aベストアンサー

Planeを用意してRay Transp Fresnelで透明にしてRay Mirror RayMirで反射にしてみたらどうでしょう

Qピクチャボックスの使用方法

ピクチャボックスをピクセルモードに変更して、Width=2000位にしてLineとprintで描画をしています。
lineは0から2000まで線が引けるのですが、printで文字を書こうとすると、どうやら0から1000までしか書けないようなのです。
これは仕様なのでしょか? それともどこか設定を間違えているのでしょうか?

どうか教えてください・・・

Aベストアンサー

おそらくグラフをスクロールさせる件ですよね?
PictureBoxのAutoRedrawはTrueになっていますか?
普通問題なくできるはずです。

Form1.Picture1.AutoRedraw = True

AutoRedrawを有効にしておかないと
表示部分(1024)を超えた部分を自動で再描写してくれないので

Qテキストボックスなどのオブジェクトの大きさを揃える方法。

OS:XP Excel2000
ばらばらの大きさのテキストボックスやオートシェイプをささっと揃える方法はありませんでしょうか?

Aベストアンサー

追加のご質問に対して

shiftキーを押しながら,揃える図形を
右クリックして,すべてを選択する。
ワークシートの左下
「図形の調整」→「配置/配列」
で整列させることができます。
あとは,すべてが選択されている状態で,
お好きな場所へドラッグして移動します。

Qピクチャボックスの座標取得

Microsoft Visual Studio 2008のスマートデバイス用で、PDA用のプログラミングを開発しています。

フォーム上にピクチャボックスを貼りつけ、画像表示をできるようにしています
で、やりたいことは・・

Private Sub PictureBox1_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseUp

'ピクチャボックスの座標を表示させる  

  End Sub

Private pos As Pointで宣言しておき、
pos.X = e.X
pos.Y = e.Y
でやると、どうも、フォームの座標が取得されてしまうようです
ピクチャの画像は拡大・縮小をできるようにしてあるため、フォーム座標=ピクチャ座標にはなりません

ピクチャボックスの座標を取得するにはどのようにしたらよいのか、ご教授願います

Microsoft Visual Studio 2008のスマートデバイス用で、PDA用のプログラミングを開発しています。

フォーム上にピクチャボックスを貼りつけ、画像表示をできるようにしています
で、やりたいことは・・

Private Sub PictureBox1_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles PictureBox1.MouseUp

'ピクチャボックスの座標を表示させる  

  End Sub

Priv...続きを読む

Aベストアンサー

PictureBoxのSizeModeをStretchImageに設定されているのでしたら

dim img as Image = PictureBox1.Image
pos.X = e.X * img.Width / PictureBox1.Width
pos.Y = e.Y * img.Height / PictureBox1.Height

といった具合にスケーリングしてみてください

#1の回答はForm座標からコントロール座標への変換の仕方です

Q【Blender】作成中のオブジェクトに変な面が出来てしまうのですが、理由が分かりません。

初心者です、詳しい方いらっしゃいましたら分析お願い致します。

重複した頂点の有無と法線の向きに問題がないかは一通りチェックしてみたのですが、下記の画像で示しているように、変な面が作成されてしまいます。
スムージングをかけているにも関わらず、突起があるのも不思議に思っています。

一人で困っている状態なので、助けになっていただけたら幸いです。
宜しくお願い致します。

Aベストアンサー

確証はありませんがBlenderのバグかグラフィックボードの問題かなと。
下記URLの記事が参考になるかも。

http://3dcg.homeip.net/3d_hardware/video_card/02_misconception.php

Qピクチャボックス。指定位置への文字表示

Picture1.Circle (AA!, AB!), CircleSizeVal&, LineColorVal&
で描いた円の付近に、文字、例えば「点1」と表示したいのですが
位置(座標)の指定方法がわかりません。指定方法、又は、検索語をお教えください。

Font 指定で文字により横幅が変化するものしか見つけられませんでした。
DOS のように横幅が一定の Font がありませんか。

Aベストアンサー

お世話になります。

> 文字、例えば「点1」と表示したい
System.Drawing.Graphics のインスタンスを
取得して、DrawString メソッドを呼び出す、
でしょうか。

> DOS のように横幅が一定の Font がありませんか。
等幅フォントで検索してみてはいかがでしょう。

QBlenderとPythonについて

Blenderを勉強中の者です。
BlenderはPythonが必要だと知ってBlenderとPythonをインストールしました。

それぞれのバージョンは、
-Blender ver 2.69
-Python ver 3.3.0
です。

ですが、BlenderがPythonを"認識しているか"又は"認識させる"方法がわかりません。
ver2.6以降のBlenderはPythonが同梱されているという記事も見たことありPythonを
個別にインストールしなくてもいいのか???など
実際、詳しいことが一切わかりませんでした。

今からBlenderを始めるにあたって何をインストールしてどんな初期設定をすればいいか
教えて下さい。

質問がとっちらかってすみません。出来るだけまとめたつもりです。
よろしくお願いします。

Aベストアンサー

Pythonが同梱されているのでインストールしなくても使えます

http://tips.hecomi.com/entry/20120818/1345307205

Blenderは初期の状態でも使えます。なれてきたら、自分のやりたいことに必要なものをインストールやカスタマイズすればいいと思います

Qピクチャボックスで一部の文字を回転

初歩的な質問かもしれませんが・・・

ピクチャボックス内に描画をしようとしているのですが,
縦軸のタイトルを90度回転させて表示させることはできるでしょうか。

ちなみにそこ以外は普通に横書きなので,
Picture1.Print "経過時間"
のように書いています。

文字列単位でプロパティを変更する方法がわからない状態です。。
わかる方がいましたらよろしくお願いします。

Aベストアンサー

> 縦軸のタイトルを90度回転させて表示させることはできるでしょうか。
> Picture1.Print "経過時間"

VB6とかでしょうか?
VBの標準機能ではできませんが、Win32APIを使えば可能です。

「How To Print Text Sideways in a Picture Box Using Win32 API」
(http://support.microsoft.com/kb/154515/en-us)

#上記サンプルの、角度と表示位置を調整してください。

Qblenderかmetasequoiaか

3DのCGを作って、最終的にOpenGLで動かしたいと思っています。
今までOpenGLで頂点指定して3次元物体を
描画していたのですが、
blenderかmetasequoiaでモデリングして
それをOpenGLで読み込んで動かすことができると聞きました。

そこで、blenderかmetasequoiaを使おうと
思っており、どちらを使うか迷っております。
windowsとlinuxのデュアルブートになってるんですが、
基本的にlinuxで作業することが多いので
linuxでも動くblenderが良いかなと思っているのですが、
blenderは使いにくい、という話も聞きました。
たしかにblenderはパッと見、情報も少なそうで
インタフェースも分かりにくそう・・・と思いました。

みなさんはどちらを使っていますか??
どちらがオススメですか??

Aベストアンサー

私は、blenderをwindowsとubuntuで使ってます。

blenderは、確かに、使いにくいとか挫折したって話はよく聞きます。
でも、最初は、基本的な操作とよく使うウィンドウのパネルの設定を覚えるといいと思います。

http://f11.aaa.livedoor.jp/~hige/index.php?%5B%5B%CC%DC%BC%A1%5D%5D
Blender Documentation 日本語版

http://wbs.nsf.tc/tutorial/tutorial_blender.html
WBS+ Blender チュートリアル


http://bmania.blog70.fc2.com/
Blenderで3DCG制作日記

Pythonが使えるのでスクリプトで描画することもできます。
(情報は少なく苦労しました)

http://www.geocities.co.jp/SiliconValley-Cupertino/2019/blender/PythonDocJpn/index.html
The Blender Python API Reference 日本語版

http://d.hatena.ne.jp/gomi-box/20080519/1211159996
OpenGLで遊ぼう


http://video.google.com/videosearch?hl=en&source=hp&q=blender%20tutorial&um=1&ie=UTF-8&sa=N&tab=wv#q=blender+tutorial&hl=en&view=2&emb=0
bleder tutorial

このほかにも、パーティクルや液体のシュミレーションや物理のシュミレーション、ノードエディタで動画のエフェクト(クロマキーやブラーなど)できたりしますのいいですよ!

私は、blenderをwindowsとubuntuで使ってます。

blenderは、確かに、使いにくいとか挫折したって話はよく聞きます。
でも、最初は、基本的な操作とよく使うウィンドウのパネルの設定を覚えるといいと思います。

http://f11.aaa.livedoor.jp/~hige/index.php?%5B%5B%CC%DC%BC%A1%5D%5D
Blender Documentation 日本語版

http://wbs.nsf.tc/tutorial/tutorial_blender.html
WBS+ Blender チュートリアル


http://bmania.blog70.fc2.com/
Blenderで3DCG制作日記

Pythonが使えるのでスクリプトで描...続きを読む

Qピクチャボックス内に文字列を表示させたい

VB2005でプログラムを作っています。
ピクチャボックス内に文字列を表示させたいのですが、
やり方がわかりません。
Draw.Stringでしょうか?
フォーマットというか、引数の入れ方もわかりません。
フォントの部分に"MS 明朝"と入れてもダメですし…。

Aベストアンサー

VB2005にもDrawStringはあるから同じ。↓
というか入門的な内容ですから今後もいろいろ困ると思うので1冊参考書(入門書?)を買った方がいいですよ。(借りるか)

参考URL:http://dobon.net/vb/dotnet/graphics/drawstring.html


人気Q&Aランキング

おすすめ情報