Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2016)
outlookのアクティブ化(前面に表示する)について
投稿日時: 23/02/03 18:22:06
投稿者: 初心者たつ

マクロ初心者です。以下の構文でoutlookのMailをexcel内の図を貼り付けて作成したいのですが、なぜかoutlookがアクティブになるときとならない時があります。タスクバーのアイコンは点滅するのでMail自体は作成できているのですが、sendkeyで図が張り付けることができません。解決策はないのでしょうか?
 
Sub Mail_Click()
 
    ThisWorkbook.Save
    Worksheets("sheet1").Protect UserInterfaceOnly:=True
 
    Dim toaddress, ccaddress, bccaddress As String
    Dim subject, mailBody, credit As String
    Dim oapp As Object, objmail As Object
     
    If Worksheets("sheet2").Range("B101") = 0 Then
        MsgBox "処理を終了します。", 0, "メッセージ"
        Exit Sub
    End If
     
    Set oapp = CreateObject("Outlook.Application")
    Set objmail = oapp.CreateItem(0)
                        oapp.ActiveWindow.WindowState = 2
 
    Dim i
        For i = Cells(Rows.Count, 6).End(xlUp).Row To 4 Step -1
            If Cells(i, 6) = "" Then
                GoTo Continue
            End If
                Range(Cells(i, 2), Cells(i, 8)).Select
                Selection.Delete xlShiftUp
Continue:
            Next
 
    toaddress = Worksheets("Mail").Range("B1").Value
    ccaddress = Worksheets("Mail").Range("B2").Value
    subject = Worksheets("Mail").Range("B3").Value
    mailBody = Worksheets("Mail").Range("B4").Value
    credit = Worksheets("Mail").Range("B5").Value
 
    With objmail
        .To = toaddress
        .CC = ccaddress
        .subject = subject
        .BodyFormat = 2
        .Body = mailBody & vbCrLf & vbCrLf & vbCrLf & credit
        .Display
        .GetInspector.Display (False)
    End With
 
    Dim ENDROW As Long
          ENDROW = Cells(Rows.Count, 5).End(xlUp).Row
 
        Range(Cells(4, 2), Cells(ENDROW, 2)).Value = Range(Cells(4, 2), Cells(ENDROW, 2)).Value
 
    Set wdDoc = ActiveInspector.WordEditor
    With wdDoc.Windows(1).Document.Range.Font
        .Name = "Meiryo UI"
        .Size = 10
    End With
        Worksheets("sheet1").Activate
        Range(Cells(3, 2), Cells(ENDROW, 8)).CopyPicture
     With oapp.ActiveInspector.WordEditor.Windows(1).Selection
        Application.Wait [Now()] + 1 / 86400
        SendKeys ("^{down 2}")
        SendKeys ("^v")
        SendKeys ("{ENTER}")
        SendKeys ("^{down 4}")
     End With
 
     Application.CutCopyMode = False
      
     Set oapp = Nothing
     Set objmail = Nothing
     
End Sub

回答
投稿日時: 23/02/04 21:16:45
投稿者: simple

昨日、以下のコメントをしましたが、その後全く音沙汰無いので、興味を失ったと見なして削除しました。
 

引用:
質問に対する考え方だけですが、
・SendKeysは不安定なことで定評があります。これは避けたほうがよいでしょう。
・別の方法を検討して下さい。
    With Worksheets("sheet1")
        .Range(.Cells(3, 2), .Cells(ENDROW, 8)).CopyPicture
    End With
    With oapp.ActiveInspector.WordEditor.Windows(1).Selection
        .Paste
    End With
のようにすることで図のコピー貼り付けができると思います。
貼り付け位置の調整などはそちらで工夫してください。

とまあ、これも大人げないかと再考し、コードを作成しましたので、参考にしてください。
(私の環境で正常に動作することを確認しています。)
テストに当たって不要な内容は削除していますので、
必要なところは、そちらで追加したり、細かい修正はそちらでして下さい。
Sub Mail_Click()
    Dim oapp    As Object
    Dim objmail As Object
    Dim wdDoc   As Object
    Dim toaddress$, ccaddress$, bccaddress$  '$は As Stringと同一の意味
    Dim subject$, mailBody$, credit$

    Set oapp = CreateObject("Outlook.Application")
    Set objmail = oapp.CreateItem(0)
  
    With Worksheets("Mail")
        toaddress = .Range("B1").Value
        ccaddress = .Range("B2").Value
        subject = .Range("B3").Value
        mailBody = .Range("B4").Value
        credit = .Range("B5").Value
    End With
  
    With objmail
        .Display
        .BodyFormat = 2     'olFormatHTML
        .To = toaddress
        .CC = ccaddress
        .subject = subject
        '.Body = mailBody & vbCrLf & vbCrLf & vbCrLf & credit 'あとで纏めて書き込む。
        .GetInspector.Display (False) '既定値なら実行する必要なし?
    End With

    Dim ENDROW As Long
    With Worksheets("sheet1")
        ENDROW = Cells(Rows.Count, 5).End(xlUp).Row
        .Range(.Cells(4, 2), .Cells(ENDROW, 2)).Value =  _
               .Range(.Cells(4, 2), .Cells(ENDROW, 2)).Value
    End With

    Set wdDoc = oapp.ActiveInspector.WordEditor   
    With wdDoc.Windows(1).Document.Range.Font
        .Name = "Meiryo UI"
        .Size = 10
    End With

    With Worksheets("sheet1")
        .Range(.Cells(3, 2), .Cells(ENDROW, 8)).CopyPicture
    End With
    
    With oapp.ActiveInspector.WordEditor.Windows(1).Selection
        .TypeText mailBody & vbCrLf & vbCrLf
        .Paste              'Pictureを貼り付け
        .TypeText vbCrLf
        .TypeText credit & vbCrLf
    End With

    Set objmail = Nothing
    Set oapp = Nothing
End Sub

# なお、仕様追加にお答えする積りはありませんので、予め申し上げておきます。

トピックに返信