- ベストアンサー
マクロFind検索で見つからなかった時の対処
- エクセル2013でマクロFind検索を行った際に、.Rowと.Columnの挙動が異なります。.Rowは色で塗られ、エラーが発生しますが、.Columnはエラーが発生しません。
- .Rowがエラーになる原因として、検索行番号が見つからなかった場合にセルがNothingとなるためです。それに対して.Columnは判定列番号が見つからなかった場合でもNothingとはならず、エラーが発生しないようです。
- 具体的な原因として、検索行番号が見つからなかった場合には「みかんがありません。」というメッセージボックスが表示され、処理が終了します。同様に判定列番号、検索列番号1、検索列番号2でもメッセージボックスが表示されます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Dim 検索行番号 As Range Dim 判定列番号 As Range Dim 検索列番号1 As Range Dim 検索列番号2 As Range Set 検索行番号 = Rows(1).Find("みかん") If 検索行番号 Is Nothing Then MsgBox "1行目に、みかんが有りません。" Exit Sub Else MsgBox "一行目の" & 検索行番号.Column & "列目に、みかんは有ります。" End If Set 判定列番号 = Rows(1).Find("りんご") If 判定列番号 Is Nothing Then MsgBox "一行目に、りんごが有りません。" Exit Sub Else MsgBox "一行目の" & 判定列番号.Column & "列目に、りんごは有ります。" End If Set 検索列番号1 = Range("B:B").Find("大箱") If 検索列番号1 Is Nothing Then MsgBox "B列に、大箱が有りません。" Exit Sub Else MsgBox "B列の" & 検索列番号1.Row & "行目に、大箱は有ります。" End If Set 検索列番号2 = Range("B:B").Find("小箱") If 検索列番号2 Is Nothing Then MsgBox "B列に小箱が有りません。" Exit Sub Else MsgBox "B列の" & 検索列番号2.Row & "行目に、小箱は有ります。" End If
その他の回答 (3)
- HohoPapa
- ベストアンサー率65% (455/693)
>Columnの方はERRでなく >なぜ.Rowの方がERRなのでしょうか? この疑問、正当な疑問と思います。 '・・・ Dim 検索行番号 As Range Dim 検索列番号1 As Range '・・・ Set 検索行番号 = Rows(1).Find("みかん").Column '※1 '・・・ Set 検索列番号1 = Range("B:B").Find("大箱").Row '※2 '・・・ ※1、※2とも、左辺と右辺で扱っているものが異なりますので誤りです。 左辺はRange、右辺は列番号、あるいは行番号ですから。 この部分はすでにお気づきなんだろうと思います。 さて、 VBAのソースコード(プロシジャー)を開始(実行)した場合、 まず最初にコード全体を見渡し、誤りがないかどうかをチェックします。 この段階でエラーになるケースをコンパイルエラーと呼びます。 このチェックに合格すると、その後、 ソースコードに従い1行ずつ実行されていきます。 この実行途中でエラーになるケースを実行時エラーと呼びます。 これらについては、 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_020.html の説明がわかりやすいと思います。 今回のコードについてVBAは、、 ※1にコンパイルエラーはなく、 ※2にはコンパイルエラーがある判断しています。 また、 ※1は実行時エラーになります。 それは、※2を行削除して実行してみると ※1で実行時エラーが起きますので、試してみるとわかります。 >Columnの方はERRでなく >なぜ.Rowの方がERRなのでしょうか? VBA以外の一般的な開発環境(開発言語)であれば、 ※1もコンパイルエラーになる記述にも関わらず VBAは、文法チェックが甘いため コンパイルエラーと判断し損ねている。 というのが真相と思います。
お礼
ありがとうございます。 VBAがあまいのですか。難しいですね。
- watabe007
- ベストアンサー率62% (476/760)
Dim みかん As Range Set みかん = Rows(1).Find("みかん") If みかん Is Nothing Then MsgBox "1行目に、みかんが有りません。" Exit Sub End If MsgBox "みかんは" & みかん.Column & "列目" & vbCrLf & "みかんの有るセルは、" & みかん.Address(0, 0)
お礼
ありがとうございました。
- watabe007
- ベストアンサー率62% (476/760)
Dim みかん As Range Dim 検索列番号 As Long Set みかん = Rows(1).Find("みかん") If みかん Is Nothing Then MsgBox "1行目に、みかんが有りません。" Exit Sub Else 検索列番号 = みかん.Column End If MsgBox 検索列番号 & "列目" & vbCrLf & "みかんの有るセルは、" & みかん.Address(0, 0)
お礼
ありがとうございます。
お礼
質問してから、Exit Subの位置が違うのに 気が付いて、そこかなと修正しても、まだ駄目でした。 今回教えていただいたので、うまく行きました。 Findで見つからなかったらプログラム停止、 見つかったら、上の2文は、その列番号だけを 下の2文はその行番号だけを変数に格納して 次の実行に移したいので、教えていただいたのから 以下のように変更し、思ったように動きました。 IF文はEnd Ifさえあれば、Elseは無くても いいと思っていたのですが.... As Range にしたので、Rangeオブジェクト?だから Setの文の所で、.Columnや.Rowをつけて の列番号のみ、行番号のみの取得は、やはり駄目で 番地を取得させないと駄目なのでしょうか? まだなぜ駄目だったか、わからないでいます。 教えていただき助かりました。 ありがとうございました。 Dim みかん As Range Dim りんご As Range Dim 大箱 As Range Dim 小箱 As Range Dim 検索行番号 Dim 判定列番号 Dim 検索列番号1 Dim 検索列番号2 Set みかん = Rows(1).Find("みかん") If みかん Is Nothing Then MsgBox "1行目に、みかんが有りません。" Exit Sub Else 検索行番号 = Rows(1).Find("みかん").Column End If Set りんご = Rows(1).Find("りんご") If りんご Is Nothing Then MsgBox "一行目に、りんごが有りません。" Exit Sub Else 判定列番号 = Rows(1).Find("りんご").Column End If Set 大箱 = Range("B:B").Find("大箱") If 大箱 Is Nothing Then MsgBox "B列に、大箱が有りません。" Exit Sub Else 検索列番号1 = Range("B:B").Find("大箱").Row End If Set 小箱 = Range("B:B").Find("小箱") If 小箱 Is Nothing Then MsgBox "B列に小箱が有りません。" Exit Sub Else 検索列番号2 = Range("B:B").Find("小箱").Row End If