質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

Excelで原因不明のフリーズが発生

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 13K+

YOS_G-sepc

score 17

前提・実現したいこと

ExcelでVBAを使用したフォームアプリケーションを作成しています。
今回、エラーメッセージすらはかずに落ちるエラーが生じて参っています。

発生している問題・エラーメッセージ

あるフォーム開く際に6割くらいでフリーズが生じてそのまま終了します。
Msgboxで特定を掛けたところコンボボックスの読み出し処理らしきところで止まることはわかりました。
現状は下記のnew_combo関数が怪しいのではないかと考えています。
(コンボボックスを初期化するための関数です)

ちなみに、Excelを起動した後に一度でもフリーズしないであるフォームを開ければ、
Excelを閉じるまではほぼフリーズをしないようです。
また、あるフォームを開く前にソースコードを覘いても同様に以降のフリーズはなくなるようです。

もし、何か原因になりそうなことが有りましたらお教えいただけたら嬉しいです。
以上、よろしくお願いします。

該当のソースコード

'あるフォームとは別のフォーム
'ボタンを押してフォームオープン
Private Sub openForm()
    '自作クラスの自作メソッドを呼び出し
    Dim MC As New myClasss
    MC.myMethod

    'コンボボックスの初期化
    Application.Cursor = xlWait
    ComboList.new_combo
    Application.Cursor = xlDefault
    'フォームを開く
    myForm.Show

    Unload Me
End Sub


'ComboListモジュール
'コンボボックス初期値
Public Sub new_combo()
    myForm.Hide
    'myForm.combo1とmyForm.combo2はコンボボックスオブジェクト
    With myForm
        comb .combo1
        comb .combo2
    End With
End Sub

'コンボボックスデータ一覧
Sub comb(ByRef myCombo As ComboBox)
    With myCombo
        Dim CN As String
        CN = .Name
        If CN Like "*No1" Then
            .AddItem "aaa"
            .AddItem "bbb"
            .AddItem "ccc"
            .AddItem "ddd"
            .AddItem "eee"

            .AddItem "fff"
            .AddItem "ggg"
            .AddItem "hhh"
            .AddItem "iii"
            .AddItem "jjj"

            .AddItem "kkk"
            .AddItem "lll"
            .AddItem "mmm"
            .AddItem "nnn"
            .AddItem "ooo"

        ElseIf CN Like "*No2" Then
            .AddItem "NNNNNN"
            .AddItem "ZZZZZZ"
            .AddItem "KKKKKK"
            .AddItem "AAAAAA"
            .AddItem "JJJJJJ"

            .AddItem "FFFFFF"
            .AddItem "EEEEEE"
        End If
        DoEvents
    End With
End Sub

イメージ説明

補足情報(言語/FW/ツール等のバージョンなど)

Microsoft Excel 2010

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2017/03/27 14:39

    『ある処理』のコードを載せた方が良いと思いますが。もちろん見せられる範囲で。

    キャンセル

  • YOS_G-sepc

    2017/03/27 14:50

    すみません。追記しました。

    キャンセル

回答 5

checkベストアンサー

+2

今回の件に関係あるかどうかは解りませんが、
VBAで暗黙のインスタンス生成で出来たFormのインスタンスを Hide するとインスタンスが(ガベージコレクションのようなものに)回収されてしまうことがあります。

Dim myForm As MyForm
Set myForm = New MyForm


と明示的にNewすることで回収を防げます。

余談ですが、以前試したところ、
フォーム内で Unload Me するより
Set myForm = Nothing の方がリソースの回収が早かった記憶があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 11:56

    念の為追記します。
    myForm の参照は、Unload するフォームとは別の所に持っていてください。

    キャンセル

  • 2017/03/30 12:59 編集

    フォームをインスタンス化したところ、フリーズの改善が確認できました。

    以前からも改善したと見せかけて直ってないということもあったので、
    もうしばらくこれで様子を見てみたいと思います。

    本当にありがとうございました。

    キャンセル

+1

new_combo() が間違っております。

With End

ではなく

End With

