プロが教える店舗&オフィスのセキュリティ対策術

VBA初心者です。
色々調べてみましたが、どうしても原因が判りません。よろしくお願いします。

Excel2007
Windows7

実行後時々Excelが落ちてしまいます。

エラーの内容
***************************
問題の署名:
問題イベント名:APPCRASH
アプリケーション名:EXCEL.EXE
アプリケーションのバージョン:12.0.6661.5000
アプリケーションのタイムスタンプ:4f7cda6d
障害モジュールの名前:EXCEL.EXE
障害モジュールのバージョン:12.0.6661.5000
障害モジュールのタイムスタンプ:4f7cda6d
例外コード:c0000005
例外オフセット:0004da42
OS バージョン:6.1.7600.2.0.0.256.48
ロケール ID:1041

この問題に関する追加情報:
LCID:1041
Brand:Office12Crash
skulcid:1041

*****************************

以下のVBAに問題があるのでしょうか?

内容は「フォームのテキストに数字を入力し、入力した回数繰り返す」というものです。

******************************

Private Sub キャンセル_Click()
MsgBox "キャンセルされました"
Unload 奉行変換
End Sub

Private Sub 変換実行_Click()
DM = 実行枚数.Value
実行枚数.Value = Empty
MsgBox DM & "枚の伝票を変換します"
Unload 奉行変換
変換
End Sub


**********************************

入力用のシートで入力した内容を他のシートにためていくものです。
以下の内容を標準モジュールに書いています。

**********************************

Public DM As Byte '入力フォームテキストに入力された数
Public BGyo As Integer
Public BCol As Integer

Sub 変換開始()
BGyo = ActiveCell.Row '入力セルの行取得
BCol = ActiveCell.Column '入力セルの列取得
奉行変換.Show
End Sub


Sub 変換()
Dim hgyo As Integer
Dim BGyoH As Integer

If BGyo = 5 Or BGyo Mod 23 = 5 And BCol = 2 Then ’特定のセルがアクティブな時だけ実行

データー用シートの最終行指定
hgyo = Worksheets("HANYO").Cells(1, 3).CurrentRegion.Rows.Count
hgyo = hgyo + 1

For n = 1 To DM
BGyoH = BGyo + 3
With Worksheets("HANYO")

.Cells(hgyo, 3).Value = Cells(BGyo, BCol)

.Cells(hgyo, 5).Value = Cells(BGyoH, BCol + 1)

.Cells(hgyo, 6).Value = Cells(BGyoH, BCol + 2)

.Cells(hgyo, 7).Value = Cells(BGyoH + 1, BCol + 2)

.Cells(hgyo, 8).Value = Cells(BGyoH, BCol)

If Cells(BGyoH + 1, BCol + 1) = 2 Then
.Cells(hgyo, 10) = 1
ElseIf Cells(BGyoH + 1, BCol + 1) = "" Then
.Cells(hgyo, 10) = ""
.Cells(hgyo, 11) = "0"
ElseIf Cells(BGyoH + 1, BCol + 1) = 1 Then
.Cells(hgyo, 10) = 1
.Cells(hgyo, 11) = 1
End If



.Cells(hgyo, 13).Value = Cells(BGyoH, BCol + 6)

.Cells(hgyo, 14).Value = Cells(BGyoH, BCol + 7)

.Cells(hgyo, 15).Value = Cells(BGyoH + 1, BCol + 7)

.Cells(hgyo, 16).Value = Cells(BGyoH, BCol + 10)



If Cells(BGyoH + 1, BCol + 6) = 2 Then
.Cells(hgyo, 18) = 1
ElseIf Cells(BGyoH + 1, BCol + 6) = "" Then
.Cells(hgyo, 18) = ""
.Cells(hgyo, 19) = "0"
ElseIf Cells(BGyoH + 1, BCol + 6) = 1 Then
.Cells(hgyo, 18) = 1
.Cells(hgyo, 19) = 1
End If

.Cells(hgyo, 21).Value = Cells(BGyoH, BCol + 4) & Cells(BGyoH + 1, BCol + 4)


End With
hgyo = hgyo + 1
BGyoH = BGyoH + 2
Next nd
BGyo = BGyo + 23

Next n
Else
MsgBox "アクティブセルが日付にありません。"
Exit Sub
End If

End Sub

Excelが落ちるのはこれを実行した後のみ時々起きますので
私が作成した内容に何か問題があるのだと思うのですが
調べても判りません・・・・

この内容で情報は足りるでしょうか?
よろしくお願いします。

A 回答 (4件)

こんにちは。



一応ひとつひとつ確認していきますが

>  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") にシートの保護を適用しているかどうか知らせてください。
///
 
 
以上、とりあえず、気が付いた点だけレスしておきます。
確認してみてください。

この回答への補足

cj_moverさん

ご指導ありがとうございます。
WindFallerさんの回答にも補足で書いたとうり
ご指摘の場所を修正しましたが落ちてしまいました。

他にお気づきの点がありましたら
よろしくお願いします。

補足日時:2012/10/23 10:03
    • good
    • 1
この回答へのお礼

詳しいご説明ありがとうございます。

>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にしたのですが
理解が間違えてるようで、勉強しなおします。


フォームの呼び出しはマクロにショートカットキーを割り当てています。

