Excel VBA質問箱 IV

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

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


9297 / 13644 ツリー ←次へ | 前へ→

【28123】on error について hisao 05/8/29(月) 17:17 質問[未読]
【28127】Re:on error について kobasan 05/8/29(月) 18:15 発言[未読]
【28128】Re:on error について hisao 05/8/29(月) 18:36 質問[未読]
【28130】Re:on error について こたつねこ 05/8/29(月) 18:42 回答[未読]
【28132】Re:on error について hisao 05/8/29(月) 19:01 お礼[未読]
【28133】Re:on error について kobasan 05/8/29(月) 19:11 発言[未読]
【28139】Re:on error について ichinose 05/8/29(月) 19:55 発言[未読]
【28151】Re:on error について ponpon 05/8/29(月) 22:19 発言[未読]
【28160】Re:on error について kobasan 05/8/29(月) 22:51 発言[未読]
【28165】Re:on error について ponpon 05/8/30(火) 0:28 発言[未読]
【28167】Re:on error について ichinose 05/8/30(火) 8:01 発言[未読]
【28179】Re:on error について hisao 05/8/30(火) 15:01 お礼[未読]
【28168】Re:on error について hisao 05/8/30(火) 8:39 お礼[未読]

【28123】on error について
質問  hisao E-MAIL  - 05/8/29(月) 17:17 -

引用なし
パスワード
   すみません。またまた教えて下さい。
次のような構文で 2回目以降のエラーでAA:に飛んでくれず
処理が中断します。
エラー処理の仕方に誤りが有ると思うのですがよく解りません。
宜しくお願い致します。
n = 3
Do Until Range("B" & n) = ""
On Error GoTo AA
J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)
Range("W" & n).Value = Sheets("data").Range("N" & J).Value
AA:
Err.Clear
n = n + 1
Loop
End Sub

【28127】Re:on error について
発言  kobasan  - 05/8/29(月) 18:15 -

引用なし
パスワード
   ▼hisao さん 今晩は。

>すみません。またまた教えて下さい。
>次のような構文で 2回目以降のエラーでAA:に飛んでくれず
>処理が中断します。
>エラー処理の仕方に誤りが有ると思うのですがよく解りません。
>宜しくお願い致します。

この場合は、On Error GoTo AAでなく、On Error Resume Nextを使うといいのでは。
以下で希望の動きをすると思います。


On Error Resume Next
>n = 3
>Do Until Range("B" & n) = ""

>J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)
>Range("W" & n).Value = Sheets("data").Range("N" & J).Value


>n = n + 1
>Loop

Err.Clear

>End Sub

【28128】Re:on error について
質問  hisao E-MAIL  - 05/8/29(月) 18:36 -

引用なし
パスワード
   ▼kobasan さん:
早速お返事有り難う御座います。
ただし 此では エラーがあっても
Range("W" & n).Value = Sheets("data").Range("N" & J).Value
が生きているため 前の J で ("W" & n) を入れてしまいませんか?
エラーの行は空白にしたいのです。

>▼hisao さん 今晩は。
>
>>すみません。またまた教えて下さい。
>>次のような構文で 2回目以降のエラーでAA:に飛んでくれず
>>処理が中断します。
>>エラー処理の仕方に誤りが有ると思うのですがよく解りません。
>>宜しくお願い致します。
>
>この場合は、On Error GoTo AAでなく、On Error Resume Nextを使うといいのでは。
>以下で希望の動きをすると思います。
>
>
>On Error Resume Next
>>n = 3
>>Do Until Range("B" & n) = ""
>
>>J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)
>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>
>
>>n = n + 1
>>Loop
>
>Err.Clear
>
>>End Sub

【28130】Re:on error について
回答  こたつねこ  - 05/8/29(月) 18:42 -

引用なし
パスワード
   ▼hisao さん:
こんばんは

>>On Error Resume Next
>>>n = 3
>>>Do Until Range("B" & n) = ""
>>
>>>J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)

if err.number=0 then

>>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value

else
  err.clear
end if

>>>n = n + 1
>>>Loop
>>
>>
>>>End Sub

【28132】Re:on error について
お礼  hisao E-MAIL  - 05/8/29(月) 19:01 -

引用なし
パスワード
   ▼こたつねこ さん:
大変有り難う御座いました。
解決しました。

>▼hisao さん:
>こんばんは
>
>>>On Error Resume Next
>>>>n = 3
>>>>Do Until Range("B" & n) = ""
>>>
>>>>J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)
>
>if err.number=0 then
>
>>>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>
>else
>  err.clear
>end if
>
>>>>n = n + 1
>>>>Loop
>>>
>>>
>>>>End Sub

【28133】Re:on error について
発言  kobasan  - 05/8/29(月) 19:11 -

引用なし
パスワード
   ▼hisao さん今晩は。

これで動くと思いますけど。以下の説明でどうですか。

>ただし 此では エラーがあっても
>Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>が生きているため 前の J で ("W" & n) を入れてしまいませんか?

J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)

のエラーで J はEmpty になります

>>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value

J が Empty なので Range("N" & J).Value もエラーになり、この行もエラーで無視されます。結局2行飛ばしになるということで分かってもらえますでしょうか?

【28139】Re:on error について
発言  ichinose  - 05/8/29(月) 19:55 -

引用なし
パスワード
   皆さん、こんばんは。
これ、こんなふうにすると
on error 〜が不要なので、
私は、こっちを使用していますが・・・。

