[[20210907104834]] 『列の日付がことなるデータをメッセージボックスで』(テンドー) ページの最後に飛ぶ

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

 

『列の日付がことなるデータをメッセージボックスで表示したい。』(テンドー)

初めまして。

A列に日付、B列に指名が掛かれているリストがあります。(1行目はタイトル)
このリストでA2の日付と異なるものがある場合、メッセージボックスで
「〇〇さん(B列の指名)日付が異なります。」と表示するVBAを作りたいのですが、ご教授いただけませんでしょうか。

よろしくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >指名が掛かれている

 「氏名が書かれている」ですね。

(通りすがり) 2021/09/07(火) 10:57


 どういうタイミングでMsgBoxを出したいのでしょう?

 条件付き書式ではだめですか?
(通りすがり) 2021/09/07(火) 11:03

>>通りすがり様

条件付き書式で異なれば色付けなども行っていたのですが、
出来れば改良したい(データ行が多いのでピックアップしたい、自分以外の人も使うシートなので別シートに抽出ではなくメッセージボックスで表示したい)のでご相談させていただきました。
(テンドー) 2021/09/07(火) 11:13


VBAでどこまで出来ていますか?
ご教授させていただくには、どこで詰まっているのか
知る必要がありますよね?

VBAを覚えるつもりが無い作成依頼なのであれば、
ハッキリそう言ってください。
(tkit) 2021/09/07(火) 11:45


t>>tkit様

Public Sub test()

 Dim i As Long
 Dim s As Long

 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
 If Cells(1, i) <> Range("A2").Value Then
   juhuku = s + 1
  End If
  Next
If juhuku > 1 Then
MsgBox "重複データが有ります。"

End If

    MsgBox "完了しました。"

End Sub

ここまでVBAは完成しているのですが、
MsgBox "重複データが有ります。"
の部分に日付が異なっている氏名を表示させたいのです。
自分でも調べてみたのですが、今の状態だと単純に数えているだけなので
上手く行きません。
どこをどのように変更すればよいかご教授お願いします。
改良版の作成依頼と言ってしまえばそうかもしれません。言葉足らずで申し訳ありませんでした。
(テンドー) 2021/09/07(火) 13:09


横からですが、考え方はそれでよいとおもいますよ。
お気づきのように数えるのに変えて、(表示したい)内容を一旦覚えておけばよいですね。
    Sub test改()
        Dim i As Long
        Dim MyMSG As String

        For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
            If Cells(i, "A").Value <> Range("A2").Value Then 'Cellsプロパティは【行,列】の順番です
                MyMSG = MyMSG & vbLf & i & "行目 " & Cells(i, "B").Value
            End If
        Next

        If MyMSG <> "" Then
            MsgBox "以下のデータを確認してください" & MyMSG
        Else
            MsgBox "問題ありません"
        End If
    End Sub

(もこな2 ) 2021/09/07(火) 13:31


既に改良された案が提示されているので、
私からは、自身ならこうするという案を。
結果が同じでも、いろんなコードを読むのも
いい勉強になりますよ。

    Sub sample()
        'メッセージを変数に入れる
        Dim notDateMessage As String
        Dim unmatchDateMessage As String
        notDateMessage = "日付ではありません"
        unmatchDateMessage = "日付が異なります"

        '比較元の日付を変数に入れる
        Dim sourceDate As Date
        With Range("A2")
            If Not IsDate(.Value) Then
                '日付ではなかったら、エラーメッセージを出して終了
                MsgBox notDateMessage, vbExclamation
                Exit Sub
            End If
            sourceDate = .Value
        End With

        'リストを変数に配列で入れる
        Dim sourceList As Variant
        sourceList = Range("A2", Cells(Rows.Count, "B").End(xlUp)).Value

        Dim i As Long
        Dim errMessage As String
        Dim dic As Object
        Set dic = CreateObject("Scripting.Dictionary")
        '配列の1次元の要素分ループする
        For i = LBound(sourceList, 1) To UBound(sourceList, 1)
            'エラーメッセージのクリア
            errMessage = ""
            If Not IsDate(sourceList(i, 1)) Then
                '日付ではなかったら
                errMessage = sourceList(i, 2) & "さん" & Chr(32) & notDateMessage
            ElseIf DateDiff("d", sourceDate, sourceList(i, 1)) <> 0 Then
                '日付が不一致だったら
                errMessage = sourceList(i, 2) & "さん" & Chr(32) & unmatchDateMessage
            End If

            If Len(errMessage) > 0 Then
                'エラーメッセージ変数に文字が入っていたら
                If Not dic.Exists(errMessage) Then
                    '連想配列にエラーメッセージが無かったら
                    dic.Add errMessage, errMessage
                    '連想配列にエラーメッセージを入れる
                End If
            End If
        Next i

        If dic.Count > 0 Then
            '連想配列の要素があったら
            MsgBox Join(dic.keys, vbCrLf), vbExclamation
        Else
            MsgBox "終了"
        End If
    End Sub

(tkit) 2021/09/07(火) 13:57


コメント返信:

[ 一覧(最新更新順) ]


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