[[20180628115017]] 『オブジェクト変数またはwithブロック変数が設定さ』(ももい) ページの最後に飛ぶ

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

 

『オブジェクト変数またはwithブロック変数が設定されていません。について』(ももい)

いつもお世話になっています。

タイトルにもある通りのエラーがでてしまいます。
原因を教えていただければと思います。

別ブック参照のwithブロックの中で処理しているからエラーがでているのかなと思ったり。。。
一応、"zz"にほしい行の値とかは入っているんですよね。エラーで実行できないだけで。

わかる方いましたらお願いします。


  Dim retsu As Long

    retsu = kokyaku.Column

    Dim keyWord As Variant
    Dim lastcon As Long
    Dim myobj As Range
    Dim i As Long
    Dim z
    Dim zz As Long
    Dim lastrow As Long
    Dim mycell As Long

    lastcon = Cells(Rows.Count, 2).End(xlUp).Row

    With Workbooks("AAA.xls").Worksheets("BBB")

    lastrow = .Cells(.Rows.Count, 7).End(xlUp).Row

    For i = 5 To lastrow Step 2

    Set myrange = Range(Cells(2, 3), Cells(lastcon, 3))     
    keyWord = .Cells(i, 7)                                      
  Set myobj = myrange.Find(keyWord, lookat:=xlWhole) 

    zz = myobj.Row ←←←ココでエラー

    z = Cells(zz, retsu).Value
    Cells(i + 1, 11) = z

    Next i

    End With

    End If
    End If
End sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


ざっとしか見てませんが、これでためしてみてください。

Dim test()

    Dim retsu As Long
    retsu = kokyaku.Column
    Dim keyWord As Variant
    Dim lastcon As Long
    Dim myobj As Range
    Dim i As Long
    Dim z
    Dim zz As Long
    Dim lastrow As Long
    Dim mycell As Long
    lastcon = Cells(Rows.Count, 2).End(xlUp).Row
    With Workbooks("AAA.xls").Worksheets("BBB")
    lastrow = .Cells(.Rows.Count, 7).End(xlUp).Row
    For i = 5 To lastrow Step 2
    Set myrange = Range(Cells(2, 3), Cells(lastcon, 3))
    keyWord = .Cells(i, 7)
    Set myobj = myrange.Find(keyWord, lookat:=xlWhole)

    '--------------追加
    If myobj Is Nothing Then
        MsgBox "Findメソッドを実行した結果見つかりませんでした"
        Exit Sub
    End If
    '--------------追加おわり

    zz = myobj.Row  '←←←ココでエラー
    z = Cells(zz, retsu).Value
    Cells(i + 1, 11) = z
    Next i
    End With
    End If
    End If
 End Sub

(もこな2) 2018/06/28(木) 12:13


失礼しました。素でまちがえました。
誤 Dim test()
正 Sub test()

そのほか、インデントがついてなかったり、無駄に変数を経由させてたりして見づらかったので書き直しました。
テストはしてないですけど、コンパイルエラーにはならないのでたぶん大丈夫・・・・(だといいなぁ・・)

    Sub test()
        Const retsu As Long = 3 '←ホントは何が入って欲しいのかわからないのでC列として

        Dim i As Long
        Dim keyWord As Variant
        Dim MyOBJ As Range

        With Workbooks("AAA.xls").Worksheets("BBB")
             For i = 5 To .Cells(.Rows.Count, "G").End(xlUp).Row Step 2

                keyWord = .Cells(i, 7).Value

                With .Range(.Range("C2"), .Cells(.Cells(.Rows.Count, "B").End(xlUp).Row, "C"))
                    Set MyOBJ = .Find(keyWord, lookat:=xlWhole)

                    If MyOBJ Is Nothing Then
                        MsgBox .Address(0, 0) & "の範囲を「" & keyWord & "」で完全一致検索しましたが見つかりませんでした"
                    Else
                        .Parent.Cells(i + 1, 11) = .Parent.Cells(MyOBJ.Row, retsu).Value
                    End If
                End With
            Next i
        End With
    End Sub

