実行中のマクロで、エラーが発生した場合に備えて、
(難易DBソフト Access2kです)
On Error文をつかって対応記述をしてみたのですが、
その(On Err)記述のなかで・・・
「 隊長っ!またまたエラ―がっ… 」
発生してしまったばあい、流れはいったい何処へいってしまうのでしょうか?

 ・ 対応処方済みのかた、
 ・「私の記憶が確かなら…」の経験談をお持ちのかた
 ・「わっ・はっ・は-」と一笑に付されながらもちゃんとアドバイスくれるかた
 ・ 知ってるかたを知ってるかた
 ・ その他感想

など、お寄せいただければ幸いです。

( 実験してみようとおもったのですが、なんか「やばーな予感」がするので、 ボタン押すのためらってます。
 ということで、こんなときは「あ、あすこできいてみよー」とおもい、
 ここに書きました。 )





~~~~~~~~~~~~~~~~~~~~~~~~~~

( 余談です )

  以前、「エラ-発生マクロ文を、その実行中に得たい」 というヘンテコリンな
 質問してみたのですが、あきらめ悪く懲りずにかんがえてたら、
 (他にも悩ましい問題がいくつかあって、これに特化集中できないのが残念です)

 仮に要求が満足したとして・・・
  1). システムがエラ-を検知する
  2). On Error へ制御が渡る
3). エラ-発生文を取得し、何らかの方法でオペレータさんにつたえる
4). 3)の処理途上でまたエラ-が発生し 1).へもどる
 
 というような、俗にいう " 無限地獄 " にハマリそうな気が・・・

(考えればかんがえるほど、疑問(や興味)がわいてきてまったく困りモンです。)

このQ&Aに関連する最新のQ&A

A 回答 (1件)

エラーメッセージが表示され止まります。

 幸い無限ループに陥ることは無いようです。
    • good
    • 0
この回答へのお礼

 あ、ほんとだ。とまっちゃった・・・
「いや~これで安心しました…」

…私の理想としては、操作のお手伝いをいただける方々に、
"安心しておてつだいできるようなツールを…"、
と願ってるところにあるのですが、
(この努力は結局私自身の負荷軽減にもつながりますし…)
まだまだ "コンピュータ内.自動ツール" だけでは収束しないようですねぇ…。

カテゴリ違いの感はあるのですが、この辺なにか見解ありましたらまたください。

 あ、お礼まだでしたね。(おくれてすいません…)
Tirelo-Setshaba(私には発音できませんでした、次回はフリガナを…)さん
どうもありがとうございました。

お礼日時:2001/03/30 08:12

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

このQ&Aと関連する良く見られている質問

Qon error 処理に関して

on error goto での処理ルーチン内で、
さらに on error goto を出すことは可能でしょうか。

それとも、一度on errorを設定すると、エラーが発生した後では変更は不可なのでしょうか。

やりたいことは、
1回目と、2回目、3回目以降でやることとを変えたいのです。
例えば、メッセージを変えるとか。

この場合、
エラー処理の中で、何回目かを聞くことで、メッセージを変えることは出来ると思うのですが、
それはやらず、
他にも色々やることが多いので、別処理として飛びたいのです。
以下のようなイメージです。


err1:

on error goto err2
resume next
err2:

on error goto err3
resume next
err3:

resume next



宜しくお願いします。

Aベストアンサー

ご質問の直接の回答としては、on error gotoでエラー処理ブロックに一度入ったら、そこからresumeしない限り2度目は絶対にありません。
そのためエラー処理の中で(resumeする前に)新たなon error gotoを宣言する事も、それ自体が無効なので出来ません。


一体何のエラーをそんなに頻発しているのか(そこからどういう具合にリカバリしたいのか)は別に質問したくないご様子なので、具体的な対処方法についても回答はしませんが(多分他の対処もありますが)、素直にエラー処理部に入る都度エラー回数カウンターを1回ずつカウントアップして、いま何回目やってきたのか見ながら「共通の1か所のエラー処理ルーチンの中」で処置を分岐したほうが、とりあえず今アナタがヤリタイと思ってる事よりは遥かに簡単に「実現可能」です。

QEnableEventsとOn Errorの違い

エクセル2010を使っている者ですが、VBAのことでお教えください。

Application.EnableEvents = False
Application.EnableEvents = True

といった、EnableEventsステートメントと、On Errorのステートメント
(On Error Resume Next 等)は、役割としてどう違うのでしょうか。

いずれも、エラーに対処するためのものであることはわかるのですが、
役割の違いがわかりません。(特に、EnableEventsについては、以下の
URLの回答を見ても理解できません)
http://oshiete.goo.ne.jp/qa/3037406.html

よろしくお願いいたします。

Aベストアンサー

>いずれも、エラーに対処するためのものであることはわかるのですが、役割の違いがわかりません。

違います。

EnableEventsは、エラーに対処する為の物ではありません。

「EnableEventsはエラーに対処する為の物」と言う勘違いをしているから

