Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
Outlookのmsgファイルを再利用してメールを作成する方法について
投稿日時: 24/06/28 15:08:00
投稿者: takatada72

お疲れさまです。
 
下記のコードをAIに確認しながら作っているのですが、VBAが理解不十分なので、どのように
AIに聞けばよいのかが不明です。申し訳ありませんが、こちらで解決できればと思い投稿させて
頂きました。何度もAIに聞いているのですが、先に進めませんでした。
 
下記のコードは、テンプレート(msg)を再利用して新しくメールを作るExcel vba コードになります。
メールの本文の途中に「場合もありますので、ご注意下さい。(担当者の認識とズレてしまいます)」の文字があり、その文字の下から、メールの下までの内容を削除したいのですが、全く削除がされませんでした。
どのようにExcel vba コードを修正すれば、実現可能になりますでしょうか
 
お忙しいとは思いますが宜しくお願い致します。
 
  Dim olApp As Object
    Dim Msg As Object
    Dim ForwardMsg As Object
    Dim i As Integer
    Dim bodyText As String
    Dim posStart As Long
    Dim templatePath As String
    Dim searchString As String
    Dim linesToDelete As Integer
    Dim bodyLines() As String
     
    ' テンプレートのパス
    templatePath = "C:\未確認アイテム 配信日 2024_06_18.msg"
     
    ' 検索する文字列
    searchString = "場合もありますので、ご注意下さい。(担当者の認識とズレてしまいます)"
     
    ' 削除する行数
    linesToDelete = 20
     
    ' Outlookアプリケーションを取得
    Set olApp = CreateObject("Outlook.Application")
     
    ' メールテンプレートを開く
    Set Msg = olApp.CreateItemFromTemplate(templatePath)
     
    ' メールを転送モードにする
    Set ForwardMsg = Msg.Forward
     
    ' 件名を変更
    ForwardMsg.subject = "PPS未確認アイテム 配信日 " & Format(Date, "yyyy/mm/dd")
     
    ' CCにアドレスを追加
    ForwardMsg.CC = "qc@test.com,qa@test.com"
     
    ' 本文を取得
    bodyText = ForwardMsg.body
     
    ' 検索文字列の位置を取得
    posStart = InStr(bodyText, searchString)
     
    If posStart > 0 Then
        ' 検索文字列の末尾の位置を取得
        posStart = posStart + Len(searchString)
         
        ' 本文を行ごとに分割
        bodyLines = Split(bodyText, vbCrLf)
         
        ' 検索文字列の行を見つける
        For i = LBound(bodyLines) To UBound(bodyLines)
            If InStr(bodyLines(i), searchString) > 0 Then
                Exit For
            End If
        Next i
         
        ' 検索文字列の行より下の行を削除
        If i + linesToDelete <= UBound(bodyLines) Then
            ReDim Preserve bodyLines(0 To i + linesToDelete - 1)
        Else
            ReDim Preserve bodyLines(0 To i)
        End If
         
        ' 本文を再構築
        bodyText = Join(bodyLines, vbCrLf)
         
        ' 本文を更新
        ForwardMsg.body = bodyText
    End If
     
    ' メールを表示
    ForwardMsg.display

回答
投稿日時: 24/06/28 18:31:56
投稿者: sk

引用:
テンプレート(msg)を再利用して新しくメールを作るExcel vba

引用:
メールの本文の途中に「場合もありますので、ご注意下さい。(担当者の認識とズレてしまいます)」の文字があり、その文字の下から、メールの下までの内容を削除したい

(標準モジュール)
----------------------------------------------------------------
Sub CreateMailItemFromTemplate()

    Dim strMailTemplatePath As String
    
    strMailTemplatePath = "C:\未確認アイテム 配信日 2024_06_18.msg"

    If Dir(strMailTemplatePath) = "" Then
        MsgBox "テンプレートファイル""" & strMailTemplatePath & """が見つかりません。", _
               vbExclamation, _
               "ファイル参照エラー"
        Exit Sub
    End If

    Dim olkApp As Object        'Outlook.Application
    Dim olkMailItem As Object   'Outlook.MailItem
  
    On Error Resume Next
    Set olkApp = GetObject(, "Outlook.Application")
    If Err.Number <> 0 Then
        Err.Clear
        On Error GoTo 0
        Set olkApp = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
    
    Set olkMailItem = olkApp.CreateItemFromTemplate(strMailTemplatePath)
    
    Dim wrdDoc As Object    'Word.Document
    
    With olkMailItem
        .To = ""
        .CC = "qc@test.com; qa@test.com"
        .AutoForwarded = True
        .Subject = "PPS未確認アイテム 配信日 " & Format(Date, "yyyy/mm/dd")
        .Display
        Set wrdDoc = .GetInspector.WordEditor
    End With
        
    Dim wrdTargetRange As Object    'Word.Range
    Dim lngDeleteStart As Long
    Dim lngDeleteEnd As Long
        
    Set wrdTargetRange = wrdDoc.Content
        
    With wrdTargetRange.Find
        .ClearFormatting
        .ClearAllFuzzyOptions
        .Forward = True
        .MatchByte = False
        .MatchCase = False
        .Text = "場合もありますので、ご注意下さい。(担当者の認識とズレてしまいます)"
        .Execute
        If .Found = True Then
            lngDeleteStart = wrdTargetRange.End
            lngDeleteEnd = wrdDoc.Content.End
        End If
    End With
    
    If lngDeleteStart < lngDeleteEnd Then
        wrdDoc.Range(lngDeleteStart, lngDeleteEnd).Delete
    End If
    
    Set wrdDoc = Nothing
    Set olkMailItem = Nothing
    Set olkApp = Nothing

End Sub
----------------------------------------------------------------
 
以上のようなコードを実行できればよい、ということでしょうか。

投稿日時: 24/07/01 08:31:04
投稿者: takatada72

お世話になっております。
 
急で申し訳ありませんが、Excel のPERSONAL.XLSBが壊れてしまいました。解決するまで、
先に進めなくなってしまいました。
 
申し訳ありませんが、一旦、保留にさせてください。
お忙しいとは思いますが宜しくお願い致します。

投稿日時: 24/07/01 09:41:27
投稿者: takatada72

skさん、ありがとうございました。
 
無事、ネットを検索してPERSONAL.XLSBの修復が完了しました。
その後、skさんが教えてくれたコードを試してみました。
 
私が描いている通りになりビックリしました。
 
ありがとうございました。無事、解決しました。