Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8830 / 13646 ツリー ←次へ | 前へ→

【30791】エラー回避について sama 05/11/4(金) 20:10 質問[未読]
【30792】Re:エラー回避について かみちゃん 05/11/4(金) 20:15 発言[未読]
【30850】Re:エラー回避について sama 05/11/5(土) 23:17 質問[未読]
【30874】Re:エラー回避について かみちゃん 05/11/6(日) 14:08 発言[未読]
【30884】Re:エラー回避について Hirofumi 05/11/6(日) 16:31 発言[未読]
【30887】Re:エラー回避について Hirofumi 05/11/6(日) 18:29 発言[未読]
【30908】Re:エラー回避について sama 05/11/6(日) 23:49 回答[未読]
【30912】Re:エラー回避について ichinose 05/11/7(月) 8:19 発言[未読]
【30915】Re:エラー回避について sama 05/11/7(月) 9:08 回答[未読]
【30927】Re:エラー回避について ichinose 05/11/7(月) 12:33 発言[未読]
【30935】Re:エラー回避について sama 05/11/7(月) 14:43 お礼[未読]
【30885】Re:エラー回避について ichinose 05/11/6(日) 16:56 発言[未読]

【30791】エラー回避について
質問  sama  - 05/11/4(金) 20:10 -

引用なし
パスワード
   今晩は、いつもお世話になります。
実行時エラーの回避方法はあるのでしょうか?

実は、フォーム上で変換処理1.〜5.を順に行い、更新ボタンでSheet上のデータに
書き込む処理をおこないますが、フォーム上でのテキストボックスに異なった
整数を入力したり、sheet上のデータを直接書き換えたりし、いきなり更新ボタンを押すと当然、実行時エラーとなることはわかるのですが、実行時エラーが出ると
一旦、ファイル更新せずにエクセルを終了しないとフォームを表示させることが
出来ません。
複数の人で使用するので、誰でもわかるような復旧をしたいのですが。
エクセルを終了させずに、もう1度フォームを表示させ、正しく処理等を行い、更新させることはできないでしょうか?宜しくおねがいします。

【30792】Re:エラー回避について
発言  かみちゃん  - 05/11/4(金) 20:15 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>実行時エラーの回避方法はあるのでしょうか?

On Error ステートメント
を使えばできると思いますが、それよりも、根本的な対処をしたほうがいいと思います。
そのためには、現在どういうコードになっているかを見せていただけると、対処方法が
あると思います。

【30850】Re:エラー回避について
質問  sama  - 05/11/5(土) 23:17 -

引用なし
パスワード
   かみちゃん さん,有難うございます。実は、matchによる検索の部分ですが、
フォーム上の2つのテキストボックスに入力した数値で他sheetに作成してある
表より縦、横の交差する場所の答えを検索してくるように作成しておりますが、
場合によっては、検索した答えはそのままでテキストボックスに入力した縦、横
の座標を示すどちらかを変更しなければならない場合がでてきたもので、つまり
偽の解を表示しなければならないわけです。
説明がうまく出来なくて申し訳ありません。

Private Function ColumnSearh(vntKey As Variant, _
            rngScope As Range, _
            Optional lngOver As Long) As Long

Dim vntFound As Variant
  
  vntFound = Application.Match(vntKey, rngScope, 1)
  If Not IsError(vntFound) Then
    If vntKey = rngScope(, vntFound).Value Then
      ColumnSearh = vntFound
    End If
    
    lngOver = vntFound + 1
  Else
    lngOver = 1
  End If
 
End Function

【30874】Re:エラー回避について
発言  かみちゃん  - 05/11/6(日) 14:08 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>matchによる検索の部分ですが、フォーム上の2つのテキストボックスに入力した
>数値で他sheetに作成してある表より縦、横の交差する場所の答えを検索してくる

まず、この部分が具体的にどういうことをしようとしているのかがわかりません。
具体的事例で説明していただけませんか?

