• ベストアンサー

Excelを閉じるときVBAプロジェクトのパスワード要求が表示される

VBAでコードを記述しプロジェクトにはパスワードをかけております。 マクロ有効にてシート上で作業をし、作業終了後にExcelを閉じるとVBAプロジェクトのパスワードを 要求する画面が表示されてしまいます。ちなみにバグ等でエラーが発生しているわけではありません。 幽霊プロジェクトの怪 http://hp.vector.co.jp/authors/VA016119/kitan01.html#11 PRB: Excel が終了した後、 VBA プロジェクトのパスワード プロンプトが表示されます。 http://support.microsoft.com/default.aspx?scid=kb;ja;280454 上記サイト様を参照しましたが、オブジェクト変数をPublicで使用したりはしてませんし、DBアクセスを している部分はあるもののPrivate変数を使用し念のためコードの最後でNothingをセットしています。 どなたか同様の現象をご存知の方、または解決したよ!という方いらっしゃいましたらご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

DBアクセスの内容が不明な点と、この現象に出会ったことが無いので全く自信なしですが、、、 DB接続を行うプロシージャーの終了前にコネクションをちゃんと閉じていますか? 例えば、 Dim DB as Object 'ADO接続 Set DB = CreateObject("ADODB.Connection") DB.Open (strConnect) (略) DB.Close '<-- ココ Set DB = Nothing また、エラーが発生した場合、例外処理でコネクションを閉じる前にプロシージャーが終了、オブジェクト変数が解放されないようになってませんか? あと、大丈夫だと思いますが、 >オブジェクト変数をPublicで使用したりはしてませんし Dim DB as Object Private Sub DB_Connection() (略) End Sub だとオブジェクト変数DBはモジュールレベル変数であり、各プロシージャーが終了した後もメモリ上に確保されたままです。 上記内容は間違ってるかもしれません。ご参考まで。 詳しい方フォローお願いしますm(_ _)m

noname#10441
質問者

お礼

回答ありがとうございます。 DB関連についてはWS等も含めて全てプロシージャを抜ける前にClose、Nothingしてます。 また、モジュールレベルでの変数宣言はありませんし、例外処理での抜けもないですね。 私もやっぱりその辺が怪しいと思って何度も見直したんですが該当箇所が見つからずです・・・。

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

>一度でもフォームを開くと発生してしまいます。 >Win2000+Office2000で最新にアップデートした状態だとこの現象は発生せず... という事からの推測ですが、 ・Form_Initialize イベントで処理してる内容 ・フォーム内に特殊なOCXコントロールを配置している のいずれかに問題があるように思います。 何だか後者のような気がするのですが、心辺りは? 、、カレンダーコントロールとか。

noname#10441
質問者

お礼

Form_Initializeに記入はありません。 使用コントロールはテキストボックス、ラベル、チェックボックス、 コマンドボタン、イメージボックスです。 というか、大変申し訳ないのですが自己解決しました・・・。 結果から言いますとブックが壊れていた(?)ようです。 ブックを新規作成し、シート、フォーム、モジュールを既存ブックから 単純にコピーして複製しただけで問題の現象が発生しなくなりました。 OS、Officeのバージョンを戻して試してみましたが特に問題なく動作して ますので、ブックのみが原因だったと思われます。 こんな事もあるのですね・・・。 ブックが壊れたという表現が正しいのかどうかは疑問が残るところですが とりあえずは解決とさせていただきます。 色々とご助言いただきありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

#1です。そうですか、、 では、#2の方のアドバイスどおり、もしDB接続について参照設定があればそれを実行時バインド(CreateObject)に変更してみてはどうでしょうか? ex) ADO接続の場合 Dim DB as Object Set DB = CreateObject("ADODB.Connection") それから、オブジェクト変数をウォッチ式に追加し、ステップインでトレースしてプロシージャの終了時にちゃんと解放されているかチェックしてみて下さい。

noname#10441
質問者

お礼

参照設定では接続してませんしウォッチの確認でも全てNothingになってます。 問題の現象なのですが、単純に Excel(ブック)を開く  →ボタンクリックでフォーム表示   →何もせずにフォーム閉じる    →Excel閉じる の手順だけでも発生してしまいます。 Excelを開いてすぐ閉じただけでは発生しません。一度でもフォームを開くと発生してしまいます。 これだけの操作だとDB接続を行うプロシージャは通っていないのでDBオブジェクト関連の 解放モレということはないと思っているのですが・・・どこかにモレがあるんですかね。 で、さらに謎を深めるようなのですが、Win2000+Office2000で最新にアップデートした状態だと この現象は発生せず、Officeが未アップデート状態、またはWinXPだと発生するのです。 試しに、単純に上記操作だけを行うブックを新規作成してみましたが、問題の現象は発生しませんでした。 これを雛形に少しずつコードをコピーしていって、どこで発生するか探るしかないかな・・。 お手数お掛けして申し訳ないです。 もし何かもっと思い当たる部分があればご回答いただけると有難いです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>Private変数を使用し念のためコードの最後でNothingをセットしています。 Microsoft側の文章には、Dll の設計について触れていますよね。そうなると、自家製でなければやっかいです。 「幽霊プロジェクトの怪」では、特に、Public 変数が問題だとは言っていないのじゃないかしらね。ただ、私個人は、Object 型は、グローバル化はしても、Public なんてしないような気がします。メモリ喰いで、動作を鈍らせるだけだからです。 要するに、Object型の変数の開放で、変数の開放を残したまま終了すると、パスワード・ロックしていた場合は、パスワードを要求してくるっていうことではないかしら? そうしたら、とりあえず、DB(参照設定だったら、CreateObjectに変えてみるとか?)を含めて、Object型の変数の開放していない所を探してみたらいかがですか?

noname#10441
質問者

お礼

回答ありがとうございます。 言い回しはどうあれ参照サイトについてはおっしゃる通り、要はObject型の解放モレということですね。 その点については真っ先にチェックしたんですが該当箇所見つからずです・・・。

関連するQ&A