• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBA実行後に時々落ちる)

ExcelVBA実行後に時々落ちる

このQ&Aのポイント
  • VBA初心者によるExcelVBAの実行後に時々Excelが落ちてしまう問題についての質問です。
  • エラーの内容はAPPCRASHによるEXCEL.EXEの停止で、原因は特定できません。
  • VBAコードの内容はフォームのテキストに数字を入力し、入力した回数だけ処理を繰り返すものですが、それ以外に特定のセルがアクティブな時に実行される処理も含まれています。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 一応ひとつひとつ確認していきますが >  Next nd Neext に対応する For がありません。 確実にコンパイルエラーになる間違いです。 誤って消してしまった関連の記述があったのか、 関連の記述を削除した時に消し忘れたものが残ってしまっているのか、 確認しましょう。 ///     以下、今回のトラブルに直接関わりがあるかは状況次第ですが、  >  Public DM As Byte '入力フォームテキストに入力された数 Byte 型というのは、バイナリデータのやり取りに使う為のものですから こういう使い方をするものではありません。間違いです。 ユーザーフォームの TextBox の .Value から 数値文字列を格納するのなら Variant 型が正解です。   Public DM As Variant 確認の上、書換えておいた方が無難です。 ///     >  Public BGyo As Integer >  Public BCol As Integer   >  Dim hgyo As Integer >  Dim BGyoH As Integer 以上4点の宣言は Long 型を使うのが正常です。 .Row プロパティ、.Column プロパティ の戻り値は Long 型です。 Integer 型には収まりきらない大きな数値を扱いますから 必然 Long 型になる、という覚え方でも、当面は構わないですけれど、 本来は取得するプロパティに合わせるものです。   Public BGyo As Long   Public BCol As Long   Dim hgyo As Long   Dim BGyoH As Long 後になってからエラー原因になりそうな不備は直しておきましょう。 ///     Sub 変換() に欠けてる宣言は以下。これは今回のトラブルとは無関係です。   Dim n As Long   Dim nd As Long (但し、nd に関しては、推測です。) ///     以上は、比較的基本的で、環境や動作条件に左右されないレベルの手当てです。 確認して、それでも解決できない場合、は以下。       Sub 変換開始() これは、どうやって呼び出してますか? シート画面からAlt + F8などでマクロを直接実行するのでしょうか? もしそうなら、このセクションは読み飛ばして結構です。 シートにあるボタンやシェイプから実行させている場合は その点、具体的で詳細な情報が必要です。 また、他のマクロから呼び出している場合も同様です。 ///     以上で解決の目途が立たない場合は、試しに >  奉行変換.Show を   奉行変換.Show vbModeless に換えてから実行するとどうなるか、知らせてください。 Worksheets("HANYO") にシートの保護を適用しているかどうか知らせてください。 ///     以上、とりあえず、気が付いた点だけレスしておきます。 確認してみてください。

shiba_2011
質問者

お礼

詳しいご説明ありがとうございます。 >Neext に対応する For がありません。 これはここに掲載する時、間違えて消してしまったようです。 実際には For nd = 1 To 7 が With Worksheets("HANYO")の上にあります。 >Public DM As Byte テキストに入力するのは10程度までで、50を超える事はないので 本に0~255までの数値と書いていたのでByteと思っていたのですが 間違えなのですね・・・ 修正します。 >Sub 変換() に欠けてる宣言は以下。これは今回のトラブルとは無関係です。   Dim n As Long   Dim nd As Long nとndも宣言が必要なんですね。 変数の型はそれによって扱える範囲が違って、その範囲が大きいと 実行時の時間のロスになると聞いたことがあるのです。 その為3ケタ行かないテキストから取得するDMはByteにしたのですが 理解が間違えてるようで、勉強しなおします。 フォームの呼び出しはマクロにショートカットキーを割り当てています。 さっそく修正して試してみます。 毎回落ちるのではないので しばらく使ってみないと結果が判りませんので 結果報告は週明けになると思いますが 本当にありがとうございます。

shiba_2011
質問者

補足

cj_moverさん ご指導ありがとうございます。 WindFallerさんの回答にも補足で書いたとうり ご指摘の場所を修正しましたが落ちてしまいました。 他にお気づきの点がありましたら よろしくお願いします。

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

あ、すみません、補足の投稿に気が付くのが遅くなりました。 > Excelが落ちるのはこれを実行した後のみ時々起きますので > 私が作成した内容に何か問題があるのだと思うのですが > 以下のVBAに問題があるのでしょうか? #1に関しては確認をしてもらえた、ということでしたら、 トラブルの原因は他にあると考えた方が良さそうです。 修正が必要な個所はあったにしても ご提示のコードが今回のトラブルの原因である可能性は極めて低いです。 呼び出し方法にも問題はないです。 一応、私が気にしていたのは、 CurrentRegion と ModalなUserForm と シートの保護 の兼ね合い フォーカスを離さないシート上のActiveXコントロール と ModalなUserFormの兼ね合い などでリンクが切れるケースだったのですが、 その場合は C:\Users\ユーザー名\AppData\Local\Temp フォルダに トラブルと前後した時刻の破断したファイルが残るのですけれど、 そういう問題では無さそうですね。 後は、シートモジュールで _Change イベントを使っている場合とかは 一応、そちらの記述も確認された方がよいと思いますが。 なにぶんにも私は経験したことがないトラブルですので、 再現出来ないものに手当てできるほどのスキルもないのですが、 解決に必要な情報をもう一度整理する方向でお考えになった方がよいと思います。 例えば、 問題のブックは、現在使用中の環境(Win7、Excel2007)で作成した.xlsm(マクロ有効ブック) をそのまま使い続けている ということなら普通ですが、何か特異な点はないでしょうか? 例えば、 極端な 量 数 大きさ 処理時間 複雑なもの 、、、とにかく特異な点を見つけて ひとつひとつ考えられる原因を潰していくとか。 そのブックでしか起らない現象のようですからアプリケーションの修復などは 方向違いですけれど、 手間は掛かってもBookを丸ごと作り直した方が案外解決が早いのかも知れませんね。 その場合、まっさらな新規ブックから作り始めて、 セルのコピーはしても、シートのコピーはしない。 シート上のシェイプやコントロールもコピーしないで作り直す。 UserFormもコピーしないで作り直す。 VBAのモジュールもコピーしないでテキストとしてコピペする。 コピーして良いのはオブジェクトではない生データだけ、 という風に作成すればいいのかも知れません。 それでも解決できない場合は、 今回提示されていない部分のVBAや数式やフィルタなどの扱いに何か問題があるか、 Excelの現在の仕様上の問題としてMicrosoftに相談すべき現象 のどちらかになると思います。 結局、ご提示コードの書き方ということでしか役に立てなかったですが。 頑張ってください。