>検索した答えはそのままでテキストボックスに入力した縦、横の座標を示すどち
>らかを変更しなければならない場合がでてきたもので、つまり偽の解を表示しな
>ければならないわけです。

すみません、これについても、何をなさりたいのかがいまひとつわかりません。
もしかして、私だけでしょうか?
どなたかおわかりになる方フォローお願いします。

【30884】Re:エラー回避について
発言  Hirofumi  - 05/11/6(日) 16:31 -

引用なし
パスワード
   samaさん、かみちゃんさん今日は、
私も質問の意味が善く解らないのですが?
エラーを起こしているのは、以下のコードじゃ無いのでは?

>Private Function ColumnSearh(vntKey As Variant, _
>            rngScope As Range, _
>            Optional lngOver As Long) As Long
>
>Dim vntFound As Variant
>  
>  vntFound = Application.Match(vntKey, rngScope, 1)
>  If Not IsError(vntFound) Then
>    If vntKey = rngScope(, vntFound).Value Then
>      ColumnSearh = vntFound
>    End If
>    
>    lngOver = vntFound + 1
>  Else
>    lngOver = 1
>  End If
> 
>End Function

この列探索の関数は、探索値が指定範囲に有る場合、戻り値として1以上を返し
無い場合は、0を返します(返す値は、rngScope内の探索値の位置)
因みに、lngOverは、rngScope内で探索値を超える最小値の有る位置を返します
この中でエラーが起きるのは多分、Matchで探索している部分ですが?
エラーは、エラー値としてvntFoundに返ってきてそれを処理しています

因って、マクロ停止に成るエラーは、このFunctionを呼び出すコード
若しくは、このFunctionの戻り値、又は、lngOverの値を使っている部分だと思います
その部分のコードを載せないと、この問題の解決に成らないと思いますが?

【30885】Re:エラー回避について
発言  ichinose  - 05/11/6(日) 16:56 -

引用なし
パスワード
   ▼sama さん,皆さん:
こんにちは。


>かみちゃん さん,有難うございます。実は、matchによる検索の部分ですが、
>フォーム上の2つのテキストボックスに入力した数値で他sheetに作成してある
>表より縦、横の交差する場所の答えを検索してくるように作成しておりますが、
>場合によっては、検索した答えはそのままでテキストボックスに入力した縦、横
>の座標を示すどちらかを変更しなければならない場合がでてきたもので、つまり
>偽の解を表示しなければならないわけです。
>説明がうまく出来なくて申し訳ありません。
これは、私もわかりません・・・。

上記のやりたい事と 表題の「エラー回避について」と
下のコードとが結びつかない(どういう関係があるのかわからない)と言うことです。


かみちゃん さんがおしゃっているように

エラー回避には、通常、

on error ステートメントを使用しますが・・・。

下のコードは、「Match関数を使用したバイナリサーチ」のコードですよね?

ざっと見たところ、On error ステートメントを挿入するような箇所は
見当たりません。


>Private Function ColumnSearh(vntKey As Variant, _
>            rngScope As Range, _
>            Optional lngOver As Long) As Long
>
>Dim vntFound As Variant
>  
>  vntFound = Application.Match(vntKey, rngScope, 1)
>  If Not IsError(vntFound) Then
>    If vntKey = rngScope(, vntFound).Value Then
>      ColumnSearh = vntFound
>    End If
>    
>    lngOver = vntFound + 1
>  Else
>    lngOver = 1
>  End If
> 
>End Function

こういう掲示板で自分がやりたいことを理解してもらうように記述することは
非常に難しいことです。

1 やりたいことの概要を文章で記述する。

2 情報処理というのは、入力データと出力データというものが
  大抵はあります。それぞれのデータの説明、これは、詳細に記述します。

3 その上で、今現実に取り組んでいるコードの記述が必要になります。

ところがやりたいことが複雑だったりすると、これらを記述していたら、
一回の投稿では終わらない可能性もあります。
その場合は、本来の仕様をコンパクトにして尚且つ、
上記の内容が明確になるように記述しなければなりません。

