программно открыть вид поиска - PullRequest
0 голосов
/ 02 мая 2018

Я ищу способ открыть представление поиска в outlook по заданным критериям программно. Я видел другие вопросы, такие как VBA Search в Outlook , но они касались получения результатов поиска программным способом.

Я, по сути, ищу ту же функциональность, что и опция ленты. Сообщение / редактирование / Связанные:

Когда я открываю сообщение, дважды щелкнув его, а затем щелкнув «Сообщения в этом разговоре» enter image description here

Вид списка меняется на

enter image description here

Я бы хотел сделать то же самое с помощью макроса VBA, но без открытия сообщения и с другими критериями поиска

1 Ответ

0 голосов
/ 03 мая 2018

Существует два возможных способа отображения результатов поиска в Outlook:

  1. Метод AdvancedSearch класса Application из объектной модели Outlook позволяет выполнять поиск в нескольких папках в Outlook. Основные преимущества использования метода AdvancedSearch в Outlook:

    • Поиск выполняется в другой теме. Вам не нужно запускать другой поток вручную, поскольку метод AdvancedSearch автоматически запускает его в фоновом режиме.
    • Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и т. Д. В любом месте, т. Е. За пределами определенной папки. Методы Restrict и Find / FindNext могут быть применены к определенной коллекции Items (см. Свойство Items класса Folder в Outlook).
    • Полная поддержка запросов DASL (пользовательские свойства также могут использоваться для поиска). Подробнее об этом можно прочитать в статье Filtering в MSDN. Для повышения эффективности поиска можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство IsInstantSearchEnabled класса Store).
    • Наконец, вы можете в любой момент остановить процесс поиска, используя метод Stop класса Search.

    По общему признанию, класс Search позволяет сохранять результаты поиска в папке поиска (фактически, он не содержит никаких элементов, только ссылки на элементы из папок области действия). Вам просто нужно вызвать метод Save для объекта Search в обработчике событий AdvanvedSearchComplete.

  2. Настройка текущего вида объектов Папка или Проводник в Outlook. Свойство CurrentView возвращает экземпляр класса View. См. HowTo: используйте свойство View.XML для фильтрации элементов Outlook для получения дополнительной информации.

 Dim sFilter As String
 Dim CurrentExplorer As Outlook.Explorer = Nothing
 Dim CurrentView As Outlook.View = Nothing
 Dim CurrentXML As XmlDocument = New XmlDocument
 Dim CurrentFilterNodes, CurrentViewNodes As XmlNodeList
 Dim CurrentFilterNode, CurrentParentNode As XmlNode

 If TextBox1.Text.Length > 0 Then
     If rbtSubject.Checked Then
        sFilter = "urn:schemas:httpmail:subject LIKE '%" + _
        TextBox1.Text.Trim + "%'"
    Else
        sFilter = "urn:schemas:httpmail:textdescription LIKE '%" + _
        TextBox1.Text.Trim + "%'"
    End If

    CurrentExplorer = TryCast(ExplorerObj, Outlook.Explorer)
    If (CurrentExplorer IsNot Nothing) Then
        CurrentView = CurrentExplorer.CurrentView
        If (CurrentView IsNot Nothing) Then
            Try
                CurrentXML.LoadXml(CurrentView.XML)
                CurrentFilterNodes = _
                    CurrentXML.GetElementsByTagName("filter")
                If CurrentFilterNodes.Count > 0 Then
                    For y As Integer = 0 _
                        To CurrentFilterNodes.Count - 1
                        CurrentFilterNode = CurrentFilterNodes(y)
                        If CurrentFilterNode.HasChildNodes Then
                            For i As Integer = _
                            CurrentFilterNode.ChildNodes.Count - 1 _
                                To 0 Step -1
                                CurrentFilterNode.RemoveChild( _
                                    CurrentFilterNode.ChildNodes(i))
                            Next
                        End If
                    Next
                    CurrentFilterNode = CurrentFilterNodes(0)
                    CurrentFilterNode.AppendChild( _
                        CurrentXML.CreateTextNode(sFilter))
                Else
                    CurrentViewNodes = CurrentXML. _
                        GetElementsByTagName("view")
                    If CurrentViewNodes IsNot Nothing Then
                        CurrentParentNode = CurrentViewNodes(0)
                        CurrentFilterNode = CurrentXML. _
                            CreateElement("filter")
                        CurrentParentNode.AppendChild( _
                            CurrentFilterNode)
                        CurrentFilterNode.AppendChild( _
                            CurrentXML.CreateTextNode(sFilter))
                    End If
                End If
                CurrentView.XML = CurrentXML.InnerXml
                CurrentView.Apply()
            Finally
                Marshal.ReleaseComObject(CurrentView)
            End Try
        End If
    End If
End If

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...