質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

10905閲覧

Findメソッドでの91エラーの解消方法

Apoll047

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/06/22 08:27

度々お世話になります。
Findメソッドのデバック中よくわからないエラーがあったので質問します。
コードについては標準モジュール内でシート名を定義しそれをCall mainで呼び出します。それぞれWs1とWs2です。
Ws1に一列目の文字列(10桁の数字)の中でWs2のA1の数字(カスタム書式"0000000000")と一致するものを探したいです。
その結果findメソッドで
『オブジェクト変数または With ブロック変数が設定されていません。(エラー番号:91)』
とでてしまいます。

やったことは
1 xlpartと書き加えた同様にerror91
2 Ws1とWs2という定数が動くか値参照を用いてMsgBoxで試
験した結果成功
3 keyの書式が問題なのではと思い直接検索する番号をコード
に記載してみた結果同様にerror91

なにかオブジェクト変数のところで予期せぬerrorが起きていることは想像がつくのですがオブジェクト変数の割り当ては正しく出来ているとは思います。
その他なにかあればご教授ください。

Sub test() Call main Dim key as Range Set key = Ws2.Cells(1,1).Value Dim Srng as Range Set Srng = Ws1.Range("A:A") Dim Rng as Long Rng= Srng.Find(key.Value).Row If Rng Is Nothing Then MsgBox "なし" Else MsgBox Rng End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ExcelVBA

1Sub test() 2'Call main 3 4 Dim key As String: Let key = Worksheets("Sheet2").Range("A1").Text 5 Dim rngSearch As Range: Set rngSearch = Worksheets("Sheet1").Range("A:A").Cells 6 Dim rngFound As Range 7 Dim sProm As String: Let sProm = "なし" 8 Set rngFound = Srng.Find(key) 9 10 If Not rngFound Is Nothing Then sProm = rngFound.Address(False, False, xlR1C1, ture) 11 MsgBox sProm 12End Sub

つまり
Srng.Find(key.Value).Row
↑ここ。
Findメソッドは検索して見つかったセル自体(Rangeオブジェクト)を返します。
検索して見つからなければNothingを返します。
見つかったときはRowプロパティでそのオブジェクトの行番号を取得できますが、
Nothingに行番号はないのでエラーになります。
変数の中身がNothingでないことを確認してから、プ
ロパティの中身をみるようにしてください。
とりあえずこれでエラーは出ないはず。
(検索がうまくいくかは別の話)

あと、
せっかくセル自体が見つかっても、
そのセルを形作るすべての情報をそぎ落として、
行番号だけ変数に保持しておくなんてもったいないと思います。

それから、Findの引数は省略しないほうがいいです。
結果が期待通りにならない可能性があります。

投稿2020/06/22 13:18

編集2020/06/23 01:43
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2020/06/23 12:45

プロパティ―と戻り値の把握が甘かったですありがとうございます。
guest

0

Excel

1Sub test() 2 Dim key 3 key = Ws2.Cells(1, 1).Value 4 Dim Srng As Range 5 Set Srng = Ws1.Range("A:A") 6 Dim Rng As Long 7 If Not Srng.Find(key) Is Nothing Then 8 Rng = Srng.Find(key).Row 9 MsgBox Rng 10 Else 11 MsgBox "なし" 12 End If 13End Sub

Ws2のA1の値を取得するなら、Range変数ではなく、Valiantでいいと思います。
Setステートメントは、オブジェクトとしての変数に対して、インスタンスを作るときに使います。
日付、数値、文字は、Setステートメントは使いません。

また、オブジェクトのプロパティに対して、どの型を返すのかデバックなどで事前に調べると良いです。
Rowプロパティは、Longの方の値を返すので、普通に = で値を代入できます。

Findメゾットは、値が見つからない場合は、Nothingを返しますが、処理する前に判断する必要があるので、冗長的な書き方になります。

投稿2020/06/22 13:07

kai_keitai

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2020/06/22 13:22

ものすごく単純なとこ間違えてました。 おっしゃる通りだと思います。 ありがとうございます。 明日またためしてみます。
guest

0

外してたらゴメンナサイ。
Rng= Srng.Find(key.Value).Row

ではなく、

Set Rng = Srng.Find(key.Value).Row

とか。

投稿2020/06/22 08:40

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Apoll047

2020/06/22 11:22

.Row指定なのでLong型で整数を返すようにしてました。 それなのでRange型でないのでSetは不要かと思ってました。 明日変更してみます。ありがとうございます。
kenshirou

2020/06/23 01:17 編集

そうでした。Long型にはSetは不要ですね。 RngがRengeで、Set Rng = Srng.Find(key.Value)と勘違いしていました。 何てアホな回答を...失礼しました。 ついでに言えば、Srng.Find(key.Value)が見つからない場合は、Srng.Find(key.Value)はNothingを返すので、Srng.Find(key.Value).Rowはエラーになります。 この場合を考慮し、通常は、以下のようにFindの結果を変数に格納します。 Dim r As Range Set r= Srng.Find(key.Value) If r Is Nothing Then MsgBox "なし" Else Rng = r.Row MsgBox Rng End If
Apoll047

2020/06/23 12:44

こう格納すればよかったのですね。勉強になりました。ありがとうございます。 コードがきれいに見えるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問