です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 08:27

    モジュールが読み込めていないというのは確かにあるのかもしれませんね。

    ただ、ファイルは全て元々1ファイル(xlsm)に収束しているので、
    一度モジュールをそのまま埋め込んで動作するか確認してみます。

    ちなみに、コンポーネント?の破棄というのは明示的にできるものなのでしょうか?
    また、コンポーネントってExcel自体に含まれる様々なオブジェクト(ユーザーフォーム等)という認識なのですが、これはあっているのでしょうか?

    キャンセル

  • 2017/03/28 10:57 編集

    コンポーネントは、ADOやDAOというDB接続する時につかうコンポーネントを指しています。
    ちなみにVBA自体は、EXCELでもWORDでもACCESSでもPowerPointでも動かせます。

    オブジェクトはマイクロソフトがVBAとして提供しているものを指します。FormとかComboBoxとか。
    EXCEL自体に含まれるというより、EXCELで利用できるVBAに含まれているという感じですね。

    メモリリークの回避方法、確か何かあったと思うのですが
    今調べてみたところ変数に対して=Nothingを入れることで参照破棄はできますが、
    やっても意味ないって書かれていますね。
    https://www.moug.net/tech/exvba/0150027.html

    オブジェクトに対しては、ここの一番下にありますが、Terminateイベントというものがあります。
    http://home.att.ne.jp/zeta/gen/excel/c04p28.htm
    ただこれも、異常終了した場合にイベントを受け取れないので根本的な解決には至りませんね。

    いまいち決定打が出ず、すみません。

    キャンセル

  • 2017/03/30 10:00

    なるほど、ご説明ありがとうございます。
    DBは使用していないのでコンポーネントは考えなくても良いということになるのですかね。

    エラーが出ずにいきなり落ちるあたり僕もメモリが怪しいのかなぁと考えてはいるのですが、
    Nothingしても、イベント抑止してみてもなかなか効果が出ていない現状で難しいです。

    キャンセル

+1

特に問題点はわかりませんでした。
(lazhuwardさん指摘の件はありますが、転記ミスだと思いますし)
気になるのは、以下の部分でしょうか。

Dim MC As New myClasss
MC.myMethod


myMethodは中で何をしているのでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/27 16:46

    DoEventsも消しましたが関係なさそうでした。
    もともと、フリーズに悩まされてからコントロールを呼び戻せないかという目論見で入れていたものです。

    キャンセル

  • 2017/03/27 16:49

    そうですか。
    今わかる関係しそうなところは以上です。
    あとは先ほども書いたようにイベントの競合や連鎖が発生していないかなどご確認ください。
    お役にたてずに申し訳ないです。

    キャンセル

  • 2017/03/27 16:54 編集

    Changeイベントで反応するコンボボックスはフォームの中にいくつかはありますね。
    イベントが起きないように抑止したらいけるのか試してみたいと思います。

    相談に乗っていただきありがとうございました。

    追記:
    Application.EnableEvents=FalseとTrueでcomb関数内を括ってみましたが、改善は見られませんでした。

    キャンセル

+1

横入り失礼します。

私なりに気になった点がございますので、ご確認いただければと思います。
(問題が無ければ忘れてください。)

本マクロモジュールの挿入位置が、VBAProject(FUNCRES.XLASM)になっていませんか?
これについては、VBAProject(Book1)の位置に挿入されていなかったため
Excelが原因不明で落ちる事象を経験していますので…。

追記:
当方で「空白のブック」を新規作成し、VBEを開いた直後の構成画像ですが…。
注:「RibbonnX_Code」はOfiice365のコードですので関係ありません。念のため。
VBE構成

構成自体が全く異なっているのを見ると、Excel自体に不具合が
生じているかもしれません。
もしそうであれば、Excelの再インストールが必要になるかもしれませんが…。

他の方で、比較の上「私の画面の構成と自分の構成は違う」という方が
おられるかもしれません。念のため、出来れば他の方や他のPCで確認してみて下さい。
会社のPCであれば、上司経由で指定の管理部署に依頼する必要がありますが。

尚、発生する可能性としては、
・他のソフトウェアインストール時の干渉や不具合による副作用によるもの。
・ウィルス等によるもの。
・マクロの実行によるもの(不正コード等)。
があります。
ご参考までに。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/30 13:28

    お手数をおかけしました。
    私が言いたかったのはそこではなく、「マクロの挿入位置」で比較すると、
    「標準モジュール」や「フォーム」といったものが、「FUNCRES.XLAM」に
    含まれていることが問題では?という事でしたが…。

    まずは、問題が解決して良かったです。
    こちらの的外れな指摘で混乱させてしまったみたいで、申し訳ありませんでした…。

    キャンセル

  • 2017/03/30 14:07

    僕の画像、FUNCRES.XLAMに変なもの含まれていたりしましたかね?
    全て必要なものは(塗りつぶし).xlsmに含まれていたという認識ですが。

    何がともあれ、お陰様で解決できました。
    お付き合いいただきありがとうございます。

    キャンセル

  • 2017/03/30 16:11

    私の勘違いでした。大変申し訳ございません。
    重ねてお詫び申し上げます。

    キャンセル

0

新しいファイルに移して動作確認することも視野に入れてみてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/30 09:51

    あまりにプロジェクトの構成が大きくなってしまっているため、移すことは躊躇しています。
    どうしても改善が見慣れないようであれば検討はしてみます。

    キャンセル

  • 2017/03/30 09:58

    問題切り分けのためですので、該当部分だけで良いです

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る