[[20120615095905]] 『ユーザーフォームの共有について』(しんぽん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームの共有について』(しんぽん)

 シート上にコマンドボタンを7つ配置し(ボタン配置セルはA3,A5,A7,A9,A11,A13,A15)、
このボタンを押すとユーザーフォームが開き、そのユーザーフォームにはコマンド
ボタンを20個配置。それぞれのボタンを押すと先程配置したA3のボタン横(B3からZ3)
に登録データ(別シートにデータ20個用意)が張り付くように処理したいと思っています。
A5のボタンを押せば"B5:Z3"に、A7のボタンを押せば"B7:Z7"に登録データが張り付く
といった感じです。(実はもう少し複雑な処理をさせているのですが簡略化のために
上記説明としました)

 現在A3に配置したボタン用のマクロを以下のようにセットしました。
 ●標準モジュール:20個のコマンドボタンのCaptionを取得、ユーザーフォーム表示
 ●ユーザーフォームモジュール:登録データコピペ処理のサブルーチン、
             20個のイベントプロシージャ(Call 上記_Sub(i))

 次にA5配置ボタン用のユーザーフォームを作りたいのですが、A3配置用と基本的
な処理は同じなのでこれを共有したいと考えています。色々調べているとクラス
モジュールを使えばできそうだということがわかり、まずは上記マクロをクラス
モジュールを使って書き換えようと思っています。どのように書き換えたらよいか
アドバイスをいただけないでしょうか?それと上記のように標準モジュールとユーザー
フォームモジュールは分けないといけないのでしょうか?ユーザーフォームの表示
も含め、全ての処理をユーザーフォームモジュールに書けないのでしょうか?
ご教授お願い致します。


 ちょっと難しく考えすぎてるね(実際に、根っこのところは難しいテーマだけど)
 シートのボタンをおしたときに、それぞれで、別のユーザーフォームが【同時】に、それぞれのボタンのところに表示されるように考えている?
 もし、そうだとしたら、【クラス】の考え方が必要になるけど、でも、実はユーザーフォーム自体が特殊な【クラス】なので
 ことさら【クラスモジュール】を用意する必要はない。

 で、おそらく、そうではなく、A3に配置したボタンをおせばユーザーフォームが表示され、シートへの書き込み処理を行う。
 おわれば、そのフォームを閉じる。
 次に、A5に配置してあるボタンをおす。ユーザーフォームが表示され、シートへの書き込み処理を行う。

 このように、逐次的というか順次的な処理なんじゃない?
 であれば、ユーザーフォームは、普通のやりかたで1つだけ用意すればいい。
 問題は、A3でおされたときとA5でおされたときのシートへの書き込みの場所が異なるだけ。
 なので、ユーザーフォームに対して、【どこのセルのボタンでの要求なのか】を教えてやればいいことになる。

 ユーザーフォームに情報を受け渡す方法はいろいろあるんだけど、その前に、まず、↑でいったことの確認・回答をお願い。

 それと、フォームはモーダル表示?モードレス表示? これも、情報を受け渡す時のキーポイントなので、教えてね。

 追加)さらにいえば、シート上にたくさんのボタンを配置するのではなく、1つだけ。
  ユーザーフォーム側で、どの領域に対する処理なのかを、ボタンでもいいし、別のコントロールでもいいけど
  そこで指定するのが、たぶん一般的な方法だと思うよ。

 (ぶらっと)


ぶらっと様

 お世話になります。御察しのとおり、ユーザーフォームの表示については逐次的,順次的処理を
考えております。同時表示の必要はありません。

 それと、表示については何も指定していないのでモーダルになっています。これについては
モードレスでもどちらでもよいです。

 シート上に複数ボタンを配置することに関しては、あまり一般的ではないのですね・・・
確かにおっしゃられるとおりだと思いますが、今回作成しているシートについては、種々
作業性を考慮して複数ボタン配置でやりたいと考えております。

 なにとぞ、ご指導のほど宜しくお願い致します。

 


 ユーザーフォーム上に20個のオプションボタンを配置して、それのいずれかをおして、どの領域メンテかを指定したほうが
 絶対にいいとは思うけどね。
 でも、そちらの要望がシート上のボタンなので、その意向に沿って参考コードというかヒントを。

 まず、ユーザーフォームにラベルを1つ配置。名前は 仮に lblAddress にしておく。
 (最終的には非表示にするけどとりあえずそのままで)

 シート上のボタンはフォームツールのボタンだとする。
 すべてのボタンに以下のマクロをマクロ登録。

 Sub ShowForm()
    With UserForm1
        .Controls("LblAddress").Caption = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address(False, False)
        .Show
    End With
 End Sub

 これでユーザーフォームが表示された時、lblAddressの値を確認してみて。
 シートのボタンが配置されているセルアドレスが、そこに表示されているよね。
 なので、あとはユーザーフォームモジュール内の転記コードの転記先アドレスを、lblAddress.Caption を基準に
 変化させればいい。

 で、最終的には、この lblAddress のプロパティで、非表示にして見えなくしておく(Visible を Falseにしておく)

 (ぶらっと)

 ちょっと重要なことを書き忘れた。

 ユーザーフォーム側では、With UserForm1 のタイミングで Initializeイベントが発生する。
 なので、Initializeルーティンでは、まだ、lblAddressには何もセットされていない状態。

 もし、Initalizeで、このアドレスを基本にして何か処理する必要があるなら
 Initialize を使わず Activate で処理してね。
 ユーザーフォームが表示されれば、いつでも、この値が参照できる。

 で、↑では、ダミーのラベルを用意したけど、もし、ユーザーフォームのタグを使っていなければ
 このラベルを使わず、
 .Tag = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address(False, False)
 こうしておいて、ユーザーフォーム側のActivate以降の処理で、 Me.Tag で、この値が参照できる。
 こちらのほうがいいかな?

 (ぶらっと)


ぶらっと様

 こんなすばらしい方法があったなんて、超感動しました!
感謝感激です!まだマクロは組めていませんが、これで完成
できそうです。本当にありがとうございました。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.