[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『文字検索時、見つからない時のエラー退避について』(すーさん)
お世話になります。
マクロで、氏名を入力し、名簿から行を取得するよう、下記のようにしています。
name = InputBox("氏名を漢字で入力して下さい。") Sheets("入社年月日").Select Range("C:C").Select Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
If Not ActiveCell Is Nothing Then name = InputBox("氏名が見つかりませんでした。再入力して下さい。") Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate End If i = ActiveCell.Row
正しい氏名を入力したときは、正常に終了するのですが、
誤った氏名のときは、IF文までいかず、下記のようなエラーメッセージがでて、
終了することになります。
「実行時エラー'91':
オブジェクト変数または With ブロック変数が設定されていません。」
これを表示させずに、氏名の再入力を依頼するためには、
どこをどのようにすれば良いのか教えていただきたく、
よろしくお願い致します。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
(マナ) 2017/02/19(日) 13:37
参考のURLを開いて、いろいろ試しているのですが、
再入力の表示がでたと思ったら、データセットの個所で、
エラーになったりして、まだ完璧な回答には至っていませんが、
もう少し頑張ってみます。
(すーさん) 2017/02/19(日) 18:49
というのが、よくわかりませんが…
こんな流れになると思います。
繰り返しのところはDo while〜Loopを使うとよいです。
1)氏名を入力
2)入力しないなら終了
3)検索実行
4)検索されない間は5)〜7)を繰り返す
5)氏名を再入力
6)入力しないなら終了
7)検索実行
8)検索されたら、そのセルの行番号を表示
(マナ) 2017/02/19(日) 19:39
こんにちは。
単純な案ですけども
name = InputBox("氏名を漢字で入力して下さい。") Sheets("入社年月日").Select Range("C:C").Select If Not ActiveCell Is Nothing Then name = InputBox("氏名が見つかりませんでした。再入力して下さい。") Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate Else Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate End If i = ActiveCell.Row
これでエラーにならないと思いますがどうでしょうか? (2Win) 2017/02/20(月) 12:44
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate ~~~~~~~~ ↑ 検索してセルが見つからなかった(Rangeオブジェクトがない)ら当然、 どのセルをアクティブにしていいか解らないので、 「セル範囲が設定されていません。」となりますよね? (そういう風にエラーメッセージを返してくれればもっとわかりやすいとは思いますが^^;)
こういう場合はFindメソッドは実行結果にRangeオブジェクトを返しますので、
その結果に対してすぐ操作をするように書くのではなく、
一旦、Rangeオブジェクト型の変数に代入してやります。
検索で見つからなかったら「Nothing」が返ってきますので、
Nothingな間はLoopして、Inputbox関数を繰り返し実行します。
ただしそれだと、永遠にループから抜け出せなくなる可能性があるので、
(わざと見つかる名前を入力すれば別ですが。。。)
さらに、キャンセルしたときはプログラムを抜けるようにします。
Sub test()
Dim sName As String Dim sProm As String Dim sProm2 As String Dim rngFind As Range
sProm = "キャンセルされました。" sProm2 = "氏名の入力" Do sName = InputBox(sProm2) If StrPtr(sName) = 0 Then GoTo WayOut If Len(sName) > 0 Then Set rngFind = Sheets("入社年月日").Range("C:C").Find(What:=sName) End If sProm2 = "「" & sName & "」は見つかりませんでした。再入力しますか?" Loop While rngFind Is Nothing sProm = "入社年月日: " & rngFind.Offset(, 1).Text
WayOut:
MsgBox sProm End Sub
※見つけた後どうしたいか解らないので、見つかったセルの1列右のセルの表示されてる文字列を、
メッセージボックスで表示してみました。
※Findメソッドの引数を省略しましたが、
よくわかってないで省略すると、誤作動の元になります。
マクロの記録で記録された物すべてを書くことをお勧めします。
(まっつわん) 2017/02/20(月) 14:43
'検索文字を取得する
name = InputBox("氏名を漢字で入力して下さい。") If Len(name) = 0 Then Windows(konki & filename).Activate ActiveWorkbook.Close SaveChanges:=False MsgBox "キャンセルされました" Exit Sub End If
'入力文字を検索し、行を取得する Sheets("入社年月日").Select Columns("C").Select
Set FindCell = Columns("C").CurrentRegion.Find(What:=name)
If FindCell Is Nothing Then name = InputBox("氏名が見つかりませんでした。再入力して下さい。")
Set FindCell = Columns("C").CurrentRegion.Find(What:=name) If FindCell Is Nothing Then Windows(konki & filename).Activate ActiveWorkbook.Close SaveChanges:=False MsgBox "氏名を確認して、実行し直して下さい" Exit Sub End If End If
二度の入力ミスは、最初からやり直すように変更しました。
ありがとうございました。
(すーさん) 2017/02/21(火) 11:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.