http://oshiete.goo.ne.jp/qa/3037406.html

の説明を読んでも理解できないのです。

Application.EnableEvents = False

は「イベントプロシージャに飛ぶような事が起きても、イベントプロシージャに飛ぶな」です。

例えば、セルに値を入れて「Enter」を押すと

Worksheet_Change

のイベントが起きます。

ワークシートにイベントプロシージャが設定してあれば

Private Sub Worksheet_Change(ByVal Target As Range)

の所に飛んで来ます。

もし

Private Sub Worksheet_Change(ByVal Target As Range)

の中で、セルの値を書き換えると、そのイベントプロシージャの中から、自分自身が再帰的に呼ばれます。

再帰的に自分自身が呼ばれると、また、再帰的に自分自身を呼んで、の無限ループになって、最後は「メモリが足りなくて、もう呼び出せない」って言うエラーになります。

なので、セルを書き換えたら飛んでくるイベントプロシージャの中で、セルを書き換える必要が出たら

Application.EnableEvents = False

と指定して「もう呼ぶな」って指定してから、セルを書き換えます。

すると「セルの値が書き換わっても、イベントプロシージャに飛んでいかない」ので、セルの書き換えをしても、何も起きません。

そして、セルの書き換えが終わったら、イベントプロシージャから帰る前に

Application.EnableEvents = True

を行って「どこかでセルが書き換わったら、イベントプロシージャに飛んでもオッケーですよ」と、元の状態に戻すのです。

>いずれも、エラーに対処するためのものであることはわかるのですが、役割の違いがわかりません。

違います。

EnableEventsは、エラーに対処する為の物ではありません。

「EnableEventsはエラーに対処する為の物」と言う勘違いをしているから

http://oshiete.goo.ne.jp/qa/3037406.html

の説明を読んでも理解できないのです。

Application.EnableEvents = False

は「イベントプロシージャに飛ぶような事が起きても、イベントプロシージャに飛ぶな」です。

例えば、セルに値を入れて「Enter」を押すと

Wo...続きを読む

QエクセルVBAでOn Error Resume Next

エラーを回避するためにOn Error Resume Nextを使用することがありますが、その有効範囲について教えてください。
記述の在るプロシージャ内だけかと思っていたのですが、
どうも記述した以降、End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。

ひょっとしてOn Error Goto 0で止めないと、連続しているプロシージャの最後まで有効なのでしょうか?

Aベストアンサー

>Callで呼んだプロシージャにも効くなら、
>Msgbox"test2-2"も表示されるはずですよね?

あ、いや、On Error Resume Nextがかかれたプロシージャだけで有効です。
No1の補足のケースで言いますと、test1()はエラーを無視しますが、
test2()にはOn Error Resume Nextとはかかれていないのでエラーとなり
そこで処理は抜けてしまって制御がtest1()に戻ります。
しかしtest1はエラー無視なのでそのまま処理は進みます。

具体的には・・

Sub test1()
Dim x, y
On Error Resume Next
y = x / 0       →[1]エラーですが無視
MsgBox "test1-1"    →[2]表示
Call test2       →[3]CALL
           →[6]test2はエラーだったが無視
MsgBox "test1-2"    →[7]表示
End Sub

Sub test2()
Dim x, y
MsgBox "test2-1"   →[4]表示
y = x / 0       →[5]エラーでTest2は抜ける(終了)
MsgBox "test2-2"
Call test3
End Sub

もし、エラーでも"test2-2"を表示したいのでしたら、
test2にもOn Error Resume Nextをかく必要があります。

>Callで呼んだプロシージャにも効くなら、
>Msgbox"test2-2"も表示されるはずですよね?

あ、いや、On Error Resume Nextがかかれたプロシージャだけで有効です。
No1の補足のケースで言いますと、test1()はエラーを無視しますが、
test2()にはOn Error Resume Nextとはかかれていないのでエラーとなり
そこで処理は抜けてしまって制御がtest1()に戻ります。
しかしtest1はエラー無視なのでそのまま処理は進みます。

具体的には・・

Sub test1()
Dim x, y
On Error Resume Next
y = x / 0   ...続きを読む

QEXCEL2000 VBAにてセルの入力制限とon errorについて

数値のセルに文字列をいれるとVBAがこけてしまいます。
入寮制限をかけたいのですが、on errorのかけ方がわかりません。

どこでこけるかというと
acount(0) = Format(Cells(i + 1, 6).Value) * Format(Cells(i + 1, 7).Value)
acount(1) = acount(0) + acount(1) '原価*数量=部品原価
acount(2) = Format(Cells(i, 6).Value) * Format(Cells(i, 7).Value)
acount(3) = acount(2) + acount(3) '売上単価*数量=部品代
acount(4) = Format(Cells(i, 9).Value)
acount(5) = acount(4) + acount(5) '工賃(売上)
acount(6) = Format(Cells(i + 1, 9).Value)
acount(7) = acount(6) + acount(7) '工賃(原価)

というような計算式において、数値が入力されていないと
計算ができず、こけてしまいます。

