プロが教える店舗&オフィスのセキュリティ対策術

 いつもお世話になってます。早速ですがWordマクロで質問させてください。

【経緯】Wordで「写真加工機能付き文書」を作成しました。次に「写真のサイズを変更するボタン」を実装したいと思い、以下まではなんとか実現しました。

・ツールバーを自作し「大」「中」「小」ボタンと機能を設ける。

・文書に写真ファイル添付→写真ファイル選択→サイズ変更ボタンで一発サイズ変更。

 ・・・この機能(ボタン)の弱点は、複数写真に対して変更を行う場合、各ボタンの間を何度も往復しなければならない事(^^;)。

 サイズ変更は性質上写真を見ながら行う必要があり、添付時点でのサイズ自動変更は仕様として考慮外です。

 そこで「サイズ変更ボタン」を一度押し「変更モード」とする事が出来れば、以降は写真をクリックだけでサイズ変更が出来ると思いました。

 機能実現に向け、自作ツールバーに「押し放し」になるボタンをつけました。「写真サイズ変更モード」とする事が目的です。

【問題点】以降がうまく行きません。ボタンに処理を書くと、その処理が終わるまでユーザに主導権が返ってこず、これでは次のステップ「サイズ変更したい写真の選択」が出来ません(T_T)。

 ・・・「文書に添付した写真ファイルを選択」時に何らかのイベントが発生していれば、捕まえて処理をすることが可能なのかなとは思います。

 また、Excelの様にワークシートクリックでイベントが発生するならこれを利用できるとは思ったのですが、残念ながらWordでは文書クリックでイベント発生しない様です。
 例えばイベント発生の仕組みを自作する事なんて、出来ないですよねぇ(^^;)?

 是非実装したい機能なので、何か解決する方法があれば教えて頂きたいのです。長文質問で質問意図が判り難いかもしれませんが、なんとかよろしくお願いしますm(_ _)m。

A 回答 (2件)

webdiverさんこんにちは


コーディングではなく、オブジェクトの変更を提案します。
写真を表示するオブジェクトを、Wordのオブジェクトから、VBAコントロールである"Image"(コントロールツールボックスのメニューボタンから選択)に変更すればクリックイベントを捕まえられます。
    • good
    • 0
この回答へのお礼

 TTakさん、早速のご回答ありがとうございました。
早速自分の知識の範囲でImageObjectを試してみました。

 ・・・・・なるほどImageだと、クリックイベントが書けるんですねぇ、発想の転換といいますか、自分では気づかなかった考え方です(^^)。ありがとうございます。

 でも、ちょっと問題が。これを使うと、文書ファイルのサイズが異常に大きくなってしまうんですね(^^;)。普段は一枚数十キロのjpegファイルを使っているのですが、Imageだとビットマップで扱われるのでしょうか、一気に数百キロからメガ単位にまでなってしまいます(T_T)。

 質問事項に書いていない自分が悪いのですが、非力な環境で頑張っておりますので(笑)、一文書あたりの容量削減はもう一つの課題であったりしますm(_ _)m。

 なんとか、現行維持のままで機能実現は出来ないものでしょうか・・・。

お礼日時:2001/05/01 15:56

webdiverさんこんにちは


> これ(Imageコントロール)を使うと、文書ファイルのサイズが異常に大きくなってしまう

うっ(汗)確かに。そのまま保存すると格段にファイルサイズが大きいですね、私もやってみて気づきました。しかし、ドキュメントのCloseイベントで、Picturプロパティのビットマップをすべて開放すればファイルサイズはそんなに大きくなりません。あるいは、ドキュメントのOpen時やClose時にImageコントロールごと作成したり削除したりしちゃえば、もっとファイルサイズを小さくすることができますよ。
> なんとか、現行維持のままで機能実現は出来ないものでしょうか・・・。
では、苦し紛れ&少しややこしいのですが(笑)右クリックでの方法を提案してみます。右クリックで発生するイベントを作って、オブジェクトが選択されていれば、サイズ変更、そうでないときはエラートラップを流すものです。(wordヘルプから抜粋改造)
まずクラスモジュール(Class1)を作成して以下のコードを記入します。

Public WithEvents App As Word.Application
Private Sub App_WindowBeforeRightClick(ByVal Sel As Selection, Cancel As Boolean)
On Error GoTo IvEND
MsgBox ActiveWindow.Selection.ShapeRange.Name & "を編集します"
'---ここにオブジェクトの編集マクロ(ルーチン)名を記入---
IvEND:
End Sub

次に標準モジュールに以下のコードを記入します

Dim X As New Class1
Sub Register_Event_Handler()
Set X.App = Word.Application
End Sub

これで、右クリック時にオブジェクト(図形)が選択された状態であれば、編集マクロに処理が飛ぶでしょう。なお、Register_Event_Handlerは、ヘルプにもあるように、クラスモジュールに宣言したオブジェクトの初期化を行うマクロですから、ドキュメントオープン時か、ツールボタンを押した直後に1回だけ実行するようにしておくとよいでしょう。
-Word2000にて動作確認-
    • good
    • 0
この回答へのお礼

TTakさん、こんにちは。お世話になっておりますm(_ _)m。

 今回のお答えを早速自分の環境で試してみました。結果、仰るように右クリックイベント表示が実現しました(^^)!
大袈裟でなく感動しましたよ、ホント(^^)。ありがとうございます。このヒントを応用すれば、目的が実現出来そうです。

 でも、「クラス」を扱った経験が無かった自分にとっては、これからが勉強です(^^;)、これらのソースを自分のモノ
にする為、持ち帰って連休に格闘したいと思います。・・・しかし奥が深いですねぇプログラムって。

 ホントに助かりました。どうもありがとうございましたm(_ _)m。

お礼日時:2001/05/02 20:37

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