[[20180409113657]] 『Find エラー 「オブジェクトが必要です」 解決普x(手はおひざ) ページの最後に飛ぶ

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

 

『Find エラー 「オブジェクトが必要です」 解決方法』(手はおひざ)

下記のようなコードを組んだ際、
エラーが起きてしまうのですが
どのように修正したらよいか
アドバイスがほしいです。

幼稚園という名前の文字を
2行目から探して
そのひとつ下を選択する

Range("2:2").Find ("幼稚園")

    foundcell.Offset(1, 0).Select

よろしくおねがいします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


まずはマクロ記録してください。
(BJ) 2018/04/09(月) 11:57

 foundcell が、多分 Nothing
仮に記述があっていても、幼稚園が無ければ、同じエラーに(要エラー対策)
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-find-method-excel
参考に
他にもFindは注意点があるようです。
あと
変数は宣言(定義)された方がいいかと存じます
Option Explicit
など検索してみてください。

(隠居じーさん) 2018/04/09(月) 12:17


 2行目のfoundcellが定義されていないために発生しています。
 検索文字列が必ず存在しているのが分かっているなら

 Range("2:2").Find("幼稚園").Offset(1).Select

 だけでいいですが、きちんとエラー処理までするなら

 Sub sample()
    Dim foundcell
    Set foundcell = Range("2:2").Find(what:="幼稚園", lookat:=xlWhole)
    If Not foundcell Is Nothing Then foundcell.Offset(1).Select
 End Sub

 という風にしたほうがいいでしょう。
(ろっくん) 2018/04/09(月) 12:26

みなさんありがとうございます。
FoundCellは変数だったんですね!
FoundCellっていうものがもともとあるんだと思ってました。
以下、みなさんの意見を参考に私のほうで修正してみました。
ここでいう"幼稚園"は項目名で絶対に変わらないものになるので
エラー処理はしてません

 Dim FoundCell As Range
    Set FoundCell = Range("2:2").CurrentRegion.Find(What:="幼稚園")
    FoundCell.Offset(1, 0).Select

また何かあったらこの掲示板を使わせていただきます。
ありがとうございました!!

(手はおひざ) 2018/04/09(月) 13:12


 .CurrentRegion って・・2行目だけの検索じゃなかったんですか?
(ろっくん) 2018/04/09(月) 13:26

あ、いらないですねw
他のところから流用してそのまま残してました()

ついでにもう一つ聞かせて下さい。

 Sheets("シート1").Select
    Dim rngFrom As Range
    Dim rngTo As Range
    With Worksheets("シート1")
        Set rngFrom = .Range(.Range("AF2:AO2"), .Cells(.Rows.Count, "AO").End(xlUp))
    End With

    With Worksheets("シート2")
    Set FoundCell = Range("2:2").Find(What:="保育園")
        Set rngTo = .Cells(.Rows.Count, "CB").End(xlUp).Offset(1, -9)
    End With

    rngFrom.Copy
    rngTo.PasteSpecial Paste:=xlPasteValues

上記コードの
Set rngTo = .Cells(.Rows.Count, "CB").End(xlUp).Offset(1, -9)
のCBにFoundCellがくるようにしたいのですが、
どのように修正したらよいでしょうか。
(手はおひざ) 2018/04/09(月) 13:38


 Foundcell.Column
 でいいですよ。
(ろっくん) 2018/04/09(月) 13:49

こういうことでしょうか。。。

  With Worksheets("シート2")
    Set FoundCell = Range("2:2").Find(What:="保育園")
        Set rngTo = .Cells(.Rows.Count, Foundcell.Column).End(xlUp).Offset(1, -9)
    End With

この様に入れたところ、
オブジェクト変数またはwithブロックが設定されていませんというエラーが出てきてしまいます。。。

(手はおひざ) 2018/04/09(月) 14:13


 書き方は合っていますよ。

 2行目に検索文字列は存在していますか?
 Set FoundCell = Range("2:2").Find(What:="保育園")
                ^^ ←ここに「.」が必要なのではないでしょうか。
 Set FoundCell = .Range("2:2").Find(What:="保育園")
(ろっくん) 2018/04/09(月) 14:24

無事動きました!ありがとうございます。
もう一つ、お伺いしたいのですが

