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

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

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

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

Q&A

2回答

8109閲覧

【VBA】特定の日付がある行数を取得したい

IMasa001

総合スコア0

VBA

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

0グッド

0クリップ

投稿2020/05/19 13:37

前提・実現したいこと

A列に日付が書いてあり、
そこから「特定日」を取得して、
その特定日が何行目にあるかを記載したい。

基礎的なご質問で恐縮ですが、
躓いており、困っております。。

エラー内容: 2日(5/2)、5日(5/5)だけが何故か「特定日:1日(5/1)」と 認識されてしまい、間違った行を返してしまっている状況。 (2日目、5日目以外は正しく行数を返している)

該当のソースコード

Sub 特定の日付を取得() Dim r As Long Dim dd As Long Dim fd As Range For r = 9 To 39 '9行目が5/1です dd = Day(Cells(r, 1).Value) If dd = 2 Then Set fd = Range("A:A").Find(what:=dd, LookIn:=xlValues) Cells(9, 5) = fd.Row End If Next End Sub

試したこと

(1)LookIn:=xlValuesを追記したが、エラーのまま
(2)A列に記載した日付の表示形式を統一

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

A9セルからA39セルに、5月1日~5月31日を入力されていると思われますが、
2020/5/1には25が含まれているからではないですかね。

投稿2020/05/19 15:07

satokei

総合スコア1217

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

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

IMasa001

2020/05/20 02:37

ご指摘有難うございます!
guest

0

Set fd = Range("A:A").Find(what:=dd, LookIn:=xlValues) Cells(9, 5) = fd.Row

1)Findメソッドは、LookIn:=xlValuesとしたとき、「表示された文字列」を検索します。
2)日付は、唯一無二の存在です。なので、年月日を確実に入力しておかないと、読むタイミング等によって勘違いが発生し思い通りの結果が得られない可能性が出てきます。逆に「5/1」とセルに入力しても、エクセル君が忖度して、勝手に年を追加してしまうので、操作者の思いと違うデータが入っている可能性があります。

なので、セルに、

2020/2/2
2020/3/3
2020/4/4
2020/5/2
2020/5/5
2020/6/6

という「日付型の値(シリアル値)」が入っているとして、
セルの表示形式が「M/D」と定義されている場合に、
「2」を指定して、2020/5/2を探す場合は、
一旦、セルの表示形式を「D」に変えてから検索し
用が済んだら「M/D」に戻す。
というような作業をすることになると思います。
「5/2」という文字列で検索するなら同じく
「M/D」と表示させてから検索します。

3)それから、Findメソッドは、各引数を省略すると、
手動かマクロかを問わず、前回の実行の設定を引き継ぎますので、
分かっていて省略するならいいですが、
引数は省略しない方がより良いです。
たまに結果が変わることがあるので。

4)日付をシリアル値で検索するなら、Match関数で検索することもできます。
そうすると、表示形式に影響されることなく検索ができます。


一応サンプルです。

ExcelVBA

1Sub test() 2 Dim rngDays As Range 3 Dim ixRow As Variant 4 5 6 Set rngDays = Range("A9").Resize(31) 7 ixRow = Application.Match(#5/2/2020#, rngDays, 0) 8 9 If IsError(ixRow) Then 10 ixRow = Empty 11 Else 12 ixRow = rngDays(ixRow).Row 13 End If 14 15 Range("E9").Value = ixRow 16End Sub

投稿2020/05/20 00:08

編集2020/05/20 06:59
mattuwan

総合スコア2163

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

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

IMasa001

2020/05/20 02:45

ご指摘有難うございます!Match関数自体知りませんでした。。勉強して再度チャレンジしてみますね!!
mattuwan

2020/05/20 06:46

んー。どう受け取られたか不安ですが、 Match関数はシート上で使う関数です。 そのシート上で使う関数の一部はVBAで呼び出せますので、 それを使います。 が、 2を指定して、2020/5/2の2日という意味で探す等のは出来ないかと思います。 前提条件として、 セルには日付型の値が入っている 指定は、日付で(日にちではない)指定する ということなら、Match関数が使えると思います。 2だけで5月2日(今年の?)意味として探すなら、 不足する情報を補完するロジックを書く必要が出てくると思います。 質問文ではそのようなことが書いてないので、 この件に関して、これ以上のことはコメントしようがないかなと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問