dポイントプレゼントキャンペーン実施中!

マクロ初心者です。

共有にしているエクセルファイルを自分以外の誰かが更新したら、Office365のOutlookメールにお知らせ(メール)が来るようにしたいです。
更新した人が報告を忘れて、仕事に支障が出て困っています。

メールで欲しい内容は、
どのセルを変更したか。
が知りたいです。

どなたか、方法を教えてください。

質問者からの補足コメント

  • シートが2021年4月から2022年3月まであり、
    その中のセルD12からAH101までのどこかが変更したら、お知らせがくるようにしたいのですが、難しいでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/08/31 15:36

A 回答 (5件)

№4さんお回答にもありますが、データを更新しても保存せずに終了することもあると思いますので、


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,Cancel As Boolean)イベントプロシージャーの方がよいと思います。
参考https://kosapi.com/post-2038/
データを更新せずに保存することもあるかもしれませんし、データを更新した後に再更新して元に戻してから保存することもあるかもしれません。そこまで厳密にしなくてよいかと思います。
    • good
    • 1

こんばんは


一度に変更する箇所が数千とかで無いのなら、大丈夫かな、、

OneDriveだったかSharePointだったかで教えてくれる機能があったような、、使わなないので解りませんが。

#3では、説明を割愛しましたが、
セル(行列)の削除などは使えなくなります。また、エラー処理は行っていないのでサンプル程度としてください。
使用する場合、
Outlookを事前バインディングしてください。
Private Sub Workbook_BeforeClose(Cancel As Boolean) は
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) の方が良いかも

なさりたい事をざっくりコードにしてみただけで検証を行っていません。
なので実用的では、ないかもですね。
    • good
    • 0

こんにちは


変更できるセルはどのくらいあるのでしょうか?
沢山であれば、問題になるかと思いますが、少しならこんな感じで

Option Explicit
Dim aryData()
Dim n As Long
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim bf_val, af_val()
Dim cnt As Long
Application.EnableEvents = False
For cnt = 1 To Target.Count
ReDim Preserve af_val(cnt)
af_val(cnt) = Target(cnt).Formula
Next
Application.Undo
For cnt = 1 To Target.Count
bf_val = Target(cnt).Formula

Target(cnt).Formula = af_val(cnt)
If af_val(cnt) <> bf_val Then
If bf_val = "" Then bf_val = "Empty?"
ReDim Preserve aryData(n)
aryData(n) = Sh.Name & "_" & Target.Address(0, 0) & " : " & bf_val & " --> " & af_val(cnt)
n = n + 1
End If
Next
Application.EnableEvents = True
End Sub

Sub SendEmail()
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(olMailItem)
Dim i As Long
Dim BodyText As String
For i = 0 To UBound(aryData)
BodyText = BodyText & aryData(i) & vbCrLf
Next
With objMail
.To = "" 'メール宛先
.Subject = "Excel 編集" 'メール件名
.Body = Format(Date, "yyyy/mm/dd") & vbCrLf & _
Application.UserName & vbCrLf & vbCrLf & _
BodyText 'メール本文
.Display
' .Send
End With
Set objMail = Nothing
Set objOutlook = Nothing

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If n > 0 Then
Call SendEmail
End If
Erase aryData '不要
n = 0 '不要
'Cancel = True '不要デバッグ用
End Sub

すべてThisWorkbookモジュールに記
Outlookは取敢えず表示(送信準備)
バックグランドでの送信などは調べてください。
共有ファイルで試していないのでダメかも知れません。
この回答への補足あり
    • good
    • 0

こんにちは



マクロに関してはすでに回答がでていますので・・・

メールは送れませんけれど、エクセルの機能で以下のようなものがあります。
この程度では使い物にはならないでしょうか。
https://forest.watch.impress.co.jp/docs/serial/e …
    • good
    • 0

こんにちは。



直接の回答ではありませんが、正直、かなり難しいのでは?と思います。
もし作成されるなら、下記の組み合わせが必要だと思います。
 (下記HPの詳細は見ていませんので、最適化は不明です。)
作成する前に、どの様な仕様で作成するかを、きちんと決めないと、
 後々、トラブルになりそうな気がします。
あと、変更履歴がちゃんと残るかなど、検証も必要かと。

VBAでメール作成・送信!エクセルマクロでOutlook操作する方法
https://fastclassinfo.com/entry/vba_outlook_send …

ブックが閉じる時に自動実行(Workbook_BeforeCloseとAuo_Close)
https://excel-ubara.com/excelvba4/EXCEL240.html

共有しているエクセルファイルの変更履歴・更新ログをとる方法
https://deskworklabo.jp/auto-log/
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A