4

問題: AddressListにはC# DataTable (DatTableObject.Select( filter criteria )などの組み込みのフィルター機能がない ように思われるので、これを行う方法を探しています。

私がアクセスしているグローバル アドレス一覧には約 100 万のエントリがあり、最大 1000 回検索する必要があります。

次のコードを使用して、交換ユーザー名を使用して人々の電子メールを検索しています。

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntry = aList.AddressEntries("" + ExchangeName + "") 
            Set exUser = aEntry.GetExchangeUser

しかし、単一の AddressEntry しか取得できません。これは、同じ Exchange 名を持つ複数の人がいる場合に問題になります。これは頻繁に発生します。

質問: Outlook でグローバル アドレス一覧を検索すると、すべてがアルファベット順にソートされており、高速で、入力した文字列で始まるすべての一致が表示されます。VBA で同様のコレクションを取得するにはどうすればよいですか?

4

1 に答える 1

0

オブジェクトはオブジェクトのAddressEntriesコレクションAddressEntryです。そのままコレクションに
直接インデックスを付けると、指定されたパラメーターに基づいて単一のオブジェクトが返されます。パラメータは、インデックス番号またはアイテムのデフォルト プロパティのいずれかです。AddressEntries AddressEntryIndexIndex

AddressEntry項目の既定のプロパティはプロパティであるため.Name、返されるのは、コレクション内の最初の項目が.Nameプロパティに一致するものです。


AddressEntryプロパティで一致するコレクション内のすべてのオブジェクトを返したい場合は、コレクション.Nameをループする必要があります。

さて、.Net では、 を使用してコレクションを反復処理できます。VBAFor...Nextでもこれを実行できると思いますが、思い出すことはできません。例えば:

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntries = aList.AddressEntries
            For each aEntry in aEntries
                if aEntry.Name="" + ExchangeName + "" Then
                    'Do something with aEntry object
                End If
            Next

何らかの理由でそれが機能しない場合は、GetFirstおよびGetNextメソッドを使用してコレクションを反復処理できます。
例えば:

Set olApp = CreateObject("Outlook.Application")
            Set myNamespace = olApp.GetNamespace("MAPI")
            Set aList = myNamespace.AddressLists.Item("Global Address List")
            Set aEntries = aList.AddressEntries
            Set aEntry = aEntries.GetFirst
            Do While Not aEntry is Nothing
                if aEntry.Name="" + ExchangeName + "" Then
                    'Do something with aEntry object
                End If
                Set aEntry = aEntries.GetNext
            Loop

アルファベット順の並べ替えについては、Sort Methodをご覧ください。


そして、機能を構築する限り、

...入力した文字列で始まるすべての一致が表示されます。

一致をどのように「表示」したいか、または文字列をどこに入力したいかわかりません。しかし、一般的な考え方は、入力パラメータ(例:"MatchName" As String)を受け取り、上記のようなループを実行して、見たいプロパティの文字列ですべての一致を見つけてから、配列などを返す関数を作成することです。情報を「提示」するために使用できます。

動的にしたい場合は、「入力したとおりに」リストが更新されるように、KeyPressイベントから更新手順を実行できます。単語を入力したときにコレクション全体を実行しないようにするために、おそらく配列を保存し、追加の文字を入力するたびに、その配列を繰り返し処理して、一致しないものを削除する (結果を絞り込む) ことができます。それが起こる前に、おそらく文字が削除されたかどうかを確認するために何らかのチェックが必要になるでしょう (たとえば、テキストボックス内の文字列の長さをチェックする)。これにより、プログラムにAddressEntriesコレクションのチェックを再実行するように指示されます (結果を広げます)。 )。

とにかく、それはあなたがそれを行うことができる1つの方法についての一種の一般的な考えです.

于 2015-07-22T04:02:49.267 に答える