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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

5回答

23089閲覧

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

YOS_G-sepc

総合スコア29

VBA

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

0グッド

0クリップ

投稿2017/03/27 05:33

編集2017/03/30 00:29

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

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

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

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

###該当のソースコード

vba

1'あるフォームとは別のフォーム 2'ボタンを押してフォームオープン 3Private Sub openForm() 4 '自作クラスの自作メソッドを呼び出し 5 Dim MC As New myClasss 6 MC.myMethod 7 8 'コンボボックスの初期化 9 Application.Cursor = xlWait 10 ComboList.new_combo 11 Application.Cursor = xlDefault 12 'フォームを開く 13 myForm.Show 14 15 Unload Me 16End Sub 17 18 19'ComboListモジュール 20'コンボボックス初期値 21Public Sub new_combo() 22 myForm.Hide 23 'myForm.combo1とmyForm.combo2はコンボボックスオブジェクト 24 With myForm 25 comb .combo1 26 comb .combo2 27 End With 28End Sub 29 30'コンボボックスデータ一覧 31Sub comb(ByRef myCombo As ComboBox) 32 With myCombo 33 Dim CN As String 34 CN = .Name 35 If CN Like "*No1" Then 36 .AddItem "aaa" 37 .AddItem "bbb" 38 .AddItem "ccc" 39 .AddItem "ddd" 40 .AddItem "eee" 41 42 .AddItem "fff" 43 .AddItem "ggg" 44 .AddItem "hhh" 45 .AddItem "iii" 46 .AddItem "jjj" 47 48 .AddItem "kkk" 49 .AddItem "lll" 50 .AddItem "mmm" 51 .AddItem "nnn" 52 .AddItem "ooo" 53 54 ElseIf CN Like "*No2" Then 55 .AddItem "NNNNNN" 56 .AddItem "ZZZZZZ" 57 .AddItem "KKKKKK" 58 .AddItem "AAAAAA" 59 .AddItem "JJJJJJ" 60 61 .AddItem "FFFFFF" 62 .AddItem "EEEEEE" 63 End If 64 DoEvents 65 End With 66End Sub 67

イメージ説明

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2017/03/27 05:39

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

2017/03/27 05:50

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

回答5

0

ベストアンサー

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

Dim myForm As MyForm Set myForm = New MyForm

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

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

投稿2017/03/28 02:43

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2017/03/28 02:56

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

2017/03/30 04:00 編集

フォームをインスタンス化したところ、フリーズの改善が確認できました。 以前からも改善したと見せかけて直ってないということもあったので、 もうしばらくこれで様子を見てみたいと思います。 本当にありがとうございました。
guest

0

横入り失礼します。

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

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

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

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

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

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

投稿2017/03/28 04:51

編集2017/03/30 01:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOS_G-sepc

2017/03/30 00:30 編集

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

退会済みユーザー

2017/03/30 04:28

お手数をおかけしました。 私が言いたかったのはそこではなく、「マクロの挿入位置」で比較すると、 「標準モジュール」や「フォーム」といったものが、「FUNCRES.XLAM」に 含まれていることが問題では?という事でしたが…。 まずは、問題が解決して良かったです。 こちらの的外れな指摘で混乱させてしまったみたいで、申し訳ありませんでした…。
YOS_G-sepc

2017/03/30 05:07

僕の画像、FUNCRES.XLAMに変なもの含まれていたりしましたかね? 全て必要なものは(塗りつぶし).xlsmに含まれていたという認識ですが。 何がともあれ、お陰様で解決できました。 お付き合いいただきありがとうございます。
退会済みユーザー

退会済みユーザー

2017/03/30 07:11

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

0

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

VBA

1Dim MC As New myClasss 2MC.myMethod 3

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

投稿2017/03/27 07:02

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOS_G-sepc

2017/03/27 07:19 編集

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

2017/03/27 07:21

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

2017/03/27 07:37 編集

