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

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

ただいまの
回答率

90.49%

  • VBA

    1803questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1540questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,115

YOS_G-sepc

score 14

前提・実現したいこと

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/27 16:13

    おっしゃるとおりです。
    修正しました。

    ご指摘ありがとうございます。

    キャンセル

  • 2017/03/27 16:34

    転記ミスですか。

    でしたら、以下のことを試してみると良いと思います。
    ・落ちるフォームを開いた場合は、必ず6割ぐらいで落ちますか?
    ・落ちないフォームを開いた場合は、必ず100%落ちませんか?
    但し、同じ条件にするために、ファイルを開いて実行し、必ず閉じること。

    とりあえず、10回ぐらい試してそれが確証された場合、
    恐らくメモリを食い潰しているか、ネットワーク越しに開いているかだと思います。

    キャンセル

  • 2017/03/27 16:41 編集

    >ネットワーク越し
    自コンポーネントでしたね。訂正です。
    それか、myForm.Hide が new_combo() の中にあるからじゃないでしょうか。
    'コンボボックスの初期化 の前に持ってきたら良いのでは?

    キャンセル

  • 2017/03/27 17:30 編集

    "別のフォーム"から呼び出せるフォームは3種類あるのですが、new_comboを呼び出しているフォームは必ずいくらかの確率で落ちているようです。
    そして、最初2回はなんら問題はなく開けていたのですが、それ以降は10回目までフリーズするという結果になりました。
    しかし、一度でもソースコードを開くと何の問題もなく開くようになります。
    また、myForm.Hideの移動も行いましたが、特に影響は見られませんでした。

    自コンポーネント越しとはどのような状態を示すのでしょうか?

    キャンセル

  • 2017/03/27 17:53 編集

    あ、ごめんなさい。
    自コンポーネントだからネットワーク越しに外部モジュール読み込んではないかな。。。
    と思ったので独り言です。すみません。

    > そして、最初2回はなんら問題はなく開けていたのですが、それ以降は10回目までフリーズするという結果になりました。
    > しかし、一度でもソースコードを開くと何の問題もなく開くようになります。

    これはもしかしたら、外部モジュールとして読み込みが出来てないからではないでしょうか。

    推測ですが
    ・ソースコードを開いたら、呼び出し元と呼び出し先のソースが明示的に見えているので、プログラムが把握できている。
    ・ソースコードを開いていない場合は、呼び出し元と呼び出し先のソースがプログラムが判断できないためエラーになる。
    #変数などが把握できていないとか、コンポーネント破棄が上手く出来ていないとかでエラーになる?
    ということは考えられませんか?

    この場合は、モジュールの読み込みが上手く出来ていないのではないかと思います。
    ファイルを同じフォルダにおいて実行してみるとか、プログラムを全て一つのファイルの中に書いてみるとか
    やってみるとわかるかもしれません。

    キャンセル

  • 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:17 編集

    回答ありがとうございます。

    該当部の内容については具体的なソースの提示はできませんが、
    新しいExcelアプリケーションのインスタンスを生成して、
    データの読み取りをやっています。
    その他にプロパティの設定などの処理が含まれます。

    キャンセル

  • 2017/03/27 16:21

    問題点の切り分けとして、myMethodを呼び出さない場合(コメントアウトする)でも問題が発生するかご確認ください。

    キャンセル

  • 2017/03/27 16:34 編集

    クラスの部分をコメントアウトしてやってみましたが、同様のフリーズを確認できました。
    クラスをはじめに呼び出したことに対する問題はなさそうです。

    ちなみに実際にコンボボックスを初期化する個数はここに提示しているよりもずっと多くなるのですが、こういった点が問題になることもあるのでしょうか?

    キャンセル

  • 2017/03/27 16:40

    確認ありがとうございました。
    予想は外れました。すみません。
    あと気になるところは、combの中でDoEventsを呼んでるのも気になります。
    DoEventsを呼ぶことで他のイベントが発生し、イベントの競合とか連鎖が起きているとか。
    こちらもコメントアウトしてみてください。
    少なくともこのタイミングでDoEventsを実行する必要はないと思います。

    キャンセル

  • 2017/03/27 16:43

    >初期化する個数はここに提示しているよりもずっと多くなるのですが(省略)
    個数とはAddItemの数でしょうか?
    AddItemでもIf文の数でも影響はないと思います。
    但し、対象とするコンボボックスにイベント処理があったりすると影響があるかもしれません。
    それは先ほどコメントしたDoEventsが影響するからです。

    キャンセル

  • 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 09:27 編集

    落ちた直後の状態を確認しました(本文に画像追記)。
    マクロ(コンボボックスの初期化モジュール)の位置は本体に含まれているようです。

    キャンセル

  • 2017/03/30 11:03

    EUROTOOL.XLAM、SOLVER.XLAMは調べてみるとExcelに後から追加するアドインなそうなので、
     https://support.microsoft.com/ja-jp/help/972910
     http://www.hello-pc.net/howto-excel/solver/
    構成の相違は特に問題ないような気がします。

    ATPVBEAN.XLAMも分析ツールなようですし。

    キャンセル

  • 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で質問しよう!

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

関連した質問

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

  • VBA

    1803questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1540questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。