こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルでファイル保存時にアラームを出したい

いつもお世話になっております。
エクセル2010を使っているのですが、複数人で同じシートを使用しているのですが、データ入力後、保存する際に特定のセルが空白の時には、何らかの警告が出るようにしたいのですが。

出来れば複数個(2-3個)のセルの空白を確認出来れば理想ですが、取りあえずは特定の1個のセルが空白だったらそのまま保存できない様な仕掛けが欲しいのですが。

投稿日時 - 2017-11-28 14:19:53

QNo.9402263

困ってます

質問者が選んだベストアンサー

<TEST1>
Sub 入力漏れ()
↑が何を意図しているのかわかりません。

こんな画面になることを期待しています。

投稿日時 - 2017-12-11 14:12:31

補足

いやいや~できました。というより出来てしまいました、実感です。

最後のNo5の回答で、コメントも含めてのコピーで良いとは思いませんでした。
1行目のの「入力漏れ()」は最初にマクロを作ろうとした時の「マクロの名前」なのですが、なぜか自動で入れてくれるので、自動で入るのでまさかこれが原因とは。
本当に何度もご回答くださり感謝いたします。
これで、後日過去の入力記録を探して、入力する必要が無くなりました。
本当にお手数をおかけしました。

投稿日時 - 2017-12-11 15:43:07

お礼

当方の知識不足に何度もお付き合いくださりありがとうございました。

投稿日時 - 2017-12-11 16:17:22

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

コードをちょっと変更し、コメントを書き加えました。
これなら通じますか?


Option Explicit

'//-------------------------------------------------------------------------
'// 閉じるときにチェック 該当したらメッセージを表示して抜ける
'//-------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Dim wkCount As Integer
 Dim wkCounter As Integer

 With ThisWorkbook

  wkCount = .Sheets.Count      'シートの数を数える

  For wkCounter = 1 To wkCount    'シートの数だけ繰り返す ここから

   'A1をチェック ここから
   If .Sheets(wkCounter).Range("A1").Value = "" Then
    MsgBox Format(wkCounter, "0") & "番目のシートの" & _
     "A1が未入力!", vbCritical + vbOKOnly, "確認"
    Cancel = True
    Exit Sub
   End If
   'A1をチェック ここまで

   'B2をチェック ここから
   If .Sheets(wkCounter).Range("B2").Value = "" Then
    MsgBox Format(wkCounter, "0") & "番目のシートの" & _
     "B2が未入力!", vbCritical + vbOKOnly, "確認"
    Cancel = True
    Exit Sub
   End If
   'B1をチェック ここまで

  Next wkCounter          'シートの数だけ繰り返す ここまで

 End With
End Sub


'//-------------------------------------------------------------------------
'// 終了するときにチェック 該当したらメッセージを表示して抜ける
'//-------------------------------------------------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 Dim wkCount As Integer
 Dim wkCounter As Integer
 '以下、閉じるときと同じ

End Sub

投稿日時 - 2017-12-11 12:29:10

補足

何度も本当にすみません。
もう少しだと思うので何とか出来るようにしたいのですが、トホホです。
追記していただいたことは何となくわかっているつもりですが、やはりうまく行きません。

下記の2つを試してみましたがやはりA1の確認だけでB2のチェックは無視されてしまいます。


<TEST1>
Sub 入力漏れ()
Option Explicit

Private Sub Workbook_BeforeSave(Cancel As Boolean)
Dim wkCount As Integer
Dim wkCounter As Integer

With ThisWorkbook

wkCount = .Sheets.Count

For wkCounter = 1 To wkCount
If .Sheets(wkCounter).Range("A1").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "A1が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If
Next wkCounter
End Sub

For wkCounter = 1 To wkCount
If .Sheets(wkCounter).Range("B2").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "B2が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If
Next wkCounter

End With
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<TEST2>
Sub 入力漏れ()
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wkCount As Integer
Dim wkCounter As Integer

With ThisWorkbook

wkCount = .Sheets.Count

For wkCounter = 1 To wkCount
If .Sheets(wkCounter).Range("A1").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "A1が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If

If .Sheets(wkCounter).Range("B2").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "B2が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If
Next wkCounter

End With
End Sub

投稿日時 - 2017-12-11 13:44:52

ANo.3

掲示したマクロは、
シート全数のA1セルをチェックし、
未入力が1か所でもあれば、メッセージを表示して
抜けます。(スプレッドシートの画面に戻ります。)

続いて、
シート全数のB2セルをチェックし、
未入力が1か所でもあれば、メッセージを表示して
抜けます。(スプレッドシートの画面に戻ります。)

つまり、
Sheet1のA1セルとSheet3のB2セルが空欄の場合は
操作者が終了しようとしたときに、
Sheet1のA1セルが未入力な旨のメッセージを表示して抜けます。
その後、
操作者がSheet1のA1セルを埋め、終了しようとすると
Sheet3のB2セルが未入力な旨のメッセージを表示して抜けます。

