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

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

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

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

マクロ

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

解決済

IFを使用した日付の比較(データ型の設定)とその処理

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

マクロ

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

4回答

0グッド

0クリップ

393閲覧

投稿2022/12/05 00:36

編集2022/12/05 04:10

実現したいこと

参考:https://teratail.com/questions/303318

上記を参考に
sheet1 E列の注文番号とsheet2 A列の注文番号が一致している場合
かつ
sheet1 Q列の日付とsheet2 E列の日付が一致している場合
に、sheet1 E列の注文番号の背景を赤色にしたいです。

該当のソースコード

VBA

1Sub 日付が一致しているかチェック(ByVal clear_flag As Boolean) 2 Dim x As Long 3 Dim i As Long 4 With Sheets("Sheet1") 5 x = .UsedRange.Cells(.UsedRange.count).Row 6 If clear_flag = True Then 7 .Range("Q2:Q" & x).Interior.Pattern = xlNone 8 End If 9 For i = x To 2 Step -1 10 If Sheets("Sheet2").Range("E:E").Find(What:=.Cells(i, 17), LookAt:=xlWhole) Then 11 .Cells(i, 5).Interior.Color = RGB(255, 0, 0) 12 End If 13 Next i 14 End With 15End Sub

困っていること

日付はAs Dataを使用するかと思いますが、修正する箇所が分からず困っておりますので、ご教授いただけますと幸いです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

y_waiwai

2022/12/05 00:50

提示のコードではどういう問題があるんでしょうか。 そして、それをどうしたいということなんでしょう
退会済みユーザー

退会済みユーザー

2022/12/05 02:26

提示のコードではどういう問題があるんでしょうか。 →オブジェクト変数またはWithブロック変数が設定されていません。というエラーが発生してしまいます。 そして、それをどうしたいということなんでしょう →実現したい事に記載させていただきましたが  sheet1 Q列の日付とsheet2 E列の日付が一致している場合は、sheet1 E列の背景を赤色にしたいです。
hatena19

2022/12/05 02:54

そのエラーが発生したときに、エラーダイアログのデバッグボタンを押したとき、どの行が反転表示されますか。
退会済みユーザー

退会済みユーザー

2022/12/05 04:10

hatena19さん そのエラーが発生したときに、エラーダイアログのデバッグボタンを押したとき、どの行が反転表示されますか。 →下記になります。  If Sheets("Sheet2").Range("E:E").Find(What:=.Cells(i, 17), LookAt:=xlWhole) Then また記載が漏れていたので、実現したい事に追記させていいただきましたが sheet1 E列の注文番号とsheet2 A列の注文番号が一致している場合 かつ sheet1 Q列の日付とsheet2 E列の日付が一致している場合 に、sheet1 E列の注文番号の背景を赤色にしたいです。

回答4

1

ベストアンサー

Sheet1の日付のみを取得するように変えました。(時分秒は無視します)
及び下記のコーディング誤りを修正しました。
For row1 = 2 To maxrow2 -> For row1 = 2 To maxrow1

VBA

1Public Sub 注文番号及び日付チェック() 2 Dim dicT As Object 'キー:注文番号+日付 値:Sheet2の行番号 3 Dim maxrow1 As Long 'Sheet1 最終行 4 Dim maxrow2 As Long 'Sheet2 最終行 5 Dim key As String 6 Dim sh1 As Worksheet 'Sheet1 7 Dim sh2 As Worksheet 'Sheet2 8 Dim row1 As Long 9 Dim row2 As Long 10 Dim wdate As Date 11 Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義 12 Set sh1 = Worksheets("sheet1") 13 Set sh2 = Worksheets("sheet2") 14 maxrow1 = sh1.Cells(Rows.Count, "E").End(xlUp).Row 'Sheet1 E列 最終行を求める 15 maxrow2 = sh2.Cells(Rows.Count, "A").End(xlUp).Row 'Sheet2 A列 最終行を求める 16 sh1.Range("E2:E" & maxrow1).Interior.Pattern = xlNone 17 'Sheet2の注文番号+日付を記憶 18 For row2 = 2 To maxrow2 19 key = sh2.Cells(row2, "A").Value & "|" & sh2.Cells(row2, "E").Value 20 dicT(key) = row2 21 Next 22 'Sheet1を処理する 23 For row1 = 2 To maxrow1 24 wdate = Int(sh1.Cells(row1, "Q").Value) 25 key = sh1.Cells(row1, "E").Value & "|" & wdate 26 '注文番号+日付がSheet2にも存在するなら赤色背景を設定 27 If dicT.exists(key) = True Then 28 sh1.Cells(row1, "E").Interior.Color = RGB(255, 0, 0) 29 End If 30 Next 31 MsgBox ("完了") 32End Sub

投稿2022/12/05 03:28

編集2022/12/07 01:51
tatsu99

総合スコア4875

退会済みユーザー😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/12/05 04:12

tatsu99さん ご回答ありがとうございます。 実現したい事の記載に漏れがありました。 sheet1 E列の注文番号とsheet2 A列の注文番号が一致している場合 かつ sheet1 Q列の日付とsheet2 E列の日付が一致している場合 に、sheet1 E列の注文番号の背景を赤色にする事は可能でしょうか。 お手数をおかけし申し訳ございません。
tatsu99

2022/12/05 04:58

