• 締切済み

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)...」ボタンでファイルを添付して送って来て、困ってます。何か対策はないでしょうか?上記コードを生かしたコードを教えていただくと助かります。

noname#138304
noname#138304

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 直接の回答ではありません。 同じような質問を繰り返されているようですが、残念ながら、その設計自体に問題があります。会社の規模がどの程度か分かりませんが、不特定多数でなかったら、#1さんのご指摘の使用者の教育を徹底とされることでしょうね。 それと、コードは間違いとは言わないまでも、「Workbook_BeforeSave」と、最終目的のメール発信とは関係性がありませんし、ある程度の経験者ならそのようなコードは書かないです。入り口から違っているように思います。報告書を会社にメールを送る場合に、保存は、最優先ではありません。 最近のここカテゴリでも、同じような会社のシステムで質問されている方もいます。その方たちは、みなさん、その後成功され実用化していると思います。残念ながら、少なくとも私は、その導入部分まではお教えするつもりはありません。ご自身でどうしたらよいか研究してください。 ただ、まず、実際のメール発信者のメーラーは何を使っているか、という問題から始まっていきますが、それが特定できない場合は、そこから考えなくてはなりません。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

ExcelVBAで必須セルを入力しないと保存不可設定したが、未入力有でメールして来られる。対策は? http://okwave.jp/qa4834155.html この時に解決した部分と、今回の質問事項との違いがわかりにくい感じがします。 前回も思いましたが、Excelを使う作業者への教育を徹底させる事が先なのではと思います。 と私見です。 ExcelのVBAで、必須セルを入力しないと保存できない設定をしましたが、保存しない... http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1224742597

関連するQ&A

  • 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の「メニューバー(?)」の「ファイル」「送信」「メールの宛先」でファイルを送って来て、困ってます。何か対策はないでしょうか?上記コードを生かしたコードを教えていただくと助かります。

  • 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設定 パスワード入力しても印刷不可

    エクセルVBAでパスワードを入力しないと印刷できない設定にしました。 Private Sub Workbook_BeforePrint(Cancel As Boolean) Password = "1111" x = InputBox("印刷注意 パスワード") If x = Password Then Else Cancel = True End If End Sub パスワード【1111】を入力しても印刷できないのですが、なぜでしょう?

  • ファイルを開くマクロで質問です

    ファイルを開くマクロで質問です。 セルC20にファイルのパスが入力されています。 例:V:\Book1.xlsx セルI9~I18 M9~M18でダブルクリックしたときに C20セルにあるパスをひらくにはどうしたらよいでしょうか? 現在はどのセルでダブルクリックをしてもC20のパスが開いてしまいます。 またC20のパスがすでに開いている時、エラーなどにならずに そのエクセルシートを開く方法はありますでしょうか? 読み取り専用や、一度保存して閉じるとかではなく そのまま開いているシートにとびたいです。 もしこれが無理であれば保存してとじて再度開き直す方法でも大丈夫です。 さらにこれはもし分かればでいいのですが、その開いたエクセルシートの 【計測データ読み込み】という名前のシートのD列の一番下のデータを ダブルクリックしたセルに貼り付ける方法も分かれば教えて下さい。 とりあえず、現状のマクロをはりつけて置きます。現状はシートを開くところまでしか 作れていません。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Cancel = True Dim i As Integer Dim filepath As String filepath = Range("C20").Value '☆ If Dir(filepath) = "" Then MsgBox filepath & vbCrLf & "はファイルが見つかりません。" '★ Exit Sub End If For i = 1 To Workbooks.Count If filepath = Workbooks(i).FullName Then MsgBox filepath & vbCrLf & "は既に開いています。" '★ Exit Sub End If Next i Workbooks.Open Filename:=Range("C20").Value End Sub 

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

    お世話になります。 ダブルクリックイベントで、そのセルを赤く色を塗り、尚且つ、 そのセルをダブルクリックした事により、別のワークブックを開き、 また、開いたワークブックのシートの中からある単語を検索して その属性を現在アクティブにしている、ブックのシートに記入しよう としていますが、 まず、下記の様に、ダブルクリックイベントで、セルを赤く塗るまではうまくいったのですが、別のブックを開く事がうまく出来ません。 記述が悪いのか、または標準モジュールに記述するべきなのか分からなく困っています。 どなたかご教授頂きたく宜しくお願い申し上げます。        記 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まで連動したリストがリアルタイムで動作するようにコードを書きたいのですが・・・なんとか教えていただけませんでしょうか・・

  • Excel VBA ユーザー定義関数をイベントマクロで使用する

    Excel VBA ユーザー定義関数をイベントマクロで使用する Excel2003を使用しています。 あるセルと同色に塗りつぶされたセルの値を合計したく、下記1のユーザー定義関数を作成しました。 このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか? 可能であれば、どのようにコードを書いたらいいでしょうか? Call を使用するのかな?と思い、コードを追加してみましたが、引数の型が一致しないといった内容のエラーメッセージが表示されてしまいました。 よろしくお願いします。 ------------------------------------------------------------- 1.ユーザー定義関数(同色セルの合計) Function SumColor(hanni As Range, iro As Range) As Double   Dim myrng As Range   SumColor = 0    For Each myrng In hanni     If myrng.Interior.ColorIndex = iro.Interior.ColorIndex Then      SumColor = SumColor + myrng.Value     End If    Next myrng End Function 2.イベントマクロ(C列3行目以下ダブルクリックで塗りつぶし) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)   If Target.Column = 3 And Target.Row >= 34 Then    Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36   End If End Sub

専門家に質問してみよう