0

ユーザーが Outlook から電子メールを選択できるようにするツールを作成して、その電子メールを .msg ファイルとして保存するか、添付ファイルだけをファイルとして保存できるようにする必要があります。

メールの検索/フィルタリングを許可する最も簡単で最良の方法について、少しつまずいています。Outlook と少なくとも少し似たビューをユーザーに提供する必要があります (たとえば、フォルダーは同じ順序/階層である必要があります。

Outlook オブジェクト モデルには、ユーザーが電子メールを選択した後に storeid と entryid を返すように呼び出すことができる、ある種の Explorer/Picker/Selection ダイアログがありますか? それとも自分で巻く必要がありますか?

メールまたは添付ファイルを保存する方法は既に知っているので、質問はメールの選択とフィルタリングの処理についてのみです。

参考までに、私は Outlook 2007 を使用して MS Access 2007 でこれをプログラミングしています。ターゲット マシンには、Access と Outlook の 2007 または 2010 バージョンがあります。

4

2 に答える 2

0

Outlook テーブルへのリンクは問題ありません。問題は、Outlook が各メッセージに一意の ID を提供せず、メッセージがあるフォルダーから別のフォルダーに移動すると、その ID が変わることです。データベースを理解している人によって設計されていないことは明らかです。

Outlook 内で実行される Outlook アドインを作成し、Access に情報を送信するために必要なタスクを実行することをお勧めします。

于 2012-04-23T14:50:06.810 に答える
0

私は Access でプログラミングすることはめったにありませんが、いくつかのコードを Outlook から移動し、少しハッキングしたところ、うまくいくようです。これは解決策ではありませんが、必要なすべての情報にアクセスする方法を示しているはずです。

1つの問題がありました。Outlook が既に開いている場合は、Outlook の新しいインスタンスを作成しSet OutApp = CreateObject("Outlook.Application")たり作成したりしません。Set OutApp = New Outlook.ApplicationマクロQuitの開始前に Outlook が開いていたかどうかにかかわらず、Outlook を閉じます。この問題について新しい質問を投稿することをお勧めします。Outlook が既に開いているかどうかを確認する方法を誰かが知っているため、終了しないでください。

Outlook のフォルダ構造は、最上位のフォルダのタイプが であるのFoldersに対して、すべてのサブフォルダのタイプが であるため、少し扱いに​​くいものになっていますMAPIFolder。それを乗り越えたら、それはかなり簡単です。

以下のコードには function が含まれていますGetListSortedChildren(ByRef Parent As MAPIFolder) As String。この関数は、Parent のすべての子を検索し、"5,2,7,1,3,6,4" などの文字列を返します。この文字列には、名前の昇順で子のインデックスが一覧表示されます。このようなものを使用して、ユーザーが必要に応じてノードを展開して ListView にデータを入力します。

CtrlDsplChld()すべてのフォルダの直接のウィンドウへの出力を順番に制御するサブルーチンを用意しました。フォルダー階層へのアクセスを開始するための十分なガイダンスが得られるはずです。

サブルーチンDsplChld(ByRef Parent As MAPIFolder, ByVal Level As Long)には、添付ファイルのある最初のメッセージを見つけるためのコードが含まれています。これにより、特定のメッセージのフォルダーを調べる方法がわかります。

最後にCtrlDsplChld()、メッセージの選択されたプロパティを表示します: Subject、To、HTMLBody、および添付ファイルの表示名。

お役に立てれば。

Option Compare Database
Option Explicit
Dim ItemWithMultipleAttachments As Outlook.MailItem
Sub CtrlDsplChld()

  Dim ArrChld() As String
  Dim ListChld As String
  Dim InxAttach As Long
  Dim InxChld As Long
  Dim InxTopLLCrnt As Long
  Dim OutApp As Outlook.Application
  Dim TopLvlList As Folders

  Set ItemWithMultipleAttachments = Nothing

  Set OutApp = CreateObject("Outlook.Application")
  'Set OutApp = New Outlook.Application

  With OutApp

    Set TopLvlList = .GetNamespace("MAPI").Folders

    For InxTopLLCrnt = 1 To TopLvlList.Count
      ' Display top level children and their children
      Call DsplChld(TopLvlList.Item(InxTopLLCrnt), 0)
    Next

    If Not ItemWithMultipleAttachments Is Nothing Then
      With ItemWithMultipleAttachments
        Debug.Print .Subject
        Debug.Print .HTMLBody
        Debug.Print .To
        For InxAttach = 1 To .Attachments.Count
          Debug.Print .Attachments(InxAttach).DisplayName
        Next
      End With
    End If
    .Quit
  End With
  Set OutApp = Nothing

End Sub
Sub DsplChld(ByRef Parent As MAPIFolder, ByVal Level As Long)

  Dim ArrChld() As String
  Dim InxChld As Long
  Dim InxItemCrnt As Long
  Dim ListChld As String

  Debug.Print Space(Level * 2) & Parent.Name

  If ItemWithMultipleAttachments Is Nothing Then
    ' Look down this folder for a mail item with an attachment
    For InxItemCrnt = 1 To Parent.Items.Count
      With Parent.Items(InxItemCrnt)
        If .Class = olMail Then
          If .Attachments.Count > 1 Then
            Set ItemWithMultipleAttachments = Parent.Items(InxItemCrnt)
            Exit For
          End If
        End If
      End With
    Next
  End If

  ListChld = GetListSortedChildren(Parent)
  If ListChld <> "" Then
    ' Parent has children
    ArrChld = Split(ListChld, ",")
    For InxChld = LBound(ArrChld) To UBound(ArrChld)
      Call DsplChld(Parent.Folders(ArrChld(InxChld)), Level + 1)
    Next
  End If

End Sub
Function GetListSortedChildren(ByRef Parent As MAPIFolder) As String

  ' The function returns "" if Parent has no children.
  ' If the folder has children, the functions returns "P,Q,R, ..." where
  ' P, Q, R and so on indices of the children of Parent in ascending
  ' order by name.

  Dim ArrInxFolder() As Long
  'Dim ArrFolder() As MAPIFolder
  Dim InxChldCrnt As Long
  Dim InxName As Long
  Dim ListChld As String

 If Parent.Folders.Count = 0 Then
   ' No children
   GetListSortedChildren = ""
 Else
 'ReDim ArrName(1 To Parent.Folders.Count)
 'For InxChldCrnt = 1 To Parent.Folders.Count
 '  ArrFolder(InxChldCrnt) = Parent.Folders(InxChldCrnt)
 'Next
 Call SimpleSortMAPIFolders(Parent, ArrInxFolder)
   ListChld = CStr(ArrInxFolder(1))
   For InxChldCrnt = 2 To Parent.Folders.Count
     ListChld = ListChld & "," & CStr(ArrInxFolder(InxChldCrnt))
   Next
   GetListSortedChildren = ListChld
 End If
End Function
Sub SimpleSortMAPIFolders(ArrFolder As MAPIFolder, _
                                        ByRef InxArray() As Long)

  ' On exit InxArray contains the indices into ArrFolder sequenced by
  ' ascending name.  The sort is performed by repeated passes of the list
  ' of indices that swap adjacent entries if the higher come first.
  ' Not an efficient sort but adequate for short lists.

  Dim InxIACrnt As Long
  Dim InxIALast As Long
  Dim NoSwap As Boolean
  Dim TempInt As Long

  ReDim InxArray(1 To ArrFolder.Folders.Count)  ' One entry per sub folder
  ' Fill array with indices
  For InxIACrnt = 1 To UBound(InxArray)
    InxArray(InxIACrnt) = InxIACrnt
  Next

  If ArrFolder.Folders.Count = 1 Then
    ' One entry list already sorted
    Exit Sub
  End If

  ' Each repeat of the loop moves the folder with the highest name
  ' to the end of the list.  Each repeat checks one less entry.
  ' Each repeats partially sorts the leading entries and may result
  ' in the list being sorted before all loops have been performed.
  For InxIALast = UBound(InxArray) To 1 Step -1
    NoSwap = True
    For InxIACrnt = 1 To InxIALast - 1
      If ArrFolder.Folders(InxArray(InxIACrnt)).Name > _
         ArrFolder.Folders(InxArray(InxIACrnt + 1)).Name Then
        NoSwap = False
        ' Move higher entry one slot towards the end
        TempInt = InxArray(InxIACrnt)
        InxArray(InxIACrnt) = InxArray(InxIACrnt + 1)
        InxArray(InxIACrnt + 1) = TempInt
      End If
    Next
    If NoSwap Then
      Exit For
    End If
  Next

End Sub
于 2012-04-25T11:59:23.807 に答える