要件が変わるので、全面的に作り変えになります。 回答を作り変えました。
hatena19

2022/12/05 05:27

要件が変わってますので、質問の方もそのように変更してください。
退会済みユーザー

退会済みユーザー

2022/12/05 07:58

tatsu99さん ご回答ありがとうございます。 恐らく問題ないとは思いますが、データの性質上、下記の条件によって私は確認できない状況です。 sheet1 Q列の日付(ユーザー定義) 2022/03/15 00:00 sheet2 E列の日付(短い日付形式) 2022/3/15 こちらの表示形式の違いで一致していないと判定されてしまうでしょうか? データの形式はダウンロードした状態から変えられないため、ご教授いただけますと幸いです。
tatsu99

2022/12/05 08:28 編集

Sheet1 Q列の書式設定はどうなってますか? こちらで書式設定に yyyy/mm/dd hh:mm を設定して 2022/01/02 00:00  のようにして確認しましたが、正常に処理されます。 (一致していると判定し、赤色背景になります) あなたの書式設定の内容は具体的にどうなってますでしょうか。
退会済みユーザー

退会済みユーザー

2022/12/07 00:51

ご確認ありがとうございます。 同じくyyyy/mm/dd hh:mmになっておりますが、データ上では秒数までありました。 (表示上は00:00でしたが、0:00:00のデータとなっております。)
hatena19

2022/12/07 00:59

00:00 か 0:00:00 は表示上の問題で、今回の現象の本質とは関係ないです。 書式設定を秒まで表示できるよう(ユーザー定義 yyyy/m/d h:mm:ss)にしたとき、0:00:01 のように、0:00:00 以外になっているセルはないか確認してみてください。
tatsu99

2022/12/07 01:52

回答を以下のように変えました。 Sheet1の日付のみを採用するようにしました。(時分秒は無視します)
退会済みユーザー

退会済みユーザー

2022/12/08 03:54

ご対応ありがとうございます。 確認できました。

0

コメントにあるような複数条件の場合は、Findメソッドでは無理なので、
tatsu99さんの回答のようにDictionaryを使うか、CountIfs のような関数を使う方法になります。

CountIfsを使う場合のコード例です。

vba

1Public Sub 注文番号及び日付チェック2() 2 Dim rng1 As Range, rng2 As Range '検索対象列のセル範囲 3 With Worksheets("sheet2") 4 Set rng1 = .Range("A2", .Cells(Rows.Count, "A").End(xlUp)) 5 Set rng2 = .Range("E2").Resize(rng1.Rows.Count) 6 End With 7 8 Dim rngE As Range '注文番号のセル範囲 9 With Worksheets("sheet1") 10 Set rngE = .Range("E2", .Cells(Rows.Count, "E").End(xlUp)) 11 End With 12 rngE.Interior.Pattern = xlNone '前回の背景色変更をリセット 13 14 Dim c As Range 15 For Each c In rngE 16 If WorksheetFunction.CountIfs(rng1, c, rng2, c.Offset(, 12)) > 0 Then 17 c.Interior.Color = vbRed 18 End If 19 Next 20 MsgBox ("完了") 21End Sub

投稿2022/12/05 06:26

hatena19

総合スコア32005

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/12/05 08:00

hatena19さん ご回答ありがとうございます。 tatsu99さんと同じ内容になってしまいます。 恐らく問題ないとは思いますが、データの性質上、下記の条件によって私は確認できない状況です。 sheet1 Q列の日付(ユーザー定義) 2022/03/15 00:00 sheet2 E列の日付(短い日付形式) 2022/3/15 こちらの表示形式の違いで一致していないと判定されてしまうでしょうか? データの形式はダウンロードした状態から変えられないため、ご教授いただけますと幸いです。
hatena19

2022/12/05 09:53

sheet2 E列の日付 の書式設定を yyyy/mm/dd hh:mm にしたときに、時刻が 00:00 以外になっているデータがありませんか。
退会済みユーザー

退会済みユーザー

2022/12/07 00:49

秒数まで入っているデータがありました。 表示上は00:00でしたが、0:00:00となっております。

0

Find関数が見つからなかった場合の戻り値はNothingです。
現在のままではSheet2のE列に対象の日付がない場合エラーになります。
Sheets("Sheet2").Range("E:E").Find(What:=.Cells(i, 17), LookAt:=xlWhole) Is Nothing
にして確認してください。
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.find

投稿2022/12/05 03:00

chisua

総合スコア24

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

回答ではありません。補足要求です。
レイアウトが判りませんが、添付図のようになっていると理解して良いですか。
添付図の例では、E4、E5のセルの背景色を赤にしたいと理解しましたが、あってますが。
もし、レイアウトが異なる場合は、画像で提示してください。
イメージ説明

投稿2022/12/05 02:26

tatsu99

総合スコア4875

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/12/05 02:53

ありがとうございます。 レイアウトが判りませんが、添付図のようになっていると理解して良いですか。 添付図の例では、E4、E5のセルの背景色を赤にしたいと理解しましたが、あってますが。 →背景を赤くしたいsheet1 E列は注文番号になっています。 (sheet1 Q列の注文日時=sheet2 E列の入金確定日時 が一致している事を確認したいという意図になります)  その他レイアウトは添付の理解で問題ありません。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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

マクロ

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