[[20060413074437]] 『アプリケーションエラー』(banzai) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『アプリケーションエラー』(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.