さっそく修正して試してみます。
毎回落ちるのではないので
しばらく使ってみないと結果が判りませんので
結果報告は週明けになると思いますが
本当にありがとうございます。

お礼日時:2012/10/19 09:25

あ、すみません、補足の投稿に気が付くのが遅くなりました。



> Excelが落ちるのはこれを実行した後のみ時々起きますので
> 私が作成した内容に何か問題があるのだと思うのですが

> 以下のVBAに問題があるのでしょうか?

#1に関しては確認をしてもらえた、ということでしたら、
トラブルの原因は他にあると考えた方が良さそうです。
修正が必要な個所はあったにしても
ご提示のコードが今回のトラブルの原因である可能性は極めて低いです。
呼び出し方法にも問題はないです。
一応、私が気にしていたのは、
CurrentRegion と ModalなUserForm と シートの保護 の兼ね合い
フォーカスを離さないシート上のActiveXコントロール と ModalなUserFormの兼ね合い
などでリンクが切れるケースだったのですが、
その場合は C:\Users\ユーザー名\AppData\Local\Temp フォルダに
トラブルと前後した時刻の破断したファイルが残るのですけれど、
そういう問題では無さそうですね。
後は、シートモジュールで _Change イベントを使っている場合とかは
一応、そちらの記述も確認された方がよいと思いますが。

なにぶんにも私は経験したことがないトラブルですので、
再現出来ないものに手当てできるほどのスキルもないのですが、
解決に必要な情報をもう一度整理する方向でお考えになった方がよいと思います。
例えば、
問題のブックは、現在使用中の環境(Win7、Excel2007)で作成した.xlsm(マクロ有効ブック)
をそのまま使い続けている
ということなら普通ですが、何か特異な点はないでしょうか?
例えば、
極端な 量 数 大きさ 処理時間 複雑なもの 、、、とにかく特異な点を見つけて
ひとつひとつ考えられる原因を潰していくとか。

そのブックでしか起らない現象のようですからアプリケーションの修復などは
方向違いですけれど、
手間は掛かってもBookを丸ごと作り直した方が案外解決が早いのかも知れませんね。
その場合、まっさらな新規ブックから作り始めて、
セルのコピーはしても、シートのコピーはしない。
シート上のシェイプやコントロールもコピーしないで作り直す。
UserFormもコピーしないで作り直す。
VBAのモジュールもコピーしないでテキストとしてコピペする。
コピーして良いのはオブジェクトではない生データだけ、
という風に作成すればいいのかも知れません。
それでも解決できない場合は、
今回提示されていない部分のVBAや数式やフィルタなどの扱いに何か問題があるか、
Excelの現在の仕様上の問題としてMicrosoftに相談すべき現象
のどちらかになると思います。

結局、ご提示コードの書き方ということでしか役に立てなかったですが。

頑張ってください。
    • good
    • 1

こんばんは。



>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/

この回答への補足

WindFallerさん

丁寧な説明ありがとうございます。
参考URLも行ってみました。とても勉強になりそうです。

お二人にご指摘いただいた部分に修正をしてみまたが
昨日は何事もなかったのですが今朝また落ちてしまいました。

色々なサイトに行ってみましたが
当てはまるものがありません。

一つ気になっているのが、Bookの作成過程で
コピーをしたり名前を変えたりという作業をしたのですが
”リンクが切れている”というようなメッセージがでます。
リンクを貼った覚えはありません。
リンク元のファイル名がコピー元のBook名だったりします。
これは今回の事に関係ある可能性はありますか?
解除した後も出てるので関係ないと思っているのですが・・・

補足日時:2012/10/23 10:00
    • good
    • 1

こんにちは。



#1の方がご指摘になっている、「nd」って、どこから来ているのか、見当たりませんが、今回のこととは関係なさそうです。もし、For ~Next nd が成立していなければ、マクロは動かないはずです。

でも、その前に、私は、
「例外コード:c0000005」
障害モジュールの名前:EXCEL.EXE

という点に着目します。そのエラーは、触ってはいけないメモリにアクセスしたということです。

Microsoft サポートで検索すると、いくつか出てきます。
http://support.microsoft.com/search/default.aspx …

不自然なVBAコードは、ところどころ見られますが、それを直しても、原因不明のクラッシュが発生している場所が、EXCEL.EXE本体だということです。当面、ワークブックを別のワークブックにマクロごと移植することをお勧めします。

なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、どこにも属さないことが原因で、不明なトラブルが発生することがあります。

この回答への補足

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

触ってはいけないメモリにアクセスと言うのはコードの問題ではなくと言うことでしょうか?
Bookの問題は疑ってみました。他のBookの操作で落ちることがないからです。
移植しても改善しなかったのでコードの問題だと思っていました。。。

”不自然なコード”よろしければ教えてもらえませんか?
殆ど独学で身近に聞く人がいない為、知らないで”絶対やっちゃダメ”な事とか
してるのでは?と不安に思っています。

>なお、経験的には、UserFormの周辺で、UserFormオブジェクトはワークブックに直結しているのに、>どこにも属さないことが原因で、不明なトラブルが発生することがあります。

UserFormは使わないほうが安全と言う事ですか?

コードの途中で落ちるのではなく
終了後シートの移動時に落ちてしまいます。

補足日時:2012/10/19 15:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A