[[20090711080217]] 『検索した行を移動するには』(naomi) ページの最後に飛ぶ

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

 

『検索した行を移動するには』(naomi)

マクロ初心者です。自分なりにいろいろなサイトを参考にしながら作ってみたのですが、最後にエラーが出てしまいます。どうしてなのでしょうか?

【やりたいこと】
メッセージボックスに入力した文字をA列で検索し、検索にマッチした行を1行目へ移動(カット&ペースト)する。

  Sub test() 
    Dim i As Long 
    Dim gyo As Long 
    Dim ret As String

  ret = InputBox("検索文字を入力して下さい。")
    If Len(ret) = 0 Then
       MsgBox "キャンセルされました"
       Exit Sub
    End If

  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

    If Range("A" & i) <> "" Then
        Range("A" & i).Select
        Cells.Find(What:=ret, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
            .Activate
            gyo = ActiveCell.Row
        Rows(gyo).Select
        Selection.Cut
        Rows("1:1").Select
        Selection.Insert Shift:=xlDown     'ここでエラーが出る

    End If
  Next i

  End Sub

よろしくお願いします。


 取りあえず目的を達成するには、
 sub test()
   on error resume next
 ・
 ・

 とOn Error resume next

 と入れておけば、目的の処理は実現できます。

 直接エラーの原因は、
 例えば、
     セルC1に「あああ」と入力しておいて、
     セルC1を選択し、右クリック----切り取り
   そのまま 再度、右クリック----切り取ったセルの挿入 とすると、エラーになりますね!!
 コードがエラーになるのは、これが原因です。

 他には、検索した結果見つからない文字列を指定した時もエラーになります。

 上記の一行の挿入でエラーはなくなりますが、もっと良い方法があります。

 それは、別の方の投稿を待ってください。

 ichinose@これからハイキング


ichinoseさま

ありがとうございます!
おかげさまでエラーが出なくなりました!!
エラーの原因も対処法も教えてくださってありがとうございました!!

naomi


 一応補足しておきますが、
 OnError Resume Next
 はエラーが出ても無視するということなので、エラーそのものが解決したわけでは
 ありません。

 場合によっては、表示だけで処理ができている場合もありますが(今回はそう?)、
 期待の処理ができないことも多いので、乱用しない方がよいと思います。

 一応下記のように変更してみましたが、これではエラーは出ません。
 Sub test()
    Dim ret As String
    ret = InputBox("検索文字を入力して下さい。")
    If Len(ret) = 0 Then
       MsgBox "キャンセルされました"
       Exit Sub
    End If

    Dim dstRow As Long
    dstRow = 1
    Dim i As Long
    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
        If Cells(i, "A").Value = ret Then '---比較対象は A列だけ?
            If i <> dstRow Then           '---同じ列でないことを判定
                Rows(i).Cut
                Rows(dstRow).Insert Shift:=xlDown
                dstRow = dstRow + 1
            End If
        End If
    Next
 End Sub
 (Mook)

 Mookさま

 ありがとうございます!
 書いて下さったマクロを実行してみましたが、確かにエラーが出ずに処理ができました!すごいです。

 比較対象はA列だけです。
 A列の「変数retを含む文字列」を対象にしたい場合は、どのようにすればよろしいでしょうか?

 例)

    A列
 1  子ネコ
 2  ネコ
 3  親ネコ

 メッセージボックスには「ネコ」と入力し、完全一致ではなく、
 「子ネコ」「ネコ」「親ネコ」とも対象にしたい場合

 教えていただけるととても嬉しいです。
 よろしくお願いします!

 naomi


 文字を含むという条件の書き方はいろいろありますが、
        If Cells(i, "A").Value = ret Then '---比較対象は A列だけ?
 を
        If Instr( Cells(i, "A").Value, ret ) > 0 Then '---比較対象は A列だけ?
 のように変えるのも、一つの方法です。
 詳細は InStr を調べてみてください。
 (Mook)

 Mookさま

 If Instr( Cells(i, "A").Value, ret ) > 0 Then '---比較対象は A列だけ?

 で試しました。
 完璧です!この処理をやりたかったんです!

 大変勉強になりました。
 ご親切に教えてくださって、本当にありがとうございました!!

 naomi

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.