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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

11788閲覧

VBA Findメソッドで日付を検索したいがうまくいかない

tatatace

総合スコア2

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/11/08 00:41

編集2021/11/08 02:13

VBAのFindメソッドを使って日付を検索して、その日付が入力されている行を取得したいのですが、Findメソッドの挙動が理解できなくてうまくいかず、困っています。

エクセルはExcel 2013の64bit版を使用しています。

具体的な状況は以下の通りです。

セルA1に"2021/11/5"という文字列が入力されています
セルA1の書式設定はユーザー定義で「yyyy"年"m"月"d"日"」としています
セルA1には"2021年11月5日"と表示されています。

この状態で以下のコードを実行します。

VBA

1Sub find() 2 3 Dim a As Variant 4 Set a = Worksheets("Sheet1").Range("A1").find(what:="2021年11月5日", LookIn:=xlValue) 5 6 MsgBox a.Row 7 8End Sub

コードの意図は、セル範囲A1から"2021年11月5日"という文字列を検索して、検索に一致したセルの行番号をMsgBoxに返したいのですが、エラーがでます。

実行時エラー"91": オブジェクト変数または Withブロック変数が設定されていません

デバックモードでaにマウスカーソルを合わせると"a = Nothing"と表示されます。

おそらくこのエラーはセル範囲A1から"2021年11月5日"という文字列が発見できていないことが原因と考えました。

日付型の検索はいろいろ面倒ということなので以下のコード書いて検証しました。
セルA1には"a"という文字列が入力してあります。
セルA1の書式設定は標準です。

VBA

1Sub find2() 2 3 Dim a As Variant 4 Set a = Worksheets("Sheet1").Range("A1").find(what:="a", LookIn:=xlValues) 5 6 MsgBox a.Row 7 8End Sub

すると以下のエラーがでます。

実行時エラー"9": インデックスが有効範囲にありません。

デバックモードでaにカーソルをあわせると"a = Empty 値"と表示されます。
NotingとEmptyが別の状態であることはなんとなく認知していますが、なぜ上記二つのコードでエラーの内容が変わり、二つのコードとも検索できないのか理解できません。

おそらくFindメソッドの使い方を間違っているのではないかと推測しています。
最終的にはセルA1に日付が入力されていて、A1以下のセル(セル間の間隔はランダム)にA1+1 An+1...というように日付が連続で入力されているシートで任意の日付を検索したいです。もともとはFindメソッドを使って文字列や日付の検索を行なうところまではできていて、A1+1のように日付型で数式が入力されているセルの検索ができなくて困っている状況だったのですが、試行錯誤するうちに文字列の検索のやりかたさえわからなくなりました。

なぜ上記のようなコードで検索できないのか教えてください。

追記(2021/11/8 10:40)

一歩前進しました。
文字列が検索できなかった原因が判明し、文字列については検索することができました
文字列が検索できなかったのはセル結合を行なっていたことが原因でした。

具体的にはセルA1からC1までを結合していました。この状態で

Set a = Worksheets("Sheet1").Range("A1").find(what:="a", LookIn:=xlValues)

とするとA1にaと入力されていても検索に引っかからないようです。

Set a = Worksheets("Sheet1").Range("A1:C1").find(what:="a", LookIn:=xlValues)

とすることで検索することができました。
検索したい値が入力されているセルが結合されている場合、結合範囲全体を検索範囲にしないと検索に引っかからないようです。
なので同じような状態の人でセルの結合を行なっている場合は検索範囲を結合範囲と同じにしてみてください。
検索範囲をcellsで指定した場合どういう挙動になるのかは検証していません。

あとは日付型の検索と、日付型を数式で処理しているセルの検索方法がわからないので、引き続き回答を募集します。
進捗があればまた追記をおこないます。

結論(2021/11/8 11:08)

Findメソッドで日付を検索することは諦めてMatch関数を使用することで日付の検索を行なうことができました。
「VBA Find 検索できない」などで検索してシリアル値で検索しなければいけないことやMatch関数を使用する方法のほうが簡単であることは認知していましたが、なかなかうまくいきませんでした。
結局ベスト回答に選ばせていただいたご回答の下記のコードを参考にすることで目的を達成することができました。

VBA

1Dim a As Long 2 a = Application.Match(CLng(CDate("2021年11月7日")), Range("A:A"), 0) 3 MsgBox a

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

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

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

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

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

jinoji

2021/11/08 01:44

まずは落ち着いて、xlValuesがxlValueになっているのを直すとよいと思います。
tatatace

2021/11/08 02:03

御指摘ありがとうございます。 タイプミスです。気がついていませんでした。
jinoji

2021/11/08 02:29

インデックスが有効範囲にありません。のエラーは、おそらくそのタイプミスが原因だと思われます。 また、もともとのコードがうまくいかないのは、ご自身で突き止めた通りセル結合が原因で、 日付をFindで検索すること自体は、問題なくできるということですかね。
tatatace

2021/11/08 03:55

おっしゃる通りですね。 エラーの原因までわかってすっきりしました。ありがとうございます。
guest

回答2

0

VBA

1Sub find() 2 3 Dim a As Variant 4 Set a = Worksheets("Sheet1").Range("A:C").find(what:="2021年11月5日", LookIn:=xlValues) 5 6 If Not a Is Nothing Then 7 MsgBox a.Row 8 Else 9 MsgBox "Not Found" 10 End If 11 12End Sub 13

投稿2021/11/08 01:57

編集2021/11/08 02:08
jinoji

総合スコア4585

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

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

tatatace

2021/11/08 03:58

IF文でFindがNothingを返した場合の処理をMsgBox "Not Found"と指定することでエラーを回避することができるコードですね。参考になります。 タイプミスにも気をつけます。 ありがとうございます。
guest

0

ベストアンサー

まず、これに関して、

NotingとEmptyが別の状態であることはなんとなく認知していますが、なぜ上記二つのコードでエラーの内容が変わり、二つのコードとも検索できないのか理解できません。

Find は見つからなければ、Noting が返ります。
Empty が返るということは、Findの実行に失敗しているということです。(存在しないシート名とか)
提示のコードは実際のコードをコピーしたものでしょうか。
当方で試したところでは、Noting でした。

A1+1のように日付型で数式が入力されているセルの検索ができなくて困っている状況だったのですが、試行錯誤するうちに文字列の検索のやりかたさえわからなくなりました。

Findメソッドで日付を検索するといろいろ難しいというのは検索すればいろいろヒットすると思います。

Excel VBA を学ぶなら moug モーグ | 即効テクニック | 日付を検索する

Office TANAKA - Excel VBA Tips[日付を検索する]

セルA1に"2021/11/5"という文字列が入力されています

セルA1の書式設定はユーザー定義で「yyyy"年"m"月"d"日"」としています
セルA1には"2021年11月5日"と表示されています。

これはセルには文字列ではなくて、シリアル値が格納されている状態です。
Findメソッドはいろいろ難しいので、シリアル値が格納されているのなら、私ならMatch関数で検索します。

vba

1Dim a as Long 2a = Application.Match(CLng(CDate("2021年11月5日")),Range("A:A") ,0) 3MsgBox a

投稿2021/11/08 01:51

hatena19

総合スコア33740

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

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

tatatace

2021/11/08 02:06

シリアル値で検索する、Match関数を利用する方法もあるというのはこの問題が起きた当初から認知していたのですが、うまく検索することができていなくて、これからその旨を追記するところでしたが、このご回答のコードを参考にすることでMatch関数で検索を行なうことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問