Excel が終了すると、VBA プロジェクトのパスワード プロンプトが表示されます。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:280454
現象
マクロを実行する、ActiveX ダイナミック リンク ライブラリ (DLL) をパスワードで保護された VBA プロジェクトを含むブックへの参照を渡すと後、は、Excel を終了すると、VBA プロジェクトのパスワードを求められます。
原因
この問題は、ActiveX DLL がパスワードで保護された VBA プロジェクトを含むブックへの参照を正しく解放しない場合に発生します。
解決方法
この問題を解決するには、クラスを終了する前にブックの参照が正しく解放されるように、ActiveX DLL 内のクラスをデザインします。

クラスのTerminateイベントは発生しません、一般的なシナリオはオブジェクト間の循環参照があります。循環参照が作られるケースというのは、例えば親オブジェクトが子オブジェクトを作り、その子オブジェクトに親への参照を渡す場合です。子の親への参照を解放しない場合、親オブジェクトは終了しません。

次のセクションの手順では、オブジェクト間の循環参照がどのように発生する可能性があり、Excel の終了時に、オブジェクトが保護されたブックの参照を保持している場合に、パスワード プロンプトが表示されるかを示しています。以下は、いずれかのオブジェクトを終了させることができるように、循環参照を解除するオブジェクトに対してメソッドを呼び出すには、解像度は記載されています。
詳細

現象を再現する手順を実行します。

  1. Visual Basic では、新しいActiveX DLLプロジェクトを作成します。プロジェクト名をExcelTestに変更します。
  2. ParentClassClass1の名前を変更し、 ParentClassに次のコードを追加します。
    Option ExplicitPrivate oChild As ChildClassPrivate WorkbookRef As ObjectPrivate Sub Class_Initialize()   Set oChild = New ChildClass   Set oChild.Parent = MeEnd SubPrivate Sub Class_Terminate()   Set oChild.WorkbookRef = Nothing   Set oChild.Parent = Nothing   Set oChild = Nothing   MsgBox "ParentClass Terminate Event"End SubPublic Sub Clear()    Set oChild.Parent = NothingEnd SubPublic Sub SetWorkbook(o As Object)    Set WorkbookRef = o    Set oChild.WorkbookRef = oEnd Sub					
  3. 別のクラス モジュールを追加、名前をChildClassChildClassに次のコードを追加します。
    Public Parent As ParentClassPublic WorkbookRef As Object					
  4. "ExcelTest.dll"を作成します。
  5. Microsoft Excel で新しいブックを作成します。開く Visual Basic エディターの alt キーを押しながら f11 キーを押します。
  6. [挿入] メニューからは、VBA プロジェクトに新しいユーザー フォームを追加するのにはユーザー フォームをクリックします。
  7. [挿入] メニューからは、VBA プロジェクトに新しいモジュールを追加するモジュールをクリックします。新しいモジュールに次のコードを追加します。
    Public o As ObjectSub MyMacro()    UserForm1.Show    Set o = CreateObject("ExcelTest.ParentClass")    o.SetWorkbook ThisWorkbook    'o.Clear  '<=== Remove comment to demonstrate the workaround.    Set o = NothingEnd Sub					
  8. ツール] メニューの [ VBAProject のプロパティを選択します。[表示されるダイアログ ボックスでプロジェクトを表示するためにロックを選択する] をクリックします。 [保護] タブをクリックします。パスワードを入力し、[ OK] をクリックします。
  9. ブックを保存して閉じます。
  10. ここでは、Excel を終了すると、VBA プロジェクトの passwordappearing の問題を再現します。
    1. 手順 9 で保存したブックを開きます。

      Microsoft Office Excel 2007 のマクロを無効になっていることを示すセキュリティの警告が表示された場合、は、オプションをクリックします。[セキュリティ] ダイアログ ボックスでこのコンテンツを有効にする] をクリックし、[ OK] をクリックします。
    2. 次の操作を実行します。
      • Excel 2007 では、[コード] で [開発] タブの [マクロ] をクリックします。[開発] タブがない場合、[ear Microsoft Office ボタンをクリックして、[ Excel のオプション] をクリックして、基本リボンの [開発] タブを表示する] チェック ボックスを選択する] をクリック、[ OK] をクリックします。
      • Microsoft Office Excel 2003 または Excel の以前のバージョンでは、[ツール] メニューの [マクロ] をクリックし、[マクロ] をクリックします。
    3. 一覧で、入力を選択し、し、[実行] をクリックします。
    4. マクロを表示するユーザー フォームを閉じます。
    5. Microsoft Excel を終了します。
    6. Excel を終了すると、VBA プロジェクトのパスワードを求められます。
上記の手順を使用するには、問題の再現には、何もExcel マクロでそのオブジェクトを設定した後でもParentClassクラスのTerminateイベントは発生しないことに注意してください。(「ParentClass 終了イベント」メッセージをメッセージ ボックスが存在しないことを示すこのイベントは発生しませんでした)

Excel ブックへの参照が正しく解放されるように、問題を解決するには、Excel のマクロで指定した行からコメントを削除を選択し、マクロを保存し、テストを繰り返します。ブックの参照が正しく解放されると、オブジェクトのTerminateイベントは発生し、不要になった求められます VBA プロジェクトのパスワードで Excel を終了するとします。
XL2007

警告: この記事は自動翻訳されています

プロパティ

文書番号:280454 - 最終更新日: 09/05/2015 07:31:00 - リビジョン: 8.0

Microsoft Office Excel 2007, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Visual Basic 6.0 Professional Edition

  • kbexpertisebeginner kbprb kbmt KB280454 KbMtja
フィードバック