'========================================
Sub test()
n = 3
Dim J As Variant
Do Until Range("B" & n) = ""
  J = Application.Match(Range("B" & n), Sheets("data").Range("I:I"), 0)
  If Not IsError(J) Then
   Range("W" & n).Value = Sheets("data").Range("N" & J).Value
   End If
  n = n + 1
  Loop
End Sub

hisaoさん
でも、On Error〜は、いろんな箇所で使えますから
使い方をよく覚えてください・・・。
間違った使い方を覚えてしまうと
非常に読みにくいコードになってしまうので・・・。

【28151】Re:on error について
発言  ponpon  - 05/8/29(月) 22:19 -

引用なし
パスワード
   みなさん。こんばんは。

私もichinoseさんの方法でやっていますが(ケインさんのコードから)、
初めのうちは、
ヘルプ(match)の
指定された照合の型に従って検査範囲内を検索し、検査値と一致する要素の、配列 (配列 : 複数の結果を返す数式や、行および列範囲に入力された引数をまとめて処理する数式に使用される。配列範囲では、共通の数式が使用されます。配列定数は、引数として使用される定数の集まりです。)内での相対的な位置を表す数値
を返します。                            ~~~~~
から、
>Dim J As Variant

Dim J As Long
としていて、失敗していました。

【28160】Re:on error について
発言  kobasan  - 05/8/29(月) 22:51 -

引用なし
パスワード
   >みなさん。こんばんは。
>>Dim J As Variant
>を
>Dim J As Long
>としていて、失敗していました。

ponponさんの指摘の部分といい

J = WorksheetFunction.Match(Range("A" & n), Sheets("Sheet2").Range("A:A"), 0)
(これではエラーが出るので)
としないで
J = Application.Match(Range("A" & n), Sheets("Sheet2").Range("A:A"), 0)

としたのもの微妙なテクニックですね。

1つ勉強しました。
この微妙さ、使う機会がないと忘れそう・・・・

皆さんありがとうございました。

【28165】Re:on error について
発言  ponpon  - 05/8/30(火) 0:28 -

引用なし
パスワード
   kobasanさん こんばんは。

WorksheetFunction.Match

Application.Match

では、
マッチする値がない時の時の戻り値が違うようなことをどこかで見ました。

WorksheetFunction.Matchの時は、実行時エラーになるので、
on error・・・・が必要

Application.Matchの時は、エラー値を返すので、
iserror()で処理できる。

詳しくは、ichinoseさんやケインさんのような方に聞かないとわかりませんが、
私は、ケインさんの受け売りで使用しています。

違っていたら、すみません。

【28167】Re:on error について
発言  ichinose  - 05/8/30(火) 8:01 -

引用なし
パスワード
   おはようございます。

>WorksheetFunction.Match
>と
>Application.Match
>
>では、
>マッチする値がない時の時の戻り値が違うようなことをどこかで見ました。
>
>WorksheetFunction.Matchの時は、実行時エラーになるので、
>on error・・・・が必要
>
>Application.Matchの時は、エラー値を返すので、
>iserror()で処理できる。
私もこの質問箱で学んだ事です。
それ以前は、Worksheetfunctionを付加してOn errorとしていました。

どっちでもよいんですが
(実際にはVBEの設定によってOn Error〜を指定しても
エラーを発生させる設定もありますからOnError以外の方法のほうが
望ましいかもしれませんが)
コードがすっきりするので、Application.Matchを使用するように
なりました。

http://support.microsoft.com/default.aspx?scid=KB;JA;408877#XSLTH3125121122120121120120

本家情報に↑とあるようにワークシート関数が
WorksheetfunctionというクラスのメンバになったのはExcel97からみたいなので
Application.Matchという記述は、それ以前のバージョンとの互換性を保つために
残っているように思われます。

普通は、新しく追加された機能のほうが洗練されていて都合のよい事が
殆どなんですけどね!!
Excelでは、そうでもないなあ・・という事がこれまでにもいくつか
ありました。

【28168】Re:on error について
お礼  hisao E-MAIL  - 05/8/30(火) 8:39 -

引用なし
パスワード
   ▼kobasan さん:
有り難う御座いました

>▼hisao さん今晩は。
>
>これで動くと思いますけど。以下の説明でどうですか。
>
>>ただし 此では エラーがあっても
>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>>が生きているため 前の J で ("W" & n) を入れてしまいませんか?
>
>J = Application.WorksheetFunction.Match(Range("B" & n), Sheets _ ("data").Range("I:I"), 0)
>
>のエラーで J はEmpty になります
>
>>>>Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>
>J が Empty なので Range("N" & J).Value もエラーになり、この行もエラーで無視されます。結局2行飛ばしになるということで分かってもらえますでしょうか?

【28179】Re:on error について
お礼  hisao E-MAIL  - 05/8/30(火) 15:01 -

引用なし
パスワード
   ▼ichinose さん:
ichinoseさん。いつも有り難う御座います。

>皆さん、こんばんは。
>これ、こんなふうにすると
>on error 〜が不要なので、
>私は、こっちを使用していますが・・・。
>
>'========================================
>Sub test()
>n = 3
>Dim J As Variant
>Do Until Range("B" & n) = ""
>  J = Application.Match(Range("B" & n), Sheets("data").Range("I:I"), 0)
>  If Not IsError(J) Then
>   Range("W" & n).Value = Sheets("data").Range("N" & J).Value
>   End If
>  n = n + 1
>  Loop
>End Sub
>
>hisaoさん
>でも、On Error〜は、いろんな箇所で使えますから
>使い方をよく覚えてください・・・。
>間違った使い方を覚えてしまうと
>非常に読みにくいコードになってしまうので・・・。

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