Range("C3:O" & Cells(3).CurrentRegion.Rows.Count).Select

    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy                                            

    Sheets("シート1").Select
    n = Cells(Rows.Count, "B").End(xlUp).Row + 1
    Range("B" & n).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Bの部分も
Set FoundCell = Range("2:2").Find(What:="小学校")
でFoundCellを入れたいのですが
どのように入れたら良いかぜひ教えて下さい!
(手はおひざ) 2018/04/09(月) 14:57


 上でできたのになぜでしょう・・。
 Cellsの場合は"B"のところをそのままFoundCell.Columnで。
 Rangeでやる場合はCellsに変えて、行列を入れ替える。
 Range(FoundCell.Column & n)とはできないのでCells(n,FoundCell.Column)
 としてください。
 もちろん、Set FoundCell = Range("2:2").Find(What:="小学校") の実行後に。

(ろっくん) 2018/04/09(月) 16:00


質問とは直接関係しないけど、いくつかの引数を省略しているので
将来的に”なぜか”うまくいかないって悩まないのか心配です。

(隠居じーさん)さんが指摘されている部分も研究してみるとよいかもです。

【参考】
検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html

踏まえて、2行目にあるって解っていて、Rangeオブジェクトとして取得する必要性が薄いなら、
Application.Matchの方がいいのかも。。。
(もこな2) 2018/04/09(月) 22:34


(隠居じーさん)さん(もこな2)さん

お返事ありがとうございます。
> foundcell が、多分 Nothing
仮に記述があっていても、幼稚園が無ければ、同じエラーに(要エラー対策)
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/range-find-method-excel
参考に
他にもFindは注意点があるようです。
あと
変数は宣言(定義)された方がいいかと存じます
Option Explicit
など検索してみてください。

上記見落としてました。
業務の都合上、なるべく早く作り上げなきゃいけなかったので
理解よりもまずは組み立ててみるところから始めています。

>検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html
上記リンクを拝見しました。
Findだと手動検索などをした際に
設定がそのまま残ってしまう可能性があるということですね!
Application.Matchについて
簡単に調べてみたのですが
どのように当てはめていいかわかりませんでした。
人に聞いてばかりなのは良くないとは思うのですが
可能であれば教えて頂けますと助かります。。。
(手はおひざ) 2018/04/10(火) 10:03


(ろっくん)さん

ありがとうございました!
元となる知識がさっぱりないので
大変助かりました!
いまは組み立てに集中し、
落ち着いたら改めて学習してみます!
(手はおひざ) 2018/04/10(火) 10:37


>Application.Matchについて
>簡単に調べてみたのですが
>どのように当てはめていいかわかりませんでした。

↓コードを標準モジュールに貼り付けて「STOP」以降をステップ実行して研究してみてください。

    Sub 一致するデータを探す()
        Dim buf As Variant, i As Long

        'テスト用データ生成
        With Workbooks.Add.Worksheets(1).Range("A1")
            For Each buf In Array("あいう", "えおか", "きくけ", "こさし", "すせそ")
                .Offset(i, 0).Value = buf
                i = i + 1
            Next buf
        End With

        Stop

        Dim MyRNG As Range, MyRow As Variant

        'FINDメソッドでアプローチ
        With Range("A1:A5")
            Set MyRNG = .Cells.Find _
                (What:="く", LookIn:=xlValues, LookAt:=xlPart)
            If Not MyRNG Is Nothing Then
                MsgBox MyRNG.Row & "行目でみつかりました"
            End If
        End With

        'MATCH関数でアプローチ
        MyRow = Application.Match("*く*", Range("A1:A5"), 0)
        If Not IsError(MyRow) Then
            MsgBox MyRow & "行目でみつかりました"
        End If

        'For〜NEXTによるループでアプローチ
        For MyRow = 1 To 5 Step 1
            If Cells(MyRow, "A").Value Like "*く*" Then
                MsgBox MyRow & "行目でみつかりました"
                Exit For
            End If
        Next MyRow

        'For Each〜NEXTによるループでアプローチ
        For Each MyRNG In Range("A1:A5")
            If MyRNG.Value Like "*く*" Then
                MsgBox MyRNG.Row & "行目でみつかりました"
                Exit For
            End If
        Next MyRNG

    End Sub

(もこな2) 2018/04/10(火) 12:45


コメント返信:

[ 一覧(最新更新順) ]


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