- ベストアンサー
エクセルVBAでフォームShow時にオートメーションエラーが発生する
- エクセルVBAで1つのフォームをShowする際に、突然「オートメーションエラー」というエラーメッセージが表示される問題が発生しました。
- VBAのコードを開いているとエラーは発生しないため、問題の解決方法を探しています。
- ファイルの名前を変更するなどの対策も試しましたが、解決していません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >只今、ファイルを再作成し、すべてのエラーが出なくなりました!! それは、おめでとうございます。 >VBAは1000字以上記入たくさんしているのですが、問題なのでしょうか? ここらは、もうご承知のことだと思いますが、VBAは、VBとは違って、実際には、メモリ制限にぶつかることがあります。それで、大きなコードを書くとき、UserForm は、ローカルモジュール(オブジェクトを持っている)ですから、標準モジュール(オブジェクトを持っていない)に、逃がすように書いたほうが良いような気がします。 特に、1つのプロシージャは、あまり長く書かないほうがよいということです。(100行程度まで)パーツ・パーツでコードを作っていくということです。 また、標準モジュールも、その内容(例えば、文字列を処理する、インターネットにアクセスする)によって、モジュールを替えて、ひとつの標準モジュールの仕事は同じ系列の仕事にする、という暗黙のルールがあります。 >アドインについては、勉強不足でよくわかっていません。 アドインも本格的に勉強する、難しいです。詳しいのは、MSから出ている『プログラマーズガイド』なんていう本に出てきますが、私たちが知りたいのは古いバージョンの本にしか出てこないのです。(ブックオフなどの古本屋で、数百円で手に入ったりします。)本格的に作ると、細かな部分が、分からないことが出てきてしまいます。今のスタイルは、できるだけ、Office 97のVBAの資料を集めるとプラスになることが多いです。それ以降のものは極端に難しいです。Vista + Office 2007 でも、理屈は同じです。 >知り合いのために、ちょっと作ろうかなと思ったフォームでこんなに手こずるとは思ってもいませんでした。 私の場合は完成しなかったです。もう数年前に、掲示板ではほとんど解答ができたので、自由にできるつもりになっていたのでい。それで知り合いから仕事の依頼を請けて、しばらくやってみて、1週間では解決できないとわかったので、その時点で相手に、できない旨とお詫びを添えて連絡を入れました。今、されていることとは違うにしても、同じくUserFormが問題でした。その後、原因を見つけるのに、1年以上掛かりました。 なお、私は、だいたいは、丸3日で形にならなければ、できないにします。 何かのお役に立てれば幸です。
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 全体的なコードの雰囲気は、アドインのようです。 > (1)多数あったコンボボックスをテキストに変更 →解決せず > Call com01_開始処理(a,b,c) /使用するシートを表示し、マクロのみ変更可とする この2行の関連性はありますか?テキストボックス(コンボボックス)のRowSourceは、空になっているのですか? それと、文の最後の部分が気になりました。 >1000字以上でエラーになってしまうため、見づらくすみません。お礼もろくに書けずすみません。 ここに載せられない1000字というものも、実は、私は、削除覚悟で書いたことがあります。その時、ここに入ったけれども、それでも、かなり大きなサイズです。それは、いろんな問題が発生する可能性があります。 これについてのアドバイスとしては、まず、UserForm 自体に入れるものと、そうでないものは、きちんと区分けすることですね。それは、前回書いたメモリの配分の問題です。 ところで、実際に同じ立場の場合、経験としては、だいたい、2週間程度、いじっていて、解決しないと、その辺りを見切りだとして、最初から作り直すことをします。かなりレベルの高い問題を抱えている可能性があります。私自身が、同じように、どのようにもならないところに入り込んだことがあります。 確かに、コードを失うのはつらいのですが、このレベルになると、他人に頼るということもできないのです。原因の場所が特定できない場合、または特定できても、根本的にメモリの配分などがある場合は、やむをえないのです。ただし、同じパターンで書けば、同じハメに入ってしまうこともあるのですが。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 たぶん、リンク先は役に立たないと思います。 まあ、Focus している最中に、Hide したらエラーが出るでしょうね。(^^; >(2)showの使い方がおかしい > a.現在、showで出力し、unload Meで開放している状態です。 前回の話で、私は、別のことばかり書いてみました。他の方も書いていたように、ソースをまず見るべきでした。私の書いたメモリのことは、そんなに的外れではないにしても、つい余計なことばかり書いてしまいました。(自分がバカみたいでした) コードを見せていただけますか? リンク先の質問はきまった回答がありますが、#1コードでオートメーション・エラーが出ること自体は、興味深いです。解決もなにもありません。それ自体は使わなかったということですね。
お礼
回答をいつもありがとうございます。今までの現象をまとめてみました。 1.コンボボックスに入力時強制終了 (1)多数あったコンボボックスをテキストに変更 →解決せず (2)強制終了しないフォームをコピーして再作成 →解決(入力しても強制終了しなくなる) 2.IMEに問題ありかと思い、再度設定をZEROにして実行 →強制終了される <問題発生> 1.(2)にて再作成をしたユーザフォームを開くと「オートメーションエラー」が発生※但し、VBAのコードを開くと発生しない <対応考え中> a.フォームの名前を変更 →解決せず b.もう一度マクロを再作成 →対応中 =ソース= フォーム:全16個 エラーのフォーム:コンボボックス2個 テキスト2個 マルチページ5個 内にテキスト9個のフレームが5つ 標準モジュール Sub h01_納品書作成() Call com00_名称取得(a,b,c) /使用するシート名等を取得しています。 Call com01_開始処理(a,b,c) /使用するシートを表示し、マクロのみ変更可とする frm11.Show /問題のフォームShow Call com02_終了処理(a,b,c) /使用するシートを非表示にし、保護 End Sub フォーム Private Sub UserForm_Initialize() Call com00_名称取得 /使用するシート名等を取得しています。 Workbooks(mcr_fi).Activate Worksheets(frm_sh).Select '最終行・列 Call com11_最終行列検索(a,b,c) /使用するシートの最終行の取得*3 'コンボボックス設定 'スクロール MultiPage1.Value = 0 frm11.Scroll fmScrollActionBegin, fmScrollActionBegin 'フォーカス txtNohDate.SetFocus End Sub Private Sub cmdCancel_Click() Unload Me End Sub 1000字以上でエラーになってしまうため、見づらくすみません。お礼もろくに書けずすみません。
補足
こんばんは。 回答のお礼が遅れてしまい、本当にすみません。 しかも、補足の欄ですみません。 実は、問題の2002のPCが現在、使えない状況でして。。。 (PC故障ではありません。ちょっと持っていかれてしまいました) 2~3日中には、もう一度今回の現象をまとめて、 ご報告したいと思っております。 本当に、親切に教えていただいているのに申し訳ないのですが、 こんな私も見捨てずによろしくお願いいたしますm(..)m いつもありがとうざいます。 次回はお礼の欄に書かせていただきます。
お礼
いつもありがとうございます。 只今、ファイルを再作成し、すべてのエラーが出なくなりました!! 本当にありがとうございます。 アドインについては、勉強不足でよくわかっていません。すみません。これから勉強いたします。 開始処理は、非表示されているシートを表示させているだけなので、フォームとの関連性はありません。 コンボボックスは、InitializeではClearせず、設定しているのですが、他の設定時には、必ずClearしてから設定しています(RowSourceプロパティの設定はありません) 1000字の件は、このお礼内容欄のことでした。すみません。わかりづらく書いてしまって。。。VBAは1000字以上記入たくさんしているのですが、問題なのでしょうか?ちょっと不安になってしまいました。 知り合いのために、ちょっと作ろうかなと思ったフォームでこんなに手こずるとは思ってもいませんでした。 Wendy02様のおかげでなんとか、終了できそうです。 本当にありがとうございます。 初めて作成したフォームだったため、修正等たくさんしてしまい、それのためにファイルが壊れちゃったのかな?という気がします。 これからはWendy02様のように回答ができるように頑張ります。 本当にありがとうございました。