クラスの部分をコメントアウトしてやってみましたが、同様のフリーズを確認できました。 クラスをはじめに呼び出したことに対する問題はなさそうです。 ちなみに実際にコンボボックスを初期化する個数はここに提示しているよりもずっと多くなるのですが、こういった点が問題になることもあるのでしょうか?
ttyp03

2017/03/27 07:40

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

2017/03/27 07:43

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

2017/03/27 07:46

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

2017/03/27 07:49

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

2017/03/27 08:07 編集

Changeイベントで反応するコンボボックスはフォームの中にいくつかはありますね。 イベントが起きないように抑止したらいけるのか試してみたいと思います。 相談に乗っていただきありがとうございました。 追記: Application.EnableEvents=FalseとTrueでcomb関数内を括ってみましたが、改善は見られませんでした。
guest

0

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

With End

ではなく

End With

です。

投稿2017/03/27 06:43

lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOS_G-sepc

2017/03/27 07:13

おっしゃるとおりです。 修正しました。 ご指摘ありがとうございます。
lazhuward

2017/03/27 07:34

転記ミスですか。 でしたら、以下のことを試してみると良いと思います。 ・落ちるフォームを開いた場合は、必ず6割ぐらいで落ちますか? ・落ちないフォームを開いた場合は、必ず100%落ちませんか? 但し、同じ条件にするために、ファイルを開いて実行し、必ず閉じること。 とりあえず、10回ぐらい試してそれが確証された場合、 恐らくメモリを食い潰しているか、ネットワーク越しに開いているかだと思います。
lazhuward

2017/03/27 07:44 編集

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

2017/03/27 08:33 編集

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

2017/03/27 08:54 編集

あ、ごめんなさい。 自コンポーネントだからネットワーク越しに外部モジュール読み込んではないかな。。。 と思ったので独り言です。すみません。 > そして、最初2回はなんら問題はなく開けていたのですが、それ以降は10回目までフリーズするという結果になりました。 > しかし、一度でもソースコードを開くと何の問題もなく開くようになります。 これはもしかしたら、外部モジュールとして読み込みが出来てないからではないでしょうか。 推測ですが ・ソースコードを開いたら、呼び出し元と呼び出し先のソースが明示的に見えているので、プログラムが把握できている。 ・ソースコードを開いていない場合は、呼び出し元と呼び出し先のソースがプログラムが判断できないためエラーになる。 #変数などが把握できていないとか、コンポーネント破棄が上手く出来ていないとかでエラーになる? ということは考えられませんか? この場合は、モジュールの読み込みが上手く出来ていないのではないかと思います。 ファイルを同じフォルダにおいて実行してみるとか、プログラムを全て一つのファイルの中に書いてみるとか やってみるとわかるかもしれません。
YOS_G-sepc

2017/03/27 23:27

モジュールが読み込めていないというのは確かにあるのかもしれませんね。 ただ、ファイルは全て元々1ファイル(xlsm)に収束しているので、 一度モジュールをそのまま埋め込んで動作するか確認してみます。 ちなみに、コンポーネント?の破棄というのは明示的にできるものなのでしょうか? また、コンポーネントってExcel自体に含まれる様々なオブジェクト(ユーザーフォーム等)という認識なのですが、これはあっているのでしょうか?
lazhuward

2017/03/28 01:59 編集

コンポーネントは、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 ただこれも、異常終了した場合にイベントを受け取れないので根本的な解決には至りませんね。 いまいち決定打が出ず、すみません。
YOS_G-sepc

2017/03/30 01:00

なるほど、ご説明ありがとうございます。 DBは使用していないのでコンポーネントは考えなくても良いということになるのですかね。 エラーが出ずにいきなり落ちるあたり僕もメモリが怪しいのかなぁと考えてはいるのですが、 Nothingしても、イベント抑止してみてもなかなか効果が出ていない現状で難しいです。
guest

0

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

投稿2017/03/28 02:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOS_G-sepc

2017/03/30 00:51

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

退会済みユーザー

2017/03/30 00:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問