[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ある条件を満たしたら、メッセージボックスを画面上に表示し、注意喚起したい』(ユウ)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)
こんなことでしょうか。 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)
空白がゼロとすべてにデータがあるは等価だと思いますが、問題あるでしょうか。 各列に展開したいということであれば、具体的なセル位置を明示ください。 (Mook)
やりとりを見ていると、シートのレイアウトを明示して 回答者の方がユウさんのシートの状態を再現できるように説明されると 解決が早いかもしれません。 (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)
変更範囲の確認は 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.