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が落ちるのはこれを実行した後のみ時々起きますので
私が作成した内容に何か問題があるのだと思うのですが
調べても判りません・・・・
この内容で情報は足りるでしょうか?
よろしくお願いします。
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") にシートの保護を適用しているかどうか知らせてください。
///
以上、とりあえず、気が付いた点だけレスしておきます。
確認してみてください。
この回答への補足
cj_moverさん
ご指導ありがとうございます。
WindFallerさんの回答にも補足で書いたとうり
ご指摘の場所を修正しましたが落ちてしまいました。
他にお気づきの点がありましたら
よろしくお願いします。
詳しいご説明ありがとうございます。
>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にしたのですが
理解が間違えてるようで、勉強しなおします。
フォームの呼び出しはマクロにショートカットキーを割り当てています。
さっそく修正して試してみます。
毎回落ちるのではないので
しばらく使ってみないと結果が判りませんので
結果報告は週明けになると思いますが
本当にありがとうございます。
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/
この回答への補足
WindFallerさん
丁寧な説明ありがとうございます。
参考URLも行ってみました。とても勉強になりそうです。
お二人にご指摘いただいた部分に修正をしてみまたが
昨日は何事もなかったのですが今朝また落ちてしまいました。
色々なサイトに行ってみましたが
当てはまるものがありません。
一つ気になっているのが、Bookの作成過程で
コピーをしたり名前を変えたりという作業をしたのですが
”リンクが切れている”というようなメッセージがでます。
リンクを貼った覚えはありません。
リンク元のファイル名がコピー元のBook名だったりします。
これは今回の事に関係ある可能性はありますか?
解除した後も出てるので関係ないと思っているのですが・・・
No.2
- 回答日時:
こんにちは。
#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は使わないほうが安全と言う事ですか?
コードの途中で落ちるのではなく
終了後シートの移動時に落ちてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
テレビやラジオに出たことがある人、いますか?
テレビやラジオに取材されたり、ゲスト出演したことある方いますか?
-
【お題】斜め上を行くスキー場にありがちなこと
運営も客も一流を通り越して斜め上を行くスキー場にありがちなことを教えて下さい。
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
-
4
エクセルのVBAが起動するけどすぐクラッシュする
Visual Basic(VBA)
-
5
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
8
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
9
VBAマクロ 実行時エラーが出たり出なかったり
Excel(エクセル)
-
10
エクセルVBA フォームShowでオートメーションエラー
Excel(エクセル)
-
11
DoEventsが必要な理由について
Visual Basic(VBA)
-
12
UserForm1.Showでエラーになります。
工学
-
13
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
14
Excel VBA 処理後データが重たくなる&処理スピードが遅いのを解決したい
Visual Basic(VBA)
-
15
DoEvents関数って何?
Visual Basic(VBA)
-
16
【EXCEL VBA】オートシェイプをクリックした時にそのオートシェイプの名前を取得したい
Visual Basic(VBA)
-
17
《エクセルVBA》「他の人が該当ファイルを使用中の場合」の処理
Excel(エクセル)
-
18
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
19
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
20
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
ExcelVBA実行後に時々落ちる
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
セル内の文字列が日本語か英語...
-
Excelマクロにて30分単位の計算...
-
入力した文字を全て自動で全角...
-
sedで日本語の置換方法について
-
コード変換ライブラリについて
-
2バイト文字をJEFからSJISに変...
-
フォームのコントロールのバッ...
-
Excel vba で1と10を正確に判断...
-
英数字を含む文字列(0-9,A-Z)...
-
XMLデータの中の改行コードにつ...
-
コード変換について
-
Symfowareでのデータ型変換につ...
-
バイナリデータ→ASCII 変換プ...
-
CSVをVB(input)で読み込んだ場...
-
COBOLによる全角・半角混...
-
byte配列の内容をstringにコピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
VS 2008(VB.NET)
-
sedで日本語の置換方法について
-
Symfowareでのデータ型変換につ...
-
JIS → S-JIS コード変換するには
-
数字5桁文字コード?
-
英数字を含む文字列(0-9,A-Z)...
-
フォームのコントロールのバッ...
-
数値のパック10進数の変換に...
-
ふりがなをアルファベット化す...
-
COBOLによる全角・半角混...
-
PL/SQLでSJISの文字コードを取...
-
latin-1 (ISO-8859-1)への変換
-
Excelマクロにて30分単位の計算...
-
RubyでUTF8のコード値を文字に...
-
S-JIS → JIS コード変換するには
おすすめ情報