旗。

ブログ | 2009/4/22 15:54
EXCELの話。検索で飛んできた方々、きっと役に立ちません。すみません。

・ブックを開いて何も変更してないのなら、確認メッセージ出さずに閉じたい。
・とはいっても、Openイベントで色々やってるんで、Openイベントの終了時に、Thisworkbook.Saved = Trueにしている。
・なぜかすぐにFalseになる。

どういう時に起きるか。苦労して調べた。
入力規則リストがあるセルがアクティブな状態で保存されているとFalseにならない。どのセルに移ろうが。
入力規則リストがないセルがアクティブな状態で保存されていて、その後、入力規則リストがあるセルへ移るとFalseになる。

ここで。
入力規則には、名前を定義したセル範囲を参照させている。そのセル範囲参照式に、OFFSET関数を使っているのが怪しい気がする。

仮説。
入力規則のリストの生成タイミングは、そのセルが最初にアクティブになった瞬間。でも、あるセルがアクティブになったら、そのシート全体の入力規則リストも一緒に生成される。なぜか。
で、入力リストの生成は、ブックに対する変更ととらえられ、SavedプロパティもFalseになってしまうと。

というわけで、ブックを開けた瞬間に、入力規則リストのセルがアクティブになっているものは、Openイベントが終わるまでに、入力規則リストが生成され、Openイベントの終了を迎え、SavedプロパティがTrueにできる。なので、以降Falseにならない。
逆にブックを開けた瞬間に、入力規則リスト以外のセルがアクティブになっていると、入力規則リストが生成される前に、Openイベントが終了、その後、入力規則リストのセルがアクティブになった際に初めてリストが生成されるものだがら、SavedプロパティはFalseに。

以上を踏まえてどうするか。
VBAで、入力規則の生成を、Openイベント中に強制的にできればよいのではないか。でも、生成とは具体的にどうすりゃいいのかわからないので、全Nameオブジェクトに対して、ReferToRangeをして、ダミーのRangeObjectを作る。→だめだった。

所詮、仮説に過ぎないので、対処療法。
・各シート、常に入力規則リストがあるセルをアクティブにして保存することにする。

…いずれ暇な時になんか解決策がないか、持ち越し。
nia
「ReferToRangeをして、ダミーのRangeObjectを作る」とやらはなにをやってるかわからないけど
Openイベント中だと思い通りに動かんかも。まるっとActiveイベントにもってくと動いたりする。 by VBA素人

まっつん(deviceone) | 2009/04/23 01:36
ITIKAWA
ああ、こんなん目を通してくれたんや。ありがと。^^;

ReferToRangeをすることによって、参照範囲の計算がなされないかなあという淡い期待。やっぱだめやったけど。

Workbook_Activateイベントのことかな?これって、最初の一度だけ?それとも、文字通り、そのブックがアクティブになるたびに走るん??調べてみる。

やってみた。他にブックが開いてると、アクティブになるたびに走るわけな。ちょっと試してみよう。でも、アクティブになるたびに、Saved=Trueにしてたらえらいことやから、そのへんもやりつつ。

と、思ったけど、関係ないかも。「入力規則リストがないセルがアクティブな状態で保存されていて、その後、入力規則リストがあるセルへ移るとFalseになる」わけであって、アクティブセルを移す前までは、確かにSavedはTrueになっているわけで。

ま、いいよ。他に閃きがあったら喜んで聞くけど、多分、どーしようもない気がするー。ありがとー。
いちかわ | 編集回数: 3 | 2009/04/23 10:22
nia
だめかー。
「文字通り、そのブックがアクティブになるたびに走る」です。
参照範囲の計算は、Excelの仕組み上、value値を変更(一度ブランク入れてから元の値に戻すetc)すると再計算してくれるんじゃないかな。多分関係ないけど(笑)
Saveイベント時に「入力規則リストがあるセルへ移して」Saveで(笑)
まっつん(deviceone) | 編集回数: 1 | 2009/04/23 12:05
縮小 拡大

ログインしておくと、後で編集が可能です。

Rottel内コンテンツ

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close