(もこな2) 2018/06/28(木) 12:57


 >一応、"zz"にほしい行の値とかは入っているんですよね。エラーで実行できないだけで。
いや、
検索で(Findメソッドで)見つからなかったら、

myobjがNothingのままなので、

myobj.Row と行番号を取る命令をしても、

myobjに何も代入されてないので、

「オブジェクト変数が設定されていません。」

と、叱られます。

セル範囲が指定されてこその行番号なので、
何もなければ行番号は返せませんよね?

Findメソッドは何も見つからなかったら、
Nothingを返しますので、
もこな2さんのサンプルのようにNothingの時は
myobj.Rowの行を実行しないように条件分岐をします。

(まっつわん) 2018/06/28(木) 13:15


まっつわんさん nothingの分岐は絶対なんですね。
勉強になりました。

もなこ2さん 考えてくださり非常にありがたいのですがうまくいきませんでした。
やりたいことが、仮に 

ブック2の単語の列があってそれを順番にブック1のC列の中から完全一致で抽出して列番号を求めて、ブック2に転記したいということでして。複雑で申し訳ないです・・言葉だと説明がすごい難しい

ちょっと直せばできそうなのでがんばってみます。
(ももい) 2018/06/28(木) 21:01


>nothingの分岐は絶対なんですね。
ちょっと誤解してないか心配です。
エラーが出たコードをステップ実行して、ちゃんと調べてみるとわかるとおもいますが、エラーが出る時点で、myrangeの中身はNothingだとおもいますよ。
そうなると、Findメソッドを実行したらNothing(=検索失敗)になっているのですから、検索失敗したとき用のコードに分岐させるか、そもそも検索が失敗しないようなコードを作るかどちらかでしょう。

>うまくいきませんでした。
どのようにうまくいかなかったのか、説明されると回答が付くかもですね。

>やりたいことが、仮にブック2の単語の列があってそれを順番にブック1の
>C列の中から完全一致で抽出して列番号を求めて、ブック2に転記したいということでして
それならちゃんとそう伝えないと回答者もExcel君もどうすればいいのかわかりません。
もっと言えば、どのブック、どのシート、どのセル(あるいは列や行)って伝えないとわかりません。

【おまけ1】
[[20180405152857]]←で部分一致している行を探す方法について書いたものです。
完全一致でも考え方はだいたい一緒だとおもいますので、実験用コードを提供します。

いろんなアプローチがあるとおもいますが、新しいブック(シート)を用意して、以下のコードを標準モジュールに張り付けたうえでステップ実行してみてください。

    Sub 一致するデータを探す()
        'テスト用データ生成
        Range("B1:D1").Value = Array("あ", "い", "う")
        Range("B2:D2").Value = Array("え", "お", "か")
        Range("B3:D3").Value = Array("き", "く", "け")
        Range("B4:D4").Value = Array("こ", "さ", "し")
        Range("B5:D5").Value = Array("す", "せ", "そ")

        With Range("A1")
            .Formula = "=B1&C1&D1"
            .AutoFill Destination:=.Resize(5)
        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
    End Sub

【おまけ2】
Findメソッド使うなら読んでおいた方がいいとおもいます。

検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html
(もこな2) 2018/06/29(金) 00:04


ただの書き間違えでしょうけど
>C列の中から完全一致で抽出して列番号を求めて、ブック2に転記
C列に変わりがないので、列番号は3しかないですね(完全一致するものがなければエラー)
(もこな2) 2018/06/29(金) 08:45

もこなさん

返信大変遅れましてすみません!

無事アドバイス通り行ったらできました。
rangeをもっと上手に使っていきたいのでさらに勉強したいと思います。

ありがとうございました(__)
(ももい) 2018/06/29(金) 17:19


コメント返信:

[ 一覧(最新更新順) ]


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