Сортировка задач Outlook по пользовательскому полю в VBA - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь отсортировать свои задачи по определенному пользователем полю, которое я называю "Seq".Когда я делаю это с VBA, кажется, ничего не делает.Однако это прекрасно работает при сортировке по умолчанию полей, таких как DueDate.у кого-нибудь есть решение?Я включаю мой код и результаты.Я использую Outlook 2010. Заранее спасибо!

Вот код:

Sub TestSort()
    Dim ToDoFolder As Folder
    Dim Task As TaskItem
    Dim Sel As Outlook.Items
    Dim InitStartTime As Date
    Dim RemindTime As Date
    Dim FilterString As String

'FORCE CHANGE CURRENT FOLDER TO BE "TO DO LIST" AND VIEW TO BE "Debug (Filter:TEST)"
    Set ToDoFolder = Session.GetDefaultFolder(olFolderToDo)
    Set Application.ActiveExplorer.CurrentFolder = ToDoFolder
    ToDoFolder.Views.Item("Debug (Filter:TEST)").Apply

'AUTOMATICALLY SELECT TASK ITEMS TO BE WORKED WITH

    FilterString = "@SQL=" & ToDoFolder.Views.Item("Debug (Filter:TEST)").Filter
    Set Sel = ToDoFolder.Items.Restrict(FilterString)

'SHOW ORIGINAL SORTING
    Debug.Print Chr(13); "Sort by Original"
    Call CheckSort(Task, Sel)

'SORT TASKS IN MY SELECTION (AND CHECK SORT)

    Sel.Sort "[Seq]", False
    Debug.Print Chr(13); "Sort by Seq Ascending"
    Call CheckSort(Task, Sel)

    Sel.Sort "[Seq]", True
    Debug.Print Chr(13); "Sort by Seq Descending"
    Call CheckSort(Task, Sel)

    Sel.Sort "[DueDate]", False
    Debug.Print Chr(13); "Sort by DueDate Ascending"
    Call CheckSort(Task, Sel)

    Sel.Sort "[DueDate]", True
    Debug.Print Chr(13); "Sort by DueDate Descending"
    Call CheckSort(Task, Sel)

End Sub

Sub CheckSort(Task As Outlook.TaskItem, Sel As Outlook.Items)

'CHECK THAT IT WAS SORTED CORRECTLY

    Debug.Print Chr(13);
    For Each Task In Sel
        Seq = Task.UserProperties.Find("Seq").Value
        Debug.Print Seq & " " & Task.Subject & " " & Task.DueDate
    Next Task
End Sub

Вот результаты:

Sort by Original

2 Test 1 6/6/2018
4 Test 2 6/8/2018
1 Test 3 6/10/2018
3 Test 4 6/9/2018

Sort by Seq Ascending

2 Test 1 6/6/2018
4 Test 2 6/8/2018
1 Test 3 6/10/2018
3 Test 4 6/9/2018

Sort by Seq Descending

2 Test 1 6/6/2018
4 Test 2 6/8/2018
1 Test 3 6/10/2018
3 Test 4 6/9/2018

Sort by DueDate Ascending

2 Test 1 6/6/2018
4 Test 2 6/8/2018
3 Test 4 6/9/2018
1 Test 3 6/10/2018

Sort by DueDate Descending

1 Test 3 6/10/2018
3 Test 4 6/9/2018
4 Test 2 6/8/2018
2 Test 1 6/6/2018

1 Ответ

0 голосов
/ 11 июня 2018

Спасибо за комментарий, нитон.

Я решил проблему.Я публикую это здесь на тот случай, если у кого-то возникнет такая же проблема.

Не знаю почему, но сортировка просто не будет работать с пользовательским полем при использовании объекта Items.Тем не менее ... я получил его нормально работать при использовании объекта таблицы!:) Проверьте новый код ниже.

Sub TestSort()
    Dim ToDoFolder As Folder
    Dim Task As TaskItem
    Dim Sel As Outlook.Table
    Dim InitStartTime As Date
    Dim RemindTime As Date
    Dim FilterString As String
    Dim oCol As Outlook.Column

'FORCE CHANGE CURRENT FOLDER TO BE "TO DO LIST" AND VIEW TO BE "Debug (Filter:TEST)"
    Set ToDoFolder = Session.GetDefaultFolder(olFolderToDo)
    Set Application.ActiveExplorer.CurrentFolder = ToDoFolder
    ToDoFolder.Views.Item("Debug (Filter:TEST)").Apply

'AUTOMATICALLY SELECT TASK ITEMS TO BE WORKED WITH

    FilterString = "@SQL=" & ToDoFolder.Views.Item("Debug (Filter:TEST)").Filter
    Set Sel = ToDoFolder.GetTable(FilterString)

'CHECK DEFAULT COLUMNS
    For i = 1 To Sel.Columns.Count
        Set oColumn = Sel.Columns.Item(i)
        Debug.Print oColumn.Name
    Next i

'ADD COLUMN FOR USER-DEFINED FIELD "SEQ"
    Sel.Columns.Add ("Seq")

'SHOW ORIGINAL SORTING
    Debug.Print Chr(13); "Sort by Original"

    Call CheckSortTable(Sel)

'SORT TASKS IN MY SELECTION (AND CHECK SORT)

    Sel.Sort "[Seq]", False
    Debug.Print Chr(13); "Sort by Seq Ascending"
    Call CheckSortTable(Sel)

    Sel.Sort "[Seq]", True
    Debug.Print Chr(13); "Sort by Seq Descending"
    Call CheckSortTable(Sel)

    Sel.Sort "[DueDate]", False
    Debug.Print Chr(13); "Sort by DueDate Ascending"
    Call CheckSortTable(Sel)

    Sel.Sort "[DueDate]", True
    Debug.Print Chr(13); "Sort by DueDate Descending"
    Call CheckSortTable(Sel)

End Sub

Sub CheckSortTable(oTable As Outlook.Table)

    Dim Task As Outlook.Row

'CHECK THAT IT WAS SORTED CORRECTLY

    Debug.Print Chr(13);
    Do Until (oTable.EndOfTable)
        Set Task = oTable.GetNextRow()
        Seq = Task("Seq")
        Debug.Print (Seq & " " & Task("Subject") & " " & Task("DueDate"))
    Loop
End Sub

... и новый вывод ...

EntryID
Subject
CreationTime
LastModificationTime
MessageClass
DueDate
PercentComplete
IsRecurring

Sort by Original

2 Test_1 6/8/2018
4 Test_2 6/10/2018
1 Test_3 6/8/2018
3 Test_4 6/10/2018

Sort by Seq Ascending

1 Test_3 6/8/2018
2 Test_1 6/8/2018
3 Test_4 6/10/2018
4 Test_2 6/10/2018

Sort by Seq Descending

4 Test_2 6/10/2018
3 Test_4 6/10/2018
2 Test_1 6/8/2018
1 Test_3 6/8/2018

Sort by DueDate Ascending

2 Test_1 6/8/2018
1 Test_3 6/8/2018
4 Test_2 6/10/2018
3 Test_4 6/10/2018

Sort by DueDate Descending

4 Test_2 6/10/2018
3 Test_4 6/10/2018
2 Test_1 6/8/2018
1 Test_3 6/8/2018
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...