数値のセルに文字列をいれるとVBAがこけてしまいます。
入寮制限をかけたいのですが、on errorのかけ方がわかりません。

どこでこけるかというと
acount(0) = Format(Cells(i + 1, 6).Value) * Format(Cells(i + 1, 7).Value)
acount(1) = acount(0) + acount(1) '原価*数量=部品原価
acount(2) = Format(Cells(i, 6).Value) * Format(Cells(i, 7).Value)
acount(3) = acount(2) + acount(3) '売上単価*数量=部品代
acount(4) = Format(Cells(i, 9).Value)
acount(5) = acount(4) + acount(5) '...続きを読む

Aベストアンサー

On Error Goto ~は始めのほうで使います。

Sub Test_Sample()
Dim ??? as ????
On Error GoTo ErrorHandle

 '処理

Exit Sub

ErrorHandle:
 'エラーが発生した時の処理
End Sub
エラーが発生した時の処理は例えば、メッセージボックス等を表示してどこが間違ってるかをいったりするとか。
処理の中にStr="~が間違っています"というようなのを代入するコードをいれます。

また別の方法で、それが数値として使えるかどうか判断するには、IsNumeric関数を使います。

If IsNumeric(A) Then
msgbox("数値です")
else
msgbox("数値ではありません")
End If

というコードがあったとして、
A="123" だと「数値です」と表示され、
A="アイウ" だと「数値ではありません」と表示されます。

Q[Excel2003] On Error GoTo について教えてください。

エラー処理について教えてください。
以下の様なマクロで、インプットボックスに
数字以外を入力した場合のエラー処理ですが、
次のような手順で進めると
「型が一致しません」とエラー表示されてしまいます。
どこがいけないのでしょうか?
  【手順】
  ・マクロ実行
  ・インプットボックスへ数字以外の文字を入力
  ・「OK」クリック
  ・再びインプットボックス出現
  ・もう一度数字以外の文字を入力
  ・「OK」クリック←ここでエラー表示!

Sub TEST()
Dim Tuki As Integer
On Error GoTo INPT
INPT:
Tuki = InputBox("何月分ですか?" & vbCrLf & _
"数字を入力してください。", "集計月入力", 1)
If Tuki = 0 Or Tuki > 12 Then
MsgBox "1から12の数字を入力してください。"
GoTo INPT
End If
On Error GoTo 0
End Sub

エラー処理について教えてください。
以下の様なマクロで、インプットボックスに
数字以外を入力した場合のエラー処理ですが、
次のような手順で進めると
「型が一致しません」とエラー表示されてしまいます。
どこがいけないのでしょうか?
  【手順】
  ・マクロ実行
  ・インプットボックスへ数字以外の文字を入力
  ・「OK」クリック
  ・再びインプットボックス出現
  ・もう一度数字以外の文字を入力
  ・「OK」クリック←ここでエラー表示!

Sub TEST()
Dim Tuki As Inte...続きを読む

Aベストアンサー

こんにちは。

#2の回答者です。

>私の作ったコードと同じ症状になりました。
> 「型が一致しません」とエラー表示されてしまいます。

私の#2の最初のコードでも、そんなはずはないはずです。

もしかしたら、変数の宣言が、
Dim Tuki As Integer

となっているのではないでしょうか。ここがInteger ではダメなのです。

InputBox 関数の戻り値は、見かけ上、文字列で返ります。数値を入れれば、数値で返ります。ただし、Tuki の型が、Integer にしていますと、受けられないので、そこで、「型が違う」といって、エラーが発生します。文字も数値も一旦は、なんでも引き受けて、その後で、振り分けないとできません。

また、Cancel 値も、ここでは、0の扱いになって振り分けられません。正確には、数値の0ではありません。(それを振り分ける特殊な古い関数はありますが、今では使いません。)

それで、InputBox メソッド(Application.InputBox)を使うことが多くなりました。こちらの場合は、戻り値は、Type 1(数字), 2(文字)などがありますが、これも、思ったようには行かない部分があります。Type:=1 として、試してみると、別のメッセージが出てきます。

「 数値が正しくありません。」と出てきます。

InputBox 関数の中で自動的に振り分けます。私は、それがうっとうしいので、Type:=2 にして、文字で受けるようにしています。これは、なかなか、難しいです。パターンを覚えて、それに当てはめるようにして使うのがよいです。

こんにちは。

#2の回答者です。

>私の作ったコードと同じ症状になりました。
> 「型が一致しません」とエラー表示されてしまいます。

私の#2の最初のコードでも、そんなはずはないはずです。

もしかしたら、変数の宣言が、
Dim Tuki As Integer

となっているのではないでしょうか。ここがInteger ではダメなのです。

InputBox 関数の戻り値は、見かけ上、文字列で返ります。数値を入れれば、数値で返ります。ただし、Tuki の型が、Integer にしていますと、受けられないので、そこで、「型が...続きを読む


人気Q&Aランキング

おすすめ情報