この動作をしますので、結果的に、
シート全数のA1、B2セルが埋まるまで終了できない。
という動作をします。
その意味で、
>目的はA1とB2の「両方とも入力済みで有ること」のチェック
という要望を満たしているものと思いますがいかがでしょうか?


それとも、
未入力箇所が複数ある場合は
1回のチェックで、
未入力箇所の全数が表示されるようにしたいですか?


それとも、
シート単位で、
A1、B2セル双方が空欄の場合は、終了を許可したいですか?



保存するときにチェックしたいということであれば
先に掲示した
Private Sub Workbook_BeforeClose(Cancel As Boolean)
↑の行を
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
↑の行に変更します。


保存するときも終了するときもチェックしたいのであれば

Private Sub Workbook_BeforeClose(Cancel As Boolean)
↑の行以下の全数と
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
↑の行以下の全数をと
ThisWorkbookオブジェクトに配置します。

投稿日時 - 2017-12-11 10:19:11

補足

早々のご回答ありがとうございます。

HohoPapaさんの意図されている通りの事がしたいのですが、B2の空白チェックをA1のコードの後にどうやって追記するのか分かりません。

「'複数ある場合は、以下。。。」
をコピーして単に後に貼り付けてみたのですが、そのまま保存画面がでて、終了出来てしまいます。
A1チェック後の End Sub を削除してみましたが効果なし。
本当に申し訳ないのですが、何処にどのように挿入するのか教えて頂きたく。 追加するコードはそっくりそのままで良いのですよね?


また、実作業してみたら保存時にアラームが出る方が有効なので、これへの回答にも感謝です。

投稿日時 - 2017-12-11 10:52:06

ANo.2

>ふと気づいたのですが、
>A1セルを対象にしているのですが、
>シートを特定していないのが原因ではないでしょうか?

そのように思います。

以下のコードをThisWorkbookオブジェクトに書き込めば
期待のチェックができるだろうと思います。

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wkCount As Integer
Dim wkCounter As Integer

With ThisWorkbook

wkCount = .Sheets.Count

For wkCounter = 1 To wkCount
If .Sheets(wkCounter).Range("A1").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "A1が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If
Next wkCounter

'複数ある場合は、以下。。。
For wkCounter = 1 To wkCount
If .Sheets(wkCounter).Range("B2").Value = "" Then
MsgBox Format(wkCounter, "0") & "番目のシートの" & "B2が未入力!", vbCritical + vbOKOnly, "確認"
Cancel = True
Exit Sub
End If
Next wkCounter

End With
End Sub

投稿日時 - 2017-12-10 21:31:36

補足

ありがとうございます。
早速試してみて、全てのシートのA1、B2の入力漏れが単独でのチェックはうまく行くのですが、目的はA1とB2の「両方とも入力済みで有ること」のチェックで、この場合は、多分下記の範囲指定だと思うのですが、具体的にどのように指定するのでしょう?

If .Sheets(wkCounter).Range("A1").Value = "" Then

当方マクロの自動記録で作成したものをいじる程度しかできないので、お手数ですが宜しくお願い致します。

また欲が出てきたのですが、CloseではなくSave時にチェックを掛けるのに
BeforeClose を BeforSave としてみたのですが動作しませんでした。
保存時にアラームを出す方法も、もしできれるならばお願いします。

だんだん欲が出てきて済みません。

投稿日時 - 2017-12-11 09:17:11

ANo.1

例えば、セルA1には必ず入力しないといけない場合
'-----------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 If Range("A1").Value = "" Then
  MsgBox "A1が未入力!", vbCritical + vbOKOnly, "確認"
  Cancel = True
 End If
End Sub
'------------------------------------------------------
こんなのは? 使えない?

投稿日時 - 2017-11-28 14:30:32

補足

ご回答有りがとうございます。

早々にご回答いただいたのに別の仕事に追われており対応遅くなり申し訳ありません。
やってみましたが、目的セルが空白でも何の変化もなく、普通に保存出来て終了してしまいます。
ファイルのopen、closeの所要時間が長くなった気がしますが、エラーメッセージは出ません。

ふと気づいたのですが、A1セルを対象にしているのですが、シートを特定していないのが原因ではないでしょうか?

使っているブックには複数のシートが有り、毎回新しいシートに入力するのでシートが増えて行きます。

マクロは記録しては使っているのですが、作成は殆どしたことが無く、申し訳ありませんが今一度教えて頂ければ幸いです。

複数で使用するBookで、表中の「日付」と「LOT No」の入力を忘れることが多いく、後で入れるのが面倒なので、まずは「LOT No」だけでもと思いますので宜しくお願いします。

ちなみに2つのセルを対象にする場合は、
If Range("A1"or"B2").Value = "" Then
とかにするれば良いのでしょうか?

お手数をおかけします。

投稿日時 - 2017-12-04 15:01:36