[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『アプリケーションエラー』(banzai)
エクセル2003ウインドウズXP利用です。 エクセルのユーザーフォームを開いてコマンドボタンなどの操作を行い、 ファイルを上書き保存します。その後、そのファイルを開いて ユーザーフォームを開こうとするとアプリケーションエラーで 強制終了になります。 上書き保存したファイルは保存前のファイルより 10%程度ファイルが大きくなっていますが、 シートのデータはほとんど変更がありません。 また、大きくなったファイルを開いて、VBAの画面でコードを表示させて、 何も編集せずに閉じて、ファイルを上書き保存をすると 以前のファイルサイズに戻り、ユーザーフォームも開きます。 このような現象がなぜ起こってしまうのか? 解決方法がないのか?よろしくご教示願います。
下記はExcel2000で修正済み、とあるから該当しないかも。 [XL2000] ユーザー フォームを表示する VBA マクロ コードの実行時に Excel が応答を停止する http://support.microsoft.com/?scid=kb;ja;317850&spid=1741&sid=global [XL2000]UserFormオブジェクトでSaveCopyAs後にSaveを使用するとエラー http://support.microsoft.com/default.aspx?scid=kb;ja;264712 後はメモリ消費関係があやしいかも。読むのに気合がいりますが。 「Excel 世界の迷子と、メモリの改善」 http://www.microsoft.com/japan/msdn/columns/askgui/askgui05222001.asp でも、回答者が再現できないことには解決につながらないので、 どんな規模のフォームを作って、どんなコードで、何を行っているのか 書いてみてはどうでしょうか。 (みやほりん)(-_∂)b
追記 あとは、ステップインでどのコードでアプリケーションエラーになるか、 ある程度アタリをつけてほしいですね。 (みやほりん)(-_∂)b
ありがとうございます。 問題のコードですが、ステップインでコードを実行すればなんら問題なく処理を 実行してくれます。 コードの最初(もしくは適当なところ)の処理にブレークポントを設定して 実行させた場合も、 ブレークポイントで一旦止まった後、 処理を続行すると何もエラーが起きません。 そのコードをアドイン形式に変更して読み込んでも、やはり同じ症状がでます。 結局現在は、オートオープン時にそのファイルを開いたとき、 マクロを無効にして開き、ファイルを上書き保存させてからマクロを有効にして・・ という手順でファイルを開いています。 どこかのサイトで、マクロを有効にして開いた場合、ファイルを保存しなくても マクロ内部にゴミデータが出てしまうためファイルサイズが増幅していしまい、 マクロを無効にして開いて保存すれば マクロ内がリフレッシュされるというのを 見つけたからです。 とはいえ根本的な解決ではないのですが・・ コード自体はそれで止まることなく動いていますが、理由がさっぱりわからない ですし、ファイル自体は小さくならないので、単に症状が出ていない・・・ というだけのことです。そのファイルの増幅を抑えたり元に戻す方法がわかれば いいのでしょうが・・ (banzai)
>どこかのサイト・・・ 以降の文言はおそらく正確ではないと思いますが、 「マクロ内部にゴミデータが出てしまうため」とはおそらく間違った認識です。 (マクロでマクロの内容が変わってしまう、というのはマクロウィルスの技術です) 直前に作成したオブジェクトへの参照などがメモリに残ってしまうことはあるかもしれません。 おそらく、オートオープンマクロに何らかの原因があると思われます。 ファイル容量増については、単に上書き保存を繰り返すだけでも増えていくケースが あるので、それが現象と関連があるかどうかも現時点では断言できません。 コードも示されず、起こっている現象をただ述べられるだけで「困った」では 一向に進展しないです。 私はこれ以上「可能性」だけを調べるために時間を割くことはできませんので、 コードを示すことはできませんか?。 (みやほりん)(-_∂)b
貴重なお時間割いていただいてありがとうございます。 オートオープンのコードををのせます。 Sub auto_open()
Dim MyBar As CommandBar Dim MyMenu As CommandBarButton
Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True
On Error Resume Next
Set MyBar = Application.CommandBars.Add(Name:="家屋評価メニュー", Position:=msoBarFloating, Temporary:=True) Set MyMenu = MyBar.Controls.Add(Type:=msoControlButton) Set MyMenu1 = MyBar.Controls.Add(Type:=msoControlButton)
With MyMenu .Caption = "入力開始" .Style = msoButtonIconAndWrapCaption .TooltipText = "入力画面を表示します" .FaceId = 59 .OnAction = "開始" End With With MyMenu1 .Caption = "初期化" .Style = msoButtonIconAndWrapCaption .TooltipText = "データを初期化します" .FaceId = 59 .OnAction = "初期化" End With
MyMenu.Width = 80 MyMenu1.Width = 80
Application.CommandBars("家屋評価メニュー").Visible = True Application.CommandBars("家屋評価メニュー").Height = 400 Application.CommandBars("家屋評価メニュー").Width = 400
End Sub
あと、ユーザーフォームを立ち上げたときに起こるコードがあやしい? と思っているので、その部分をのせます。 Do〜Loopでエラーが出て強制終了がかかることが何度かありました。 For j = 4 To 24 x = Worksheets("点数2").Cells(j, 14).Value If x = Empty Then GoTo jisyori100 End If z = 0
On Error GoTo jisyori100
Set セル番号 = Columns("A").Find(x)
If セル番号 Is Nothing Then GoTo jisyori100 End If
firstセル = セル番号.Address p = セル番号.Row q = セル番号.Column
Do Set セル番号 = Columns("A").FindNext(セル番号) nextセル = セル番号.Address セル番号2 = セル番号
If z = 0 And nextセル = firstセル Then Exit Do End If
If nextセル <> firstセル Then z = z + 1 End If Loop While nextセル <> firstセル
waku = Range(Cells(p, 5), Cells(p + z, 6)).Address
If j = 4 Then UserForm1.ComboBox3.RowSource = waku UserForm1.ComboBox4.RowSource = waku UserForm1.ComboBox5.RowSource = waku End If
If j = 5 Then UserForm1.ComboBox6.RowSource = waku UserForm1.ComboBox7.RowSource = waku End If
If j = 6 Then UserForm1.ComboBox8.RowSource = waku UserForm1.ComboBox9.RowSource = waku UserForm1.ComboBox10.RowSource = waku End If
If j = 7 And moku = True Then UserForm1.ComboBox12.RowSource = waku UserForm1.ComboBox13.RowSource = waku End If
If j = 8 And moku = False Then UserForm1.ComboBox12.RowSource = waku UserForm1.ComboBox13.RowSource = waku End If
If j = 14 Then UserForm1.ComboBox11.RowSource = waku End If
If j = 15 Then UserForm1.ComboBox230.RowSource = waku UserForm1.ComboBox232.RowSource = waku UserForm1.ComboBox233.RowSource = waku UserForm1.ComboBox234.RowSource = waku UserForm1.ComboBox235.RowSource = waku UserForm1.ComboBox236.RowSource = waku UserForm1.ComboBox237.RowSource = waku UserForm1.ComboBox238.RowSource = waku UserForm1.ComboBox239.RowSource = waku UserForm1.ComboBox240.RowSource = waku UserForm1.ComboBox241.RowSource = waku UserForm1.ComboBox231.RowSource = waku End If
jisyori100: Next j
(banzai)
検証をしていますが、(コードの書き方で気になる部分があることを除けば) とくにご提示のコードにExcelが強制終了しそうなマズイ部分はみあたりません。 現時点では他の部分に原因があることも考えられますが、 ご提示のコード中にて修正するとよいであろうと思われる部分だけ、 (解決には結びつかないですが)とりあえず。 Columns("A").Find(x) および Columns("A").FindNext(セル番号) 検索対象とするシートを明示的に指定してください。 指定しない場合はアクティブシートが対象になります。 また、Findメソッドの引数、LookIn、LookAt、SearchOrder、および MatchByte は省略しないほうがよいようです。(省略すると前回の検索の設定が無条件に適用) セル番号2 = セル番号 「セル番号2」は変数だと推測しますが、セル番号.Valueなどと取得するプロパ ティを明示的に指定してください。(既定のプロパティに頼らない) ただ、このステートメントがDoLoop内で実行される目的は理解できません。 また、Setを使用するオブジェクト変数は Set 変数 = Nothing による変数への参照の解放を行ってください。(これは念のため) それにしても、「ComboBox231」とは・・・本当にそれだけの数のコンボボックスが? だとすると、その辺にも問題がありそうな気が。 ちなみに、(今になって気がかりになってきたのですが)banzaiさんの言うところの 「強制終了」とは「エクセルそのものが強制終了」してしまうことですよね? そのつもりでやっているのですが。 (みやほりん)(-_∂)b
ありがとうございます。 まずはコードをちゃんとした形に直してみてから再度エラーが出ないか試してみます。 エラーはユーザーフォームを開いた時にエクセルのエラーでアプリケーションエラー が表示されて、エクセルが強制終了になります。 上書き保存で2回は大丈夫なのですが、3回目にファイルを開いてユーザーフォームを 表示させようとするとこのようなエラーになります。 ファイルサイズが、1.8MBが3回目に起動するときには2.4MBになっているます。 コンボボックスですが、全部で40個くらいあります。 番号は配置ごとにわかるように1からはじまるものと、230からはじまるものにわけて 作成しています。 出来ることなら、ファイル全部を検証していただけたらいいのでしょうが・・ 直接的な件ではないのに丁寧にご指摘頂いて本当にありがとうございます。
(banzai)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.