2016-05-03 40 views
2

Outlook予定表から予定されたExcelスプレッドシートへOutlook会議と予定をリンクするプロジェクトに取り組んでいます。私は、VBAを使用して問題なしにOutlookの予定や会議を引き出すことができます。つまり、イベントが取り出されると、本文からのコンテンツの一部がExcelに、特に埋め込まれたExcelワークシートオブジェクトにエクスポートされません。私の目標は、埋め込まれたExcelシートを、ダッシュボードとして機能するスタンドアロンのExcelファイルにリンクすることです。OlAppointmentオブジェクトのHTMLBody回避策?

私がこれまでに持っているコードは、Outlookの招待状の送信者、予定の日付、および本文を引き出すことができます。問題は、埋め込まれたExcelシートをExcelに書き出すことができないということです。これが電子メールの場合は、.HTMLBodyプロパティを使用して、タグとしてタグ付けされたデータをプルすることができます。しかし、私はolItemsではなくolAppointmentItemsで作業しているので、HTMLBodyプロパティはオプションではないと思います。

私は誰かが私に埋め込みワークシートオブジェクトを見通し内で引き出すことを可能にする回避策の方向を教えてくれることを願っています。私が実行しているコードの関連部分は以下の通りです。olAppointmentsオブジェクトが.HTMLBodyプロパティをサポートしていないことを示すエラーメッセージが表示されます。 Public SubのCallの変数は、マクロが入っているExcelシートのセルに名前が付けられています。

ご意見をいただければ幸いです。ありがとう!

Public Sub ExtractAppointments_ForPublic() 
With Worksheets("Calendar") 
    Call GetCalData(.Range("dtFrom").Value, .Range("dtTo").Value) 
End With 
End Sub 

Private Sub GetCalData(StartDate As Date, Optional EndDate As Date) 
'Source: http://www.codeforexcelandoutlook.com/blog/2008/08/extract-calendar-data-from-outlook-into-excel/ 
' ------------------------------------------------- 
' Notes: 
' If Outlook is not open, it still works, but much slower (~8 secs vs. 2 secs w/ Outlook open). 
' Make sure to reference the Outlook object library before running the code 
' End Date is optional, if you want to pull from only one day, use: Call GetCalData("7/14/2008") 
' ------------------------------------------------- 

Dim olApp As Object 
Dim olNS As Object 
Dim objRecipient As Object 
Dim myCalItems As Object 
Dim ItemstoCheck As Object 
Dim ThisAppt As Object 
Dim MyItem As Object 
Dim StringToCheck As String 
Dim MyBook As Excel.Workbook 
Dim rngStart As Excel.Range 
Dim strTable As String 
Dim strSharedMailboxName As String 
Dim i As Long 
Dim NextRow As Long 
Dim wsTarget As Worksheet 

Set MyBook = Excel.ThisWorkbook 

'<------------------------------------------------------------------ 
'Set names of worksheets, tables and mailboxes here! 
Set wsTarget = MyBook.Worksheets("Calendar") 
strTable = "tblCalendar" 
strSharedMailboxName = wsTarget.Range("mailbox").Value 
'------------------------------------------------------------------> 

Set rngStart = wsTarget.Range(strTable).Cells(1, 1) 

'Clear out previous data 
With wsTarget.Range(strTable) 
    If .Rows.Count > 1 Then .Rows.Delete 
End With 

' if no end date was specified, then the requestor only wants one day, so set EndDate = StartDate 
' this will let us return appts from multiple dates, if the requestor does in fact set an appropriate end date 
If EndDate = "12:00:00 AM" Then 
    EndDate = StartDate 
End If 

If EndDate < StartDate Then 
    MsgBox "Those dates seem switched, please check them and try again.", vbInformation 
    GoTo ExitProc 
End If 

If EndDate - StartDate > 28 Then 
    ' ask if the requestor wants so much info 
    If MsgBox("This could take some time. Continue anyway?", vbInformation + vbYesNo) = vbNo Then 
     GoTo ExitProc 
    End If 
End If 

' get or create Outlook object and make sure it exists before continuing 
On Error Resume Next 
Set olApp = GetObject(, "Outlook.Application") 
If Err.Number <> 0 Then 
    Set olApp = CreateObject("Outlook.Application") 
End If 
On Error GoTo 0 
If olApp Is Nothing Then 
    MsgBox "Cannot start Outlook.", vbExclamation 
    GoTo ExitProc 
End If 

Set olNS = olApp.GetNamespace("MAPI") 

' link to shared calendar 
Set objRecipient = olNS.CreateRecipient(strSharedMailboxName) 
objRecipient.Resolve 
Set myCalItems = olNS.GetSharedDefaultFolder(objRecipient, 9).Items '9=olFolderCalendar 

With myCalItems 
    .Sort "[Start]", False 
    .IncludeRecurrences = True 
End With 