難しいですよね?

でも、質問者がこの努力を怠れば、
問答が繰り返され、回答者にとっても
それから、質問者にとっても
益は少ないですよね?
(回答者の目的が用件定義の演習なら、それなりの意味もありますけどね)

ということで
再投稿、がんばって下さい。

【30887】Re:エラー回避について
発言  Hirofumi  - 05/11/6(日) 18:29 -

引用なし
パスワード
   一寸、過去ログを調べて見ました

[#28107] 値の検索と表示 
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28107;id=excel
 
[#28222] match関数について 
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28222;id=excel

で、気が就いたのですが、
推測として、時期的にも近いし、質問内容的にも似ているので
samaさんが「match関数について」のコードを1部転用しているのでは無いかと思います

この、2つの最大の違いは、「match関数について」では、探索が列方向で、
必要な値が探索値を超える最小値で有るのに対し、
「値の検索と表示」が探索が行方向で、必要な値が探索値を超えない最大値です
多分、探索方向の違いは、それほど変更しなくても出来る様な気がしますが?
必要な値を得るのに、「Function ColumnSearh」を一寸変更すれば出来るのに
変更して無い所を見ると、ここいら辺で何か無理をして、
それがエラーに繋がっている様な気がします?

因って、「Function ColumnSearh」に絡むコードと、
何をしたら、何処で、どんなエラーに成るか、をUpした方が解決に繋がる様な気がします

【30908】Re:エラー回避について
回答  sama  - 05/11/6(日) 23:49 -

引用なし
パスワード
   かみちゃんさんをはじめ、皆様方には色々とご教授いただきまして本当に感謝
いたします。
VBAをはじめてまだ日が浅く、わからないことの連続です。皆様からのご教授いただいたことや、テキスト本等を見よう見まねで作成しておりまして、巨大なものが
出来上がってしまいました。質問についても、内容がよくわからず本当に皆様に
迷惑をかけております。
ichinoseさんをがおっしゃる通り、整理して的確な質問ができれば良いのですが。

実行時エラーの件ですが、かみちゃんさんのアドバイスにありました、On Error
ステートメントについて自分なりに調べてみました、結果”On Error Resume Next”をコードに挟んでみましたらエラーはでなくなりました。根本的な解決には
なっておりませんが。
この方法では何か問題が発生するのでしょうか?

【30912】Re:エラー回避について
発言  ichinose  - 05/11/7(月) 8:19 -

引用なし
パスワード
   ▼sama さん:
おはようございます。

>実行時エラーの件ですが、かみちゃんさんのアドバイスにありました、On Error
>ステートメントについて自分なりに調べてみました、結果”On Error Resume Next”をコードに挟んでみましたらエラーはでなくなりました。根本的な解決には
>なっておりませんが。
>この方法では何か問題が発生するのでしょうか?

問題があるか否かは、アルゴリズムによります。
コードと仕様を見なくては判断できません。
大抵は、エラーが発生した場合と発生しなった場合とで処理方法を
分けるのが一般的だと思います。
特殊な場合もありますが・・・。

例えば、

ax−b=0

という方程式をxで解くプログラムを考えましょう!!

'=================================================
Sub ax_b_equal_0()
  Dim a As Variant
  Dim b As Variant
  a = Application.InputBox("ax−b=0のaを入力して", , , , , , , 1)
  b = Application.InputBox("ax−b=0のbを入力して", , , , , , , 1)
  If TypeName(a) <> "Boolean" And TypeName(b) <> "Boolean" Then
    MsgBox a & "x-" & b & "=0 : x = " & b / a
    End If
End Sub
でも、これだとaに0が入力されるとエラーになりますよね?

よって、エラーを回避するための

'================================================================
Sub ax_b_equal_0()
  on error resume next 
  Dim a As Variant
  Dim b As Variant
  a = Application.InputBox("ax−b=0のaを入力して", , , , , , , 1)
  b = Application.InputBox("ax−b=0のbを入力して", , , , , , , 1)
  If TypeName(a) <> "Boolean" And TypeName(b) <> "Boolean" Then
    MsgBox a & "x-" & b & "=0 : x = " & b / a
    End If
End Sub

としました。

>結果”On Error Resume Next”をコードに挟んでみましたらエラーはでなくなりました。
>根本的な解決にはなっておりませんが。
>この方法では何か問題が発生するのでしょうか?

sama さんのご質問を上記のコードで考えてみてください。
問題ありませんか?

【30915】Re:エラー回避について
回答  sama  - 05/11/7(月) 9:08 -

引用なし
パスワード
   ▼ichinose さん:
 お早うございます。
ichinoseさんのおっしゃる通りだと思います。当然エラーの回避方法については
処理の方法を分けることが当然であると思います。今回発生しますエラーについては、本当に稀な場合であって、意図的に数式と解を書き換えなければなりません。
>例えば、
>ax−b=0
>という方程式をxで解くプログラムを考えましょう!!

>でも、これだとaに0が入力されるとエラーになりますよね?

この部分ですが、数学上aに0が入力されると=−bとなり=0とはなりませんが
このたびは必要性からaに0を入力しても=0と偽った答えを表示させなければ
なりません。

【30927】Re:エラー回避について
発言  ichinose  - 05/11/7(月) 12:33 -

引用なし
パスワード
   ▼sama さん:
こんにちは。
>>例えば、
>>ax−b=0
>>という方程式をxで解くプログラムを考えましょう!!
>
>>でも、これだとaに0が入力されるとエラーになりますよね?
>
>この部分ですが、数学上aに0が入力されると=−bとなり=0とはなりませんが
>このたびは必要性からaに0を入力しても=0と偽った答えを表示させなければ
>なりません。
ということは、エラーになった時の判断方法がわからないと言うことですか?

>>ax−b=0

本来は、先にa,bの値をチェックする(0か否か)のですが、
今回は、先にOn Error ステートメントでエラーを検出してからそれぞれの処理を
行いました。
'========================================================
Sub ax_b_equal_0()
  On Error Resume Next
  Dim a As Variant
  Dim b As Variant
  Dim ans As Variant
  Dim retcode As Long
  a = Application.InputBox("ax−b=0のaを入力して", , , , , , , 1)
  b = Application.InputBox("ax−b=0のbを入力して", , , , , , , 1)
  If TypeName(a) <> "Boolean" And TypeName(b) <> "Boolean" Then
    ans = b / a
    '↑エラーが発生しそうなステートメント
    retcode = Err.Number 'エラーが発生していればErr.Numnerは、0でない
    Select Case retcode
     Case 0 'エラーなし
       If Fix(b / a) = b / a Then '答えが整数?
        ans = b / a
       Else
        ans = Application.Text(b / a, "???/???")
        End If
     Case 11 '0で割り算したエラー
       ans = 0
       retcode = 0
     Case 6 'オーバーフロー エラー
       If a = 0 And b = 0 Then 'すべての数が解?
        ans = "不定"
        retcode = 0
       Else 'a=1E-300 b=1E+300 なんて入力するとこのエラー
        MsgBox Error(retcode)
        End If
     Case Else 'その他のエラー(あり得ないエラー)
       MsgBox Error(retcode)
     End Select
    If retcode = 0 Then '解がある場合のみ
     MsgBox a & "x-" & b & "=0 : x = " & ans
     End If
    End If
End Sub

確認してみてください。

尚、これでも納得いかない場合は
投稿は夜になってしまいます。
又は、どなたかお願いします。

【30935】Re:エラー回避について
お礼  sama  - 05/11/7(月) 14:43 -

引用なし
パスワード
   ▼ichinose さん:
 いろいろご丁寧に有難うございました。なんとなくですが、わかるような気がします。早々に試して見ます。
 皆様本当にいろいろ有難うございました。

8830 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free