[[20101124160447]] 『ある条件を満たしたら、メッセージボックスを画面』(ユウ) ページの最後に飛ぶ

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

 

『ある条件を満たしたら、メッセージボックスを画面上に表示し、注意喚起したい』(ユウ)OS 7 エクセル2007

 指定した範囲のセルに、IF関数を入れて一定の条件を設定しました。
 その条件を超えたら、セルをクリックしたらメッセージボックスを表示させて、
 注意を促したいのですが・・・入力規制や条件付き書式設定では無理でした。
 他の方法があれば御教授ください。

 例 A1〜A10 までには入力規制を設定し、空欄を含む15種類の記号を入れるように
 設定しています。しかし、A1〜A5までには必ず、最低1つは空欄を含んでいる必要が
 あります。
 その条件を満たさなかった場合にメッセージボックスを表示させたい。
 分かりにくい説明ですいません。

 データの入力規則で
 ユーザ定義 ⇒ 数式に
 =COUNTA($A$1:$A$5)<>5

 エラーメッセージで、
  スタイル:停止、
  エラーメッセージ:A1-A5 には空白セルが一つ以上必要です。
 でどうでしょうか。

http://www.eurus.dti.ne.jp/~yoneyama/Excel2007/excel2007-ny_kis.html

 (Mook)

早々のアドバイス有り難うございました。
指定したセルには既に入力規制を設定しており、上記方法はできませんでした。
よって、A15ぐらいにCOUNTIFで指定されたセル(A1−A5)に空欄がゼロになったら、0 そうでなかったら 1 と設定し、0 なら画面上にマクロなど使ってメッセージボックスを表示・・・等は無理でしょうか。

 こんなことでしょうか。
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Range("A1:A5"), Target) Is Nothing Then Exit Sub
    If Application.WorksheetFunction.CountA(Range("A1:A5")) = 5 Then _
        MsgBox "A1-A5に空白がありません。"
 End Sub
 (Mook)

ありがとうございました。
勤務表を作成しており、11/1〜11/30 の日付を各セルに横並びに入れ、縦に職員の氏名を入力しています。
各勤務帯の記号を入力制限で設定しています。各日に必ず、空白の勤務者が必要なのですが、まれにその要件を満たさない事例が発生しており、空白が、”0”になったら「空白が居りません」等の警告をメ―セージボックスで表示させたいのです。私の説明が不十分で、せっかくのアドバイスを上手く活用できませんでした。
お手数ですが再度お願いします。ユウ

 空白がゼロとすべてにデータがあるは等価だと思いますが、問題あるでしょうか。
 各列に展開したいということであれば、具体的なセル位置を明示ください。
 (Mook)

ド素人の説明で解りづらくてすいません。
関数の知識は、少しはあるんですが、マクロとなると全くのド素人です。
要は、IF関数で条件にあわないものを検索して、C 55セルに 1 と表示して、その1が出たらメッセージをメッセージボックスを表示して、「要件に合いません」と表示をさせて、OKを押してメッセージボックスを閉じる。みたいにしたいです。できるでしょうか?ユウ

 やりとりを見ていると、シートのレイアウトを明示して
 回答者の方がユウさんのシートの状態を再現できるように説明されると
 解決が早いかもしれません。
 (momo)

 できるできないといえば、できると思いますが、momoさんもいわれるように、処理の対象
 が明確ではありません。

 また、 使用者が分かるように 0 を表示するセルを作りたいというのであれば別ですが、マクロ処理
 のために作業セルを設定する必要はありません。

 たとえば、
 >日付がB1:AF1 にあって各列の2行目から6行目を確認して、列ごとに空白が無くなったら表示をしたい
 というのであれば(この提示が無いので推測になります)、下記をシートモジュールにおいてみてください。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Range("B2:AF6"), Target) Is Nothing Then Exit Sub

    Dim d As Long
    Dim msg As String
    For d = 1 To 31
        If Application.WorksheetFunction.CountA(Range("A2").Offset(0, d).Resize(5, 1)) = 5 Then
            If msg <> "" Then msg = msg & "、"
            msg = msg & Range("A2").Offset(-1, d).Value
        End If
    Next
    If msg <> "" Then MsgBox msg & " に空白がありません。"
 End Sub

 ただ、ブック内にこの処理を行いたいシートが1枚だけなら良いですが、複数ある場合はシートごとに
 設定するのは効率が良くないので、ブックオブジェクトに置くようにコードを変更した方が良いかも
 しれません。そのあたりも説明があるとよいですね。
 (Mook)

ありがとうございました。私の理解困難な説明でも丁寧にアドバイス頂き、感謝しております。
シートのコードの表示に貼りつけ、出来ました。

ついでに、日付が、2010/11/24 と表示されますので、11/24 出来れば、11月24日とメッセージボックスに表示できないか、また、特定の記号 L (エルのつもりです) では空白とみなすように出来れば完璧ですが。
よろしくお願いいたします。ユウ


 こんな感じでしょうか。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Range("B2:AF6"), Target) Is Nothing Then Exit Sub

    Dim r As Range
    Dim dr As Range
    Dim dt As String
    Dim msg As String

    For Each r In Intersect(Range("B2:AF6"), Target) 
        dt = Application.Text(Cells(1, r.Column), "m月d日")
        If InStr(msg, dt) = 0 Then
            Set dr = Range(Cells(2, r.Column), Cells(6, r.Column))
            If (Application.WorksheetFunction.CountA(dr) _
                - Application.WorksheetFunction.CountIf(dr, "L")) = 5 Then
                If msg <> "" Then msg = msg & "、"
                msg = msg & dt
            End If
        End If
    Next
    If msg <> "" Then MsgBox msg & " に空白がありません。"
 End Sub
 (Mook)

有り難うございます。
Mookさんのアドバイスを元に、応用しようとしましたが、やはり素人の私には、応用はできませんでした。
で、具体的には、日付が S1161:AW1161にあって、S1162からAW1236を確認して、列ごとに空白が無くなったら表示をしたい、で再度お願い致します。ユウ

 変更範囲の確認は Target が変化したところですので、これと比較を行っている場所(2箇所)を
 Range("B2:AF6")   ⇒   Range("S1162:AW1236")
 へ変更します。

 列単位の確認で行の指定をしているのは 2 と 6 ですので、
 Set dr = Range(Cells(2, r.Column), Cells(6, r.Column))
 を
 Set dr = Range(Cells(1162, r.Column), Cells(1236, r.Column))
 へ変更します。

 この部分の行数は75行分ですから
                - Application.WorksheetFunction.CountIf(dr, "L")) = 5 Then
 を
                - Application.WorksheetFunction.CountIf(dr, "L")) = 75 Then
 へ変更します。
 (Mook)

コメント返信:

[ 一覧(最新更新順) ]


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