[[20170219101746]] 『文字検索時、見つからない時のエラー退避について』(すーさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字検索時、見つからない時のエラー退避について』(すーさん)

お世話になります。

マクロで、氏名を入力し、名簿から行を取得するよう、下記のようにしています。

    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 >


ここを参考に修正してみてください
http://officetanaka.net/excel/vba/cell/cell11.htm

(マナ) 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

Selection.Find(What:=name, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, _
        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


皆様いろいろご指導ありがとうございました。
皆様の助言や他のVBAのサイトを参考にして、試行錯誤の結果、下記のような記述で、
何とか中断せずにマクロを実行することができました。

'検索文字を取得する

    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.