「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と関連する良く見られている質問

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

EXCEL VBAからVBへプログラムを移そうと努力しています。

そこで、エクセルのシートのコマンドボタンを押すと、
VBで作成したフォームが開き、そこからEXCELの処理を
させたいと考えています。

VBからエクセルの処理は
Excel.Application
のあたりをつかうことでなんとかなりそうなんですが
その逆がわからず行き詰まっています。

EXCELは2000
VBは6.0
です

ご存じの方、よろしくお願いします。

Aベストアンサー

VBでExcelを用いる場合にはCreateObjectを用いて開発するのですが
この方が慣れると楽ですし、実行時の処理速度も速いです。
後、機能追加がある場合に開発手段が増えます。

QExcel VBA でPictureBoxオブジェクトの取得

Excel VBA では、標準でImageBoxオブジェクトがありますが、これではなくVisualBasicのPictureBoxで持っている機能が使いたいのです。ExcelのUserFormにPictureBoxオブジェクトを貼り付ける方法があれば、教えて下さい。

Aベストアンサー

VBでActiveXコントロールを作成してみたらいかがでしょうか。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

Qエクセルで貼り付けたオブジェクトの画像をユーザーフォームのイメージコントロールで表示する方法

エクセルで画像をオブジェクトで作り、ユーザーフォームに作ったイメージコントロールに表示する方法はないでしょうか?
条件によってイメージの画像が切り替わるようにしたいのですが。
別の画像ファイルから読み出すことはあまりしたくありません。あくまでエクセルの中にある画像からフォームのイメージに表示したいのですが。何かいい方法があれば教えてください。

回答よろしくお願いします。

Aベストアンサー

(#2コメントへのレスです)
とりあえず
http://www.google.co.jp/search?q=win32api%E3%81%A8%E3%81%AF%3F&lr=lang_ja
http://wisdom.sakura.ne.jp/system/winapi/win32/win1.html
VB系から扱うなら
http://www.winapi-database.com/Beginner/page1.html
ですが、中途半端に手を出すと少々やっかいかも。当り前の事ですが、自己責任でお願いします。

それより
>本当はワークシート上で画像を表計算のデータと同じようにデータとして扱って作りたかったのです
なら
http://www.officetanaka.net/excel/function/tips/tips14.htm
http://www.geocities.jp/chiquilin_site/data/050530_search.html
...のあたりが参考になるかもしれませんね。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Qエクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?

CheckBoxが
CheckBox1,CheckBox2,…6
まであり、

If CheckBox1.Value = True Then…

とするときに、数字「1」の部分を変数にしたいのですが、どのようにすれば可能でしょうか。
よろしくお願いします。

Aベストアンサー

> ・ワークシート上のもの(ツールバー[コントロール ツールボックス]から)
> になります。

#3-4 は Userform の CheckBox に対する回答です。[コントロール ツールボックス]
だったのですね。

今回は For でループさせてませんが、必要なら今までの回答を応用して下さい。

  i = 1
  ' Cstr 関数は数値を文字列に変換する
  sCtrlName = "CheckBox" & CStr(i)
  
  ' シートモジュールでの Me はワークシート自信を指す
  If Me.OLEObjects(sCtrlName).Object.Value = True Then
    MsgBox sCtrlName & "の状態は True です"
  Else
    MsgBox sCtrlName & "の状態は False です"
  End If

やってみてよく分からなければ、補足して下さい。

QExcelマクロを引数付で起動

VB.NET2002を使用しています。

VBよりEXCELマクロを実行できるとこまでは出来たのですが、
excel.Application.Run("Module1!test")
VBで処理した値をExcelに渡すことはできないのでしょうか?

Run("マクロ名",引数1,引数2,・・・)のように宣言すれば良さそうなのですが、 型のエラーが出てしまいます。

VB上の吹き出しには「As Object」とあるのですが、実際には文字列(string)や数字(long)です。

そのままRun("test",moji,suuji)のようには無理でしょうか。

ちなみにExcelの受け側ですが、
test(byval moji as string,byval num as integer)
のようにすれば…と思っていたのですが。

ご存知の方がいらっしゃいましたら教えてください。
お願いいたします。

Aベストアンサー

こんにちは。

>excel.Application.Run("Module1!test")

excel.Application.Run("Book1.xls!test")
これは、直していただくとして、

Dim moji As String
Dim num As Int32 '型は違ってはいますが……

excel.Run("Book1.xls!test", moji, num)

で、特に問題ないと思いますが、逆なら、Excel側から型のエラーが出てしまうでしょうね。
たとえば、以下のように、Excel側の文字と数値の引数が、逆になっていると間違えますね。

Book1.xls!Test
Function test(ByVal moji As String, ByVal num As Integer)
 test = String$(num, moji)
End Function

Q2次元動的配列の第一引数のみを可変にする

ReDim Preserve aStrSKU(x, 2)
aStrSKU(x, 0) = strPre
aStrSKU(x, 1) = サブ2
aStrSKU(x, 2) = サブ3

x = x + 1

上記のソースをDo Untilでまわしているのですが、
2週目以降にxに1を足して行数だけ増やしたいのですが、
2週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

Aベストアンサー

こんな感じで

Structure column
Dim col1 As String
Dim col2 As String
Dim col3 As String
End Structure

Private Sub test()

Dim aStrSKU() As column
Dim x As Integer

Do Until x = 3
ReDim Preserve aStrSKU(x)
aStrSKU(x).col1 = "strPre"
aStrSKU(x).col2 = "サブ2"
aStrSKU(x).col3 = "サブ3"

x = x + 1
Loop

End Sub


人気Q&Aランキング

おすすめ情報