[[20170106072701]] 『未入力時の警告表示について』(あんず) ページの最後に飛ぶ

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

 

『未入力時の警告表示について』(あんず)

マクロ設定
「Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
flag = 0
For Each seru In ActiveSheet.Range("要入力")
If seru.Value = "" Then
MsgBox seru.Address & " が未入力です。"
flag = 1
End If
Next
If flag = 1 Then
Cancel = True
End If
End Sub」

上記にて設定しやりたい事はほぼ出来たのですが
警告文を、「$A$1が未入力です」では無く
A1が日付入力セルの場合
「日付が未入力です」と表示させる事は可能でしょうか?

宜しくお願いいたします

< 使用 Excel:Excel2013、使用 OS:unknown >


seru.Address が $A$1 だったら、というIf文を書くだけかと思いますよ。
(???) 2017/01/06(金) 08:54

>A1が日付入力セルの場合
>「日付が未入力です」と表示させる事は可能でしょうか?

日付入力セルがA1セルだけかどうかわかりませんが、
名前をまた定義しておいて、
そのセル範囲の中に今見ているセルがあるかどうか、
Intersect関数で調べてみて、条件分岐してはいかがでしょうか?

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim c As Range
    Dim sProm As String
    Dim flg As Boolean

    For Each c In Range("要入力")
        If c.Value = Empty Then
            If Intersect(Range("日付"), c) Is Nothing Then
                sProm = c.Address(False, False)
            Else
                sProm = "日付"
            End If

            MsgBox sProm & "が未入力!", vbCritical
            flg = True
        End If
    Next
    Cancel = flg
End Sub

※蛇足ですが。。。
変数の宣言は省略しないでちゃんと宣言しましょう^^
その癖をつけておかないと、いつか大変困ることが起きる可能性があります。

(まっつわん) 2017/01/06(金) 09:36


 もし、A1セルならば日付、B1セルならば金額…と複数の条件があるのであれば
 Select Caseステートメントがいいかもしれない。
(ねむねむ) 2017/01/06(金) 09:41

???さん まっつわんさん ねむねむさん
回答有難うございます。
入力したVBAは友人に作ってもらい
内容等は勉強中でした...

分かりづらく申し訳ありませんでした。

細かく書くと
A1が「日付」
I3が「開始時間」
K3:L3が「終了時間」
A12が「作業者名」
と4箇所が1つでも未入力時、保存すると警告を出したい
と友人にお願いし作ってもらいました。

全て未入力の場合「$A$1が未入力です」「$I$3が未入力です」「$K$3が未入力です」「$A$12が未入力です」
と順番に警告文が出ます。

それを「日付が未入力です」「開始時間が未入力です」「終了時間が未入力です」
「作業者名が未入力です」と表示させたい。
が全ぼうです。

お手数おかけし申し訳ありません

(あんず) 2017/01/06(金) 11:37


友人に作ってもらったのならば、友人に尋ねるのが常識ですよ?
それを自分で作っていないからといって、第3者に作らせるのは、丸投げ、と言う最低の行為です。
勉強中というならば、ここまでの皆のヒントから、自分でコードを変えようとして欲しかったです。

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim c As Range
    Dim sProm As String

    For Each c In Range("要入力")
        If c.Value = Empty Then
            Select Case c.Address(False, False)
            Case "A1"
                sProm = sProm & "日付 "
            Case "I3"
                sProm = sProm & "開始時間 "
            Case "K3"
                sProm = sProm & "終了時間 "
            Case "A12"
                sProm = sProm & "作業者名 "
            End Select
        End If
    Next

    If sProm <> "" Then
        MsgBox sProm & "が未入力です", vbCritical
        Cancel = True
    End If
 End Sub
(???) 2017/01/06(金) 11:57

こういう感じかな。。。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim s As String

    With Sheets(1)
        s = IIf(.Range("A1").Value = Empty, s & vbLf & "「日付が未入力です」", s = s & "")
        s = IIf(.Range("I3").Value = Empty, s & vbLf & "「開始時間が未入力です」", s = s & "")
        s = IIf(.Range("K3").Value = Empty, s & vbLf & "「終了時間が未入力です」", s = s & "")
        s = IIf(.Range("A12").Value = Empty, s & vbLf & "「作業者名が未入力です」", s = s & "")
    End With
    If Len(s) > 0 Then
        MsgBox Mid(sProm, 2)
        Cancel = True
    End If
End Sub

>K3:L3が「終了時間」
これは終了時間が2つあるわけではなく、セルを結合しているという意味ですよね?

(まっつわん) 2017/01/06(金) 12:03


あ、どうせなら。
ちゃんと、
日付は日付として有効な値、
時間は時間として有効な値か、チェックした方がいいかも????

(まっつわん) 2017/01/06(金) 12:06


直し方が判らなかったのは、見慣れない命令を使っていたせいかもですねぇ。
簡単な命令で実現する例なぞ。

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim sProm As String

    If Range("A1").Value = Empty Then
        sProm = sProm & "日付 "
    End If
    If Range("I3").Value = Empty Then
        sProm = sProm & "開始時間 "
    End If
    If Range("K3").Value = Empty Then
        sProm = sProm & "終了時間 "
    End If
    If Range("A12").Value = Empty Then
        sProm = sProm & "作業者名 "
    End If

    If sProm <> "" Then
        MsgBox sProm & "が未入力です", vbCritical
        Cancel = True
    End If
 End Sub
(???) 2017/01/06(金) 12:11

???さん まっつわんさん

本当に有難うございました
無事に出来ました。

丸投げ等すみませんでした
(あんず) 2017/01/06(金) 13:42


 もう見ないかな。

 ちょっと、質問のテーマ以外のことを。

 ブックを閉じるタイミングでは、どのシートがアクティブになっているのか
 それは、操作者の気分(?)次第ですね。

 >>For Each seru In ActiveSheet.Range("要入力") 

 要入力 という名前のセル領域が、たまたま アクティブになっているシートに必ずあるか??

 この 要入力 という名前、おそらくブックレベルで定義された名前でしょうから、
 まっつわんさんが「さりげなく」記述しておられる

 >>For Each c In Range("要入力")

 この記述にする必要があります。
 こうしておけば、そのタイミングで、どのシートがアクティブになっていようと、正しいセル領域を参照します。

(β) 2017/01/06(金) 13:47


βさん 返信有難うございます。

本当に難しいです。

VBA入力後もまだまだ課題は残っています...
頑張ります。

有難うございました
(あんず) 2017/01/06(金) 14:10


コメント返信:

[ 一覧(最新更新順) ]


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