StringToCheck = "[Start] >= " & Chr(34) & StartDate & " 12:00 AM" & Chr(34) & " AND [End] <= " & _ 
       Chr(34) & EndDate & " 11:59 PM" & Chr(34) 

Set ItemstoCheck = myCalItems.Restrict(StringToCheck) 

If ItemstoCheck.Count > 0 Then 
    ' we found at least one appt 
    ' check if there are actually any items in the collection, otherwise exit 
    If ItemstoCheck.Item(1) Is Nothing Then GoTo ExitProc 

    For Each MyItem In ItemstoCheck 
     If MyItem.Class = 26 Then ' 26=olAppointment. See https://msdn.microsoft.com/en-us/library/office/ff863329.aspx 
      ' MyItem is the appointment or meeting item we want, 
      ' set obj reference to it 

      Set ThisAppt = MyItem 

      ' see https://msdn.microsoft.com/en-us/library/office/dn320241.aspx for documentation 

      With rngStart 

        .Offset(NextRow, 0).Value = ThisAppt.Subject 
        .Offset(NextRow, 1).Value = ThisAppt.Organizer 
        .Offset(NextRow, 2).Value = Format(ThisAppt.Start, "MM/DD/YYYY") 
        .Offset(NextRow, 3).Value = ThisAppt.Body 

        'I need something here that will let me access the table in the 
        'Outlook invite. See the Function I below as what I was thinking before I came across the issue above.            

       NextRow = wsTarget.Range(strTable).Rows.Count 

      End With 
     End If 
    Next MyItem 

Else 
    MsgBox "There are no appointments or meetings during" & _ 
      "the time you specified. Exiting now.", vbCritical 
End If 

ExitProc: 
Set myCalItems = Nothing 
Set ItemstoCheck = Nothing 
Set olNS = Nothing 
Set olApp = Nothing 
Set rngStart = Nothing 
Set ThisAppt = Nothing 
End Sub 

Function GetTableAsHTML(Meeting As Object, OutputLoc As Excel.Range) 
    If Meeting.Class = 26 Then '#26 is defined as olAppointment 
    Dim oHTML As MSHTML.HTMLDocument: Set oHTML = New MSHTML.HTMLDocument 
    Dim oElColl As MSHTML.IHTMLElementCollection 
    With oHTML 
     On Error GoTo 0 
     .Body = Meeting.HTMLBody 
     On Error GoTo 0 
     Set oElColl = .getElementsByTagName("table") 
    End With 

    Dim x As Long, y As Long 

    For x = 0 To oElColl(0).Rows.Length - 1 
     For y = 0 To oElColl(0).Rows(x).Cells.Length - 1 
      Range(OutputLoc).Offset(x, y).Value = oElColl(0).Rows(x).Cells(y).innerText 
     Next y 
    Next x 
End If 


End Function 

答えて

1

これは助けの多くの場合、私は知らないが、私は予定に私のExcelファイル(例えば、テーブル)の範囲を挿入することができないとの問題がありました。あなたが正しいです、これが電子メールオブジェクトの場合、.HTMLBodyプロパティを使用する可能性があります。

これは予定であるため、以前に選択した範囲を予定にコピーしてください(コピー&)。

これは私のために働いていたものです:

Sub MakeApptWithRangeBody() 

Dim olApp As Outlook.Application 
Dim olApt As Outlook.AppointmentItem 

Const wdPASTERTF As Long = 1 

Set olApp = Outlook.Application 
Set olApt = olApp.CreateItem(olAppointmentItem) 

With olApt 
    .Start = Now + 1 
    .End = Now + 1.2 
    .Subject = "Test Appointment" 
    Sheet1.ListObjects(1).Range.Copy 
    .Display 
    .GetInspector.WordEditor.Windows(1).Selection.PasteAndFormat wdPASTERTF 
End With 

End Sub 

どのように動作しますか?

電子メールと異なり、AppointmentItemにはHTMLBodyプロパティはありません。 もしそうなら、範囲をHTMLに変換し、その プロパティを使用します。 AppointmentItemの本文に書式設定されたテキストは、リッチ テキスト形式(RTF)です。範囲を RTFに変換する良い方法はわかりません。確かに、すべてのRTFコードが何であるかを知り、 文字列を作成してAppointmentItemのRTFBodyプロパティに入れることができます。その後 あなたはノーボケインの根管路のために歯科医に行くことができます。私は のうちどれがもっと楽しいかわからない。

彼は正しいです、私は恐ろしいRTF構文で作業しようとしました。

より良い方法は、プログラムで範囲をコピーして、それを の予定に貼り付けることです。 Office 2007以降、ほぼすべてのOutlook オブジェクトを使用すると、Wordで作成できます。それは私がすぐに をオフにするオプションですが、それはまだボンネットの下にあります。我々はそれを我々の 利点に使用します。

詳細は、元のソースを参照してください:何とか役立ちますInserting a Range into an Outlook Appointment

希望を。