[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームの共有について』(しんぽん)
シート上にコマンドボタンを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.