回答No.3

こんばんは。 >UserFormは使わないほうが安全と言う事ですか? いえ、そういうわけではないのですが……。昔、いろいろ検討した結果、UserFormは、Workbookの付属品としての域を越えない使い方をすればよい、ということに落ち着きました。つまり、VBのようには使ってはいけない、ということです。 例えば、 Excelでしたら、Worksheet -> UserForm ->Worksheet というような順路で使うようにする、ということです。起動したら、UserFormが前面に出たり、UserFormから、いきなりアプリ終了というのは、VBA外のシステム・エラーが発生することがあります。 通常のマクロコードのレベルでは、今回のようなエラーは発生しないはずです。 >”不自然なコード”よろしければ教えてもらえませんか? >殆ど独学で身近に聞く人がいない為、知らないで”絶対やっちゃダメ”な事とか >してるのでは?と不安に思っています。 そんなに心配ないです。#1さんがおっしゃっていた部分で十分だと思います。 良いサンプルコードを見て真似する内に、だんだん、身についてきます。ただ、ここのOkWaveで見られるコードは、書き込み文字数の制限があるので、書き方を変形していることが多いです。 それと、整数型で、Long型を使うのは、32bitOSの場合、16bitのInteger型は内部で32bit変換されながらコードが実行されるので、32bitのLong型のほうが、オーバーヘッドがない分、高速であるといわれるからです。Byte型は、例えば、Unicodeとか、2byte文字とか、Shift JISの文字が、内部がどうなっているか、という時にバイトに別けて扱うものです。 もう一つ、あまり気にする話ではないのですが、プロシージャ名は、なるべくアルファベット(英語)のほうが良いと言われています。漢字の中で1つ2つエラーが生じるものがあると言われていますが、むしろ、OfficeのVersionが二種類以上入っている環境時に、検索時等で、日本字が文字化けするからです。ただ、こういう問題は、プロレベルの人の話です。 ここで勉強されると良いと思います。 武藤玄という人のExcel大事典

参考URL:
http://home.att.ne.jp/zeta/gen/excel/
shiba_2011
質問者

補足

WindFallerさん 丁寧な説明ありがとうございます。 参考URLも行ってみました。とても勉強になりそうです。 お二人にご指摘いただいた部分に修正をしてみまたが 昨日は何事もなかったのですが今朝また落ちてしまいました。 色々なサイトに行ってみましたが 当てはまるものがありません。 一つ気になっているのが、Bookの作成過程で コピーをしたり名前を変えたりという作業をしたのですが ”リンクが切れている”というようなメッセージがでます。 リンクを貼った覚えはありません。 リンク元のファイル名がコピー元のBook名だったりします。 これは今回の事に関係ある可能性はありますか? 解除した後も出てるので関係ないと思っているのですが・・・

回答No.2

こんにちは。 #1の方がご指摘になっている、「nd」って、どこから来ているのか、見当たりませんが、今回のこととは関係なさそうです。もし、For ~Next nd が成立していなければ、マクロは動かないはずです。 でも、その前に、私は、 「例外コード:c0000005」 障害モジュールの名前:EXCEL.EXE という点に着目します。そのエラーは、触ってはいけないメモリにアクセスしたということです。 Microsoft サポートで検索すると、いくつか出てきます。 http://support.microsoft.com/search/default.aspx?mode=r&query=c0000005+excel&spid=global&catalog=LCID%3D1041&ast=25&ast=28&ast=29&ast=31&ast=33&res=10 不自然なVBAコードは、ところどころ見られますが、それを直しても、原因不明のクラッシュが発生している場所が、EXCEL.EXE本体だということです。当面、ワークブックを別のワークブックにマクロごと移植することをお勧めします。 なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、どこにも属さないことが原因で、不明なトラブルが発生することがあります。

shiba_2011
質問者

補足

回答ありがとうございます。 触ってはいけないメモリにアクセスと言うのはコードの問題ではなくと言うことでしょうか? Bookの問題は疑ってみました。他のBookの操作で落ちることがないからです。 移植しても改善しなかったのでコードの問題だと思っていました。。。 ”不自然なコード”よろしければ教えてもらえませんか? 殆ど独学で身近に聞く人がいない為、知らないで”絶対やっちゃダメ”な事とか してるのでは?と不安に思っています。 >なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、>どこにも属さないことが原因で、不明なトラブルが発生することがあります。 UserFormは使わないほうが安全と言う事ですか? コードの途中で落ちるのではなく 終了後シートの移動時に落ちてしまいます。

関連するQ&A