• ベストアンサー

ExcelVBAで必須セルを入力しないと保存不可設定したが、未入力有でメールして来られる。対策は?

知恵袋にも質問しましたが、回答を頂けるか不安で、こちらにも質問します。 ExcelのVBAで、先日、次の要望(1)~(5)を満たすコード(下記記載)を教えて頂き、大変助かりました。 ただ、新たな問題(最後に書いてます)が発生しましたので、ご回答をお願いいたします。 (1)特定のセル(A1,B5,C10等)を入力しないとファイルを保存できない設定 (2)全て入力してたら、閉じる時に普段どおり、『「保存しますか?」の質問に「はい」「いいえ」「キャンセル」』のメッセージボックスが出るように (3)入力してなかったら、閉じる時に『「未入力ですので、保存できません」』の質問に「保存しません」「キャンセル」』のメッセージボックスが出るように (4)上書可能で、上書きする時に特定のセル(D12)にその時の日を入力したいが、その日には条件があって、16:00より前ならその日、16:00以降なら翌日に入力されるように (5)また、作成者がそこを空白のまま保存できないので、作成者については、その制限がかからない方法 ブックモジュール[ThisWokbook]に Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.UserName = ThisWorkbook.BuiltinDocumentProperties("Author") Then Exit Sub '許可するユーザー名 Dim myRng As Range Dim myStr As String With Worksheets("Sheet1") Set myRng = Union(.Range("A1"), .Range("B5"), .Range("C10")) End With If WorksheetFunction.CountA(myRng) < 3 Then Cancel = True myStr = "未入力セルがあります" & vbCrLf & _ "[OK....保存しないで終了]" & vbCrLf & _ "[キャンセル..編集に戻る]" If MsgBox(myStr, vbOKCancel) = vbOK Then ThisWorkbook.Close False End If End If Worksheets("Sheet1").Range("D12") = Date + IIf(Time < TimeValue("16:00"), 0, 1) End Sub 新たな問題ですが、このExcelファイルは依頼書で各営業が全て入力してからメールでこちら部署に送って来ます。そこで、営業が上書きせずに(必須項目未入力有)、Excelの「メニューバー(?)」の「ファイル」「送信」「メールの宛先」でファイルを送って来て、困ってます。何か対策はないでしょうか?上記コードを生かしたコードを教えていただくと助かります。

noname#138304
noname#138304

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

  • ベストアンサー
noname#89471
noname#89471
回答No.3

こんにちは。 > 営業が上書きせずに(必須項目未入力有)、Excelの「メニューバー(?)」の「ファイル」「送信」「メールの宛先」で > ファイルを送って来て、困ってます。 ------------------- 編集途中(未入力項目有り)でも、上記の操作でメールが送れてしまう... とのことでよろしいでしょうか? 私、あまり詳しくないので、参考ということで、ご理解ください。 また、もっとよいやり方があるかもしれませんので、以後の回答をご参考にしてください。 [ファイル]、[送信]のメニューは Application.CommandBars("file").Controls("送信(&D)").Enabled = False で無効にできるようです。 ただし、ユーザー設定で、メニューの"送信(&D)"を編集されてしまっていると、無効(または有効)にはできません。 案として、元のコードを流用させていただき... ワークブック開いたとき[送信]のメニューを無効 ------------------- Private Sub Workbook_Open() Application.CommandBars("file").Controls("送信(&D)").Enabled = False End Sub ワークブック閉じたとき[送信]のメニューを有効 ------------------- Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.CommandBars("file").Controls("送信(&D)").Enabled = True End Sub ワークシート変更されたときのイベント (未入力ありの場合は、[送信]のメニューを無効、未入力なしの場合は[送信]のメニューを有効) ------------------- Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim myRng As Range With Worksheets("Sheet1") Set myRng = Union(.Range("A1"), .Range("B5"), .Range("C10")) End With If WorksheetFunction.CountA(myRng) < 3 Then Application.CommandBars("file").Controls("送信(&D)").Enabled = False Else Application.CommandBars("file").Controls("送信(&D)").Enabled = True End If End Sub あとは、n_na_tto様がおっしゃってらっしゃるように、"営業の方に必要部分を入力することを徹底させる"ことが 先ず第一に必要なことと思います。仕事ですから。 私も、勉強になりました。 ありがとうございました。

noname#138304
質問者

お礼

ご回答ありがとうございました。 大変助かりました!!

その他の回答 (2)

  • n_na_tto
  • ベストアンサー率70% (75/107)
回答No.2

無駄なUnionを使っていたので、恥ずかしいので修正します。 さらに「保存しません」の選択肢をなくすと、こんな感じです。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.UserName = ThisWorkbook.BuiltinDocumentProperties("Author") Then Exit Sub '許可するユーザー名 Dim myRng As Range Set myRng = Worksheets("Sheet1").Range("A1,B5,C10") If WorksheetFunction.CountA(myRng) < 3 Then  Cancel = True  MsgBox "A1,B5,C10すべて入力してください", vbOKOnly End If End Sub

noname#138304
質問者

お礼

追記していただきまして、ありがとうございます。 大変勉強になりました!

  • n_na_tto
  • ベストアンサー率70% (75/107)
回答No.1

n_na_ttoです。 お急ぎのようですね。 IIFの部分だけ私のコードと違いますが、 ご自分で追加されたのですか? コードの問題というより、仕様を考えるべきだと思います。 なぜなら >「未入力ですので、保存できません」の質問に「保存しません」 を選択して、 >営業が上書きせずに 終了すれば当然元のデータ未入力のまま。 そういう仕様でコードを書きました。 新しく「保存しません」の選択肢をなくしたい、ということですか? あと、営業の方に必要部分を入力することを徹底させるとか...

noname#138304
質問者

お礼

ご回答ありがとうございました。 とてもアナログな会社で、Excelに詳しい人はいないわりには、営業の要求が多かったり、不備の多い書類を出されたりで、困ってまして、勿論、必要部分を入力することを徹底出来ない環境なのです。 面倒な質問で本当にすみません。

関連するQ&A

  • ExcelVBAで必須セルを入力しないと保存不可設定したが、未入力有でメールして来られる。対策は?先日の変更

    ExcelのVBAで、必須セルを入力しないと保存できない設定をしましたが、保存しないで(全て埋めないで)ファイルをメールで送られ困ってます。その対策は? ExcelのVBAで、先日同じような質問をしましたが、追記がありますので、よろしくお願いいたします。 さらにその前に次の要望(1)~(5)を満たすコード(下記記載)を教えて頂き、大変助かりました。 ただ、新たな問題(最後に書いてます)が発生しましたので、ご回答をお願いいたします。 (1)特定のセル(A1,B5,C10等)を入力しないとファイルを保存できない設定 (2)全て入力してたら、閉じる時に普段どおり、『「保存しますか?」の質問に「はい」「いいえ」「キャンセル」』のメッセージボックスが出るように (3)入力してなかったら、閉じる時に『「未入力ですので、保存できません」』の質問に「保存しません」「キャンセル」』のメッセージボックスが出るように (4)上書可能で、上書きする時に特定のセル(D12)にその時の日を入力したいが、その日には条件があって、16:00より前ならその日、16:00以降なら翌日に入力されるように (5)また、作成者がそこを空白のまま保存できないので、作成者については、その制限がかからない方法 ブックモジュール[ThisWokbook]に Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.UserName = ThisWorkbook.BuiltinDocumentProperties("Author") Then Exit Sub '許可するユーザー名 Dim myRng As Range Dim myStr As String With Worksheets("Sheet1") Set myRng = Union(.Range("A1"), .Range("B5"), .Range("C10")) End With If WorksheetFunction.CountA(myRng) < 3 Then Cancel = True myStr = "未入力セルがあります" & vbCrLf & _ "[OK....保存しないで終了]" & vbCrLf & _ "[キャンセル..編集に戻る]" If MsgBox(myStr, vbOKCancel) = vbOK Then ThisWorkbook.Close False End If End If Worksheets("Sheet1").Range("D12") = Date + IIf(Time < TimeValue("16:00"), 0, 1) End Sub 新たな問題ですが、このExcelファイルは依頼書で各営業が全て入力してからメールでこちら部署に送って来ます。そこで、営業が上書きせずに(必須項目未入力有)、Excelの「標準ツールバー(?)」の「コマンドボタン」の「メールの宛先(M)」ボタン「メールの宛先(A)...」ボタンでファイルを添付して送って来て、困ってます。何か対策はないでしょうか?上記コードを生かしたコードを教えていただくと助かります。

  • ExcelのVBAで、特定のセルを入力しないとファイルを保存できない設定で、その上書日時を別のセルに入力(但し条件有)

    知恵袋にも質問しましたが、明日朝までに回答を頂けるか不安で、こちらにも質問します。 ExcelのVBAで、特定のセル(A1,B5,C10等)を入力しないとファイルを保存できない設定で、 (1)全て入力してたら、閉じる時に普段どおり、『「保存しますか?」の質問に「はい」「いいえ」「キャンセル」』のメッセージボックスが出るように (2)入力してなかったら、閉じる時に『「未入力ですので、保存できません」』の質問に「保存しません」「キャンセル」』のメッセージボックスが出るように。 (3)また、作成者がそこを空白のまま保存できないので、作成者については、その制限がかからない方法 を下記のコードで教えていただきました。 その下記のコードに(4)上書可能で、上書きする時に特定のセル(D12)にその時の日を入力したいのですが、その日には条件があって、16:00より前ならその日、16:00以降なら翌日に入力されるように下記に付け加えたいのですが、どうすれば良いのでしょうか? ブックモジュール[ThisWokbook]に Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.UserName = ThisWorkbook.BuiltinDocumentProperties("Author") Then Exit Sub '許可するユーザー名 Dim myRng As Range Dim myStr As String With Worksheets("Sheet1") Set myRng = Union(.Range("A1"), .Range("B5"), .Range("C10")) End With If WorksheetFunction.CountA(myRng) < 3 Then Cancel = True myStr = "未入力セルがあります" & vbCrLf & _ "[OK....保存しないで終了]" & vbCrLf & _ "[キャンセル..編集に戻る]" If MsgBox(myStr, vbOKCancel) = vbOK Then ThisWorkbook.Close False End If End If End Sub

  • ExcelVBA 二つのセルに入力された時の判定

    セルA1とA2両方に値が入力された時、セルA3に文字を入力するマクロを作りたいです。 下記プログラムで試しているのですが、ステップインで見ると最初のIFでTrue判定されてしまいます。 どうすればこの条件を満たすマクロになるのか、教えて頂けないでしょうか。 以上、宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Or Intersect(Target, Range("A2")) Is Nothing Then Exit Sub Else If Range("A1").Value <> "" And Range("A2").Value <> "" Then Range("A3").Value = "入力済み" End If End If End Sub

  • エクセル VBA セルの色をSheet1とSheet2の両方を変えたいのですが・・・

    最近困っているところが表題の通りなのですが Sheet1のB2を右クリックするとB2のセルの色を変えて Sheet2のB2のセルも色を変えたいというものです。 現状で Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Dim RngA As Range, myRngA As Range Set Rng = Range("B3:W3,b7:w8,b12:w12,d13:w13,d17:w18,d22:w23") Set myRng = Intersect(Target, Rng) If myRng.Interior.ColorIndex = xlColorIndexNone Then myRng.Interior.ColorIndex = 37 Else If myRng.Interior.ColorIndex = 37 Then myRng.Interior.ColorIndex = 45 Else myRng.Interior.ColorIndex = xlColorIndexNone End If End If Cancel = True End Sub とここまではあるのですが、これをどう改造すればSheet2の同じセルの色もかわるのでしょうか? 宜しくお願いいたします

  • VBAでオートフィルを使って指定する文字列を含むものを表示させたい

    VBAを使って、セルD1に入力した文字列を検索するマクロを作りたいと思っています。 私は初心者で前に似たようなものを作ってもらって それを加工しようとしたのですが、うまくいきませんでした。 以前は完全に一致するもので表示でしたが、 今回は含むものを表示させたいです。 ワイルドカードは*をつけるのはわかるのですが、 いろいろやってみましたがダメでした。(単純なことかもしれないですけど) Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng1 As Range Dim myRng2 As Range Set myRng1 = Target.Cells(1) If Application.Intersect(myRng1, Range("D1")) Is Nothing Then Exit Sub Set myRng2 = Range("D1").CurrentRegion With myRng2 If myRng1 = "" Then ActiveSheet.ShowAllData Else .AutoFilter Field:=4, Criteria1:=myRng1.Value End If End With End Sub

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • ダブルクリックイベントで良いのかどうか?

    お世話になります。 ダブルクリックイベントで、そのセルを赤く色を塗り、尚且つ、 そのセルをダブルクリックした事により、別のワークブックを開き、 また、開いたワークブックのシートの中からある単語を検索して その属性を現在アクティブにしている、ブックのシートに記入しよう としていますが、 まず、下記の様に、ダブルクリックイベントで、セルを赤く塗るまではうまくいったのですが、別のブックを開く事がうまく出来ません。 記述が悪いのか、または標準モジュールに記述するべきなのか分からなく困っています。 どなたかご教授頂きたく宜しくお願い申し上げます。        記 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Set Rng = Range("c2:d2,f2") Set myRng = Intersect(Target, Rng) If myRng Is Nothing Then Exit Sub Rng.Interior.ColorIndex = xlColorIndexNone myRng.Interior.ColorIndex = 3 Cancel = True If Intersect(Target, Range("c2")) Then Workbooks.Open Filename:="C:\Documents and Settings\Owner\デスクトップ\台帳.xls" End If End Sub

  • worksheetchangeイベント

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng As Range Set myRng = Application.Intersect(Target, Range("A1:D2,A4:D6")) If myRng Is Nothing Then Exit Sub If WorksheetFunction.CountA(myRng) = 0 Then myRng.Value = "-" ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then Range("B1:D1").Value = "-" End If End Sub A1:D2範囲とA4:D6範囲内で、アクティブセルでDELETEキーを押した場合、"-"がセルに挿入されるようにコードを書きました。 さらに、A1セルの値がドロップダウンリストで139.8に変更された場合、B1、C1、D1に"-"を入力するようにしました。 A1セルの値を変更した場合の処理がうまくいかず四苦八苦しています。 ElseIf Intersect(Target, Range("A1")).Value = "139.8" Then ここを、 Range("A1").value = "139.8" Then にしてしまうとA1の値が139.8の状態ではB1、C1、D1へ数値を入力しても"-"となってしまいます。 A1からD1まで連動したリストがリアルタイムで動作するようにコードを書きたいのですが・・・なんとか教えていただけませんでしょうか・・

  • セルの値をファイル名にするには

    現在下記のマクロを入力しています。 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub この時 ファイル名を SHEET1のA1 セルの値を利用してファイル名にするために下記の内容を入れてブックを保存したいと考えています。 上記のマクロが入っていないときは上手く行くのですが下記を追加するにはどうすればいいかご指導いただけませんでしょうか。 宜しく御願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If End Sub

専門家に質問してみよう