2016-07-19 18 views
0

プロジェクトに大きなユーザーフォームがあり、メモリに読み込まれるときに問題が発生します。 Userform_Initializeイベントにはエキゾチックなことはありません(コンボボックスに入力してデフォルトのプロパティを設定するだけです)。 ユーザーフォームがそれほど大きくない(KBで測定された)数週間前にすべてうまくいきました。最初は、ワークブックが壊れていて、すべてのユーザーフォーム、モジュール、クラスをエクスポートし、新しいワークブックに再インポートした後、いつものようにプロジェクトをコンパイルしていました。これで問題は解決されませんでした。面白いことに、をinitializeイベントの先頭に置き、コードをステップ実行すると、すべて正常に動作します。Excel VBAプロジェクトがコンパイル後にクラッシュする

主なアイデア

これは私は、このようにメモリにユーザーフォームをロードするプロセスは、典型的なより長いを取って、問題の原因は、ユーザーフォームが非常に大きいという事実であることを考えるようになりました負荷。基本的には、vbエディタはinitializeイベントでコードを実行し続け、まだメモリにない可能性のあるコントロールにアクセスしようとしています。

私は、問題のユーザーフォームの大きさのかなり良いアイデアを得るためにいくつかの原油分析を行っています。ユーザーフォームがエクスポートされ、空のブックに再インポートされました。ユーザーフォームのないワークブックは30 KBで、ユーザーフォームは350 KBを超えていたので、ユーザーフォームは320 KBであると判断できます。

私はプロジェクトで大規模なエラー処理がありますが、この特定のエラーがinitializeイベントで発生していると特定できないことに注意してください(この特定のイベントではエラー処理が不可能です[Bovey、プロフェッショナルエクセルの開発、ページ489])。

質問:時間遅延(WindowsのAPIを使用して、例えばApplication.WaitまたはSleep)を除いて、クラッシュを回避するための別のアプローチはありますか?


UPDATE
これは、アプリケーションを遅らせることはどちらか確実に動作しなかったことが判明しました。実際にInitializeイベント全体を無駄に削除しました。元の投稿で言及していたことを忘れていたことの1つは、Debug -->> Compile VBA Projectの機能を悪用していたことでした。下の私の答えを見てください。

+0

ブロックでコードを試したことがありますか?問題が何であるかはコンボのトリガーの可能性があります。 –

+0

438のようなクラッシュの前にエラーメッセージが表示されますか? – cyboashu

+0

@ Nathan_Sav、そうです。私はコードのすべてのサブセクションにコメントして、アプリケーションを実行し、プログラムはまだinitializeイベントでクラッシュします。 –

答えて

0

私の同僚は、しばらくの間、これを処理した後、ランダムなコード行をコメントしただけで(ランダムモジュール内のUserForm_Initializeではなく)、ファイルを保存して問題なく再オープンしました。この問題はコード内ではなく、Debug -->> Compile VBA Projectであることがわかりました。ほとんどの場合、私はDebug -->> Compile VBA Projectを使用しています。私はそのファイルを保存し、非常に同じコンパイル済みファイルで開発を続けます。それがすべて言われて実行されたら、おそらくDebug -->> Compile VBA Projectを2週間かけて約100回実行します。私はその後、this website上のチップピアソンからこのコメントを見つけました:

VBAコードを使用すると、 エディタに入力し、プレーンテキストとして保存されることはありません。入力は即座にプラットフォームに変換され、OpCodesと呼ばれるバージョンに依存しないバイトコード に変換されます。これらのOpCodeは です。画面上に表示されているテキストに変換されます。 プロジェクトをコンパイルすると、コンパイラはこれらのOpCodeを ExCodesと呼ばれるプラットフォームおよびバージョン固有のコードに変換します。 コードを実行すると、ランタイムはExCodesを読み取り、ExCodesに基づいてプロジェクトに代わって実際のマシンコード を実行します。このプロセス全体は、 で、原則としてJavaとJava Virtual Machineの仕組みと似ています。

あなたはテキストファイル、テキストからのコードはバック (ロブ・ボベイのコードクリーナーはまったく同じものです)VBAにファイルそして すべてのモジュールと再インポートを削除するには、すべてのVBAコードをエクスポートした場合、あなたは にファイルサイズの減少を見せます。これはExCodesが でパージされ、まだ再作成されていないためです。次に、プロジェクトをコンパイルすると、 のOpCodesがExCodesに加えて格納されるため、ファイルサイズが大きくなります。

コードをコンパイルする必要はありません。必要に応じてVBAは自動的に を実行します。ただし、Compileコマンドでも構文は チェックされていますが、実際の唯一の目的です。

そして、これはロブボベイから自身が(あなたはまた、そのウェブサイトでクリーナーロブボベイのコードを見つけます)hereを発見された:

をジャンクコードの多くはに蓄積VBAのプログラムを作成するプロセスの間、あなたのファイル。ファイルを定期的に清掃しないと、この余分な手荷物に起因する奇妙な問題が発生します。プロジェクトのクリーニングには、すべてのVBComponentの内容をテキストファイルにエクスポートし、コンポーネントを削除してからテキストファイルからコンポーネントをインポートします。

私は元の質問で上記のようにしました。私はすべてのモジュールをエクスポートし、それらを新しいExcelワークブックに再インポートし、関連するライブラリを追加しました。(私が以前のように)Debug -->> Compile VBA Projectを実行しませんでした。私はそれ以来何の問題もありませんでした。

+0

テンプレートを署名してパスワードで保護したい場合、コンパイルをスキップできません... – aurel

関連する問題