[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームを閉じるとSheet5上で開いたのにSheet1に移動してしまう修正』(ゆず)
OS: Windows XP sp3
Ver: Excel 2007
Sheet1〜Sheet5までのブックを用意しています。それぞれ
Sheet1=参照リスト
Sheet2=書類:仕様書
Sheet3=書類:見積書
Sheet4=書類:注文書
Sheet5=書類:請求書
といった具合でSheet2-5には共通した入力用のユーザーフォームを用意しました。
事情により、仕様書からの流れで書類を作成しないケースに対応するため
途中の注文書からでも共通項目は全てのシートに転記させたいという理由でこうなりました。
各シートにオートシェイプで作成したボタン(図形)にマクロでボタン操作を仕込み、
どのシートからでも入力用ユーザーフォームが開くようにしました。
Sub マクロ入力ボタン()
入力フォーム.Show End Sub
「閉じるボタン」(CommandButton2で作成)を押すとUnload するようにしたのですが、
Unload 入力フォーム
Sheet5(請求書)で開いたフォームの「×閉じるボタン」で閉じると
Sheet1(参照リスト)へ移動してしまいます。
設計としては入力ボタンで、開いたシートのままユーザーフォームが表示/非表示という
イメージで組んだのですが、どこの設定を変えればよいのかWebで検索しても
わかりません。
修正のトライとしては
1.閉じるボタンに Unload 入力フォーム
Worksheets("Sheet5").Activate ただしユーザーフォームは共通なのでこれではSheet5を表示してしまう。 実際には瞬間Sheet5 が表示され、Sheet1 に行ってしまう。
2.入力ボタンのマクロをシートごとに設定
これはShow するときのものなので、Unload のときには関係ない?
3.ユーザーフォームの閉じるボタン(CommandButton2_Click())の
プロパティの設定で治せるところがあるのか?(→検索ヒットなし)
ちなみにUserForm_Initialize()は今回入れていません。
すべてツールのイベントで動作を制御しています。
VBAで何かしらの指示を入れてやればこの症状が回避されるのであれば
ヒントをいただけないでしょうか?
初歩的な内容かも知れませんが、皆様のお力を宜しくお願い致します。
>ユーザーフォームを閉じるとSheet5上で開いたのにSheet1に移動してしまう修正
>1.閉じるボタンに Unload 入力フォーム > Worksheets("Sheet5").Activate > ただしユーザーフォームは共通なのでこれではSheet5を表示してしまう。 > 実際には瞬間Sheet5 が表示され、Sheet1 に行ってしまう。
あの〜、意味がわかんないんですけど??? 特に、「Sheet1 に行ってしまう。」ってなんですか? 単純にSheet1がアクティブになるようなコードがかかれているからじゃないんですか? BJ
ご回答ありがとうございます。(ゆず)
おっしゃる通り、アクティブになるような直接的なコードをつぶしていったつもり
なのですが、閉じる操作のときに別シート(Sheet5)をアクティブにしても
「参照リスト」(Sheet1)がまだアクティブの設定になっていることが
私の知識では理解できていません。
パッとSheet1 が表示したなと思ったらSheet1 が最終的に表示される。
ユーザーフォームの中には、「参照リスト」にあるソースをコンボボックスで
ドロップダウンリストにする仕組みは入れていますが、
ユーザーフォームの中に書かれているコードは Unload でメモリをリセットする
と理解していたのですが、どこかにユーザーフォームが閉じられても
「参照リスト」をアクティブにしている指示が残っているということですね。
ユーザーフォーム以外でも、もう少し疑わしい構文を調べてみます。
そしてその部分をピックアップしてご質問させていただきます。
あれからテストして、問題点を再度洗いだしてみました。
1.Sheet5をアクティブにしてもSheet1 へ移動してしまう不具合
単純に処理の順番が記述ミスでした
×Unload 入力フォーム
Worksheets("Sheet5").Activate ↓ ○Worksheets("Sheet5").Activate Unload 入力フォーム これで「入力フォーム」を閉じて Sheet5 に戻れます。
◆当初の目的は、Sheet2(仕様書)→ユーザーフォーム→Sheet2(仕様書)
Sheet4(注文書)→ユーザーフォーム→Sheet4(注文書)というように 事前に開いていたシートにもどるのが目的でした。 Activate を開放(リセット)するコードというものはあるのでしょうか? .Select と Select False ではWorksheet には使えなさそうですし、 VBAの本やWebで探しているのですが見当たりません。 それぞれのシート用にユーザーフォームを作ったほうが簡単のような 気もしてきましたが、入力したテキストを書類へ転記させる仕組みが さらに複雑・不可能なようにも思えてなりません。
>Activate を開放(リセット)するコードというものはあるのでしょうか? ないです。 素直にフォームを表示したときにアクティブシート名を記録しておけば良いのでは。 BJ
BJ さんの書かれたまんまですけれど、ユーザフォームに下記のコードを追加してどうでしょうか。 (Mook)
Dim 呼出しWS As Worksheet
Private Sub 入力フォーム_Initialize() Set 呼出しWS = ActiveSheet End Sub
Private Sub 入力フォーム_Terminate() 呼出しWS.Activate End Sub
(BJ)様 (Mook)様
アドバイス、サンプル有難うございます!
思い通りの流れで動きました! (ゆず)
変数の使い方、応用がまだまだ使いこなせていませんでした。
動きとしては単純ながら、いざ仕組みを考えるとなると
ルートを整理する考え方が不足していることが自覚できました。
あと「Terminate」イベントのことも忘れていました。
初心者に親切なご助言 感謝いたします。有難うございました。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.