Ошибка выполнения 1100 при попытке SelectAll в ProjApp_ProjectBeforeTaskChange (внутри модуля класса)

Цель. Я пытаюсь сохранить все значения UniqueID и Text5 задачи до того, как произойдет событие Change.

Поэтому у меня есть модуль класса clsTskUpdate, где я пытаюсь сохранить все эти значения внутри события Dictionary в ProjApp_ProjectBeforeTaskChange.

Однако, поскольку у меня есть мастер-проект и несколько подпроектов, мне нужно SelectAll задач и прокрутить ActiveSelection.Tasks, чтобы получить их UniqueID внутри мастер-проекта (спасибо за помощь @Rachel Хеттингер).

Проблема начинается с того, что всякий раз, когда я изменяю значение ActualFinish из поля со списком (как показано на снимке экрана ниже):

введите здесь описание изображения

Я получаю ошибку времени выполнения «1100»:

Метод недоступен в данной ситуации

В следующей строке (внутри Sub ProjApp_ProjectBeforeTaskChange)

SelectAll

Кто-нибудь здесь знает, как с этим справиться? Как я могу использовать SelectAll до того, как задача обновит свои значения, чтобы сохранить все текущие значения в моем Dictionary?

Код класса clsTskUpdate

Option Explicit

Public WithEvents ProjApp   As Application

Private Sub ProjApp_ProjectBeforeTaskChange(ByVal Tsk As Task, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean)

RowIDChanged = Tsk.UniqueID
MsgBox Application.StatusBar
SaveStatusforAllTasks ' call SaveStatusforAllTasks Sub, which saves current status of Text5 ("Status") of all tasks

End Sub

'===================================================================
Sub SaveStatusforAllTasks()

Dim AllTasks As Tasks
Dim Tsk As Task

' ****** Get Error 1100 at the line below *****
SelectAll
Set AllTasks = ActiveSelection.Tasks

' add existing values of UniqueID and Text5 to Dictionary object
Set Dict = CreateObject("Scripting.Dictionary")

For Each Tsk In AllTasks
    If Not Tsk Is Nothing Then
        If Not Dict.exists(Tsk.UniqueID) Then
            Dict.Add Tsk.UniqueID, Tsk.Text5
        End If
    End If
Next Tsk

End Sub

Код этого проекта

Private Sub Project_Change(ByVal pj As Project)

StatusRYGFieldUpdate

End Sub

Код обычного модуля

Option Explicit

Public StatusRYGView                As New clsTskUpdate
Public RowIDChanged                 As Long
Public Const myDateFormat           As String = "dd/mm/yy"
Public Dict As Object ' use a Dictionary to save previous values of all UniqueID and Text5 values ("Status")


Sub StatusRYGFieldUpdate()

Set StatusRYGView.ProjApp = Application
PaneClose ' should close the Split window (to make sure run-time error 1100 won't happen

Application.Calculation = pjManual
Application.ScreenUpdating = False

If UpdateViewFlag Then
    FormatModifiedTasks ' call FormatModifiedTasks Sub, which updates all tasks that Text5 ("Status") were modified
End If

Application.Calculation = pjAutomatic
Application.ScreenUpdating = True

End Sub

person Shai Rado    schedule 21.06.2017    source источник
comment
Что вы делаете с сохраненными значениями Text5?   -  person Rachel Hettinger    schedule 21.06.2017


Ответы (1)


Если вы хотите просто сохранить значение Text5 перед изменением задачи (для любого поля), попробуйте следующее:

Private Sub ProjApp_ProjectBeforeTaskChange(ByVal tsk As Task, ByVal Field As PjField, _
    ByVal NewVal As Variant, Cancel As Boolean)

    If Not dict.Exists(tsk.UniqueID) Then
        dict.Add tsk.UniqueID, tsk.Text5
    Else
        dict(tsk.UniqueID) = tsk.Text5
    End If

End Sub

tsk.UniqueID будет уникальным значением в главном проекте (например, 8388611, а не 3).

person Rachel Hettinger    schedule 21.06.2017
comment
Следуя нашему предыдущему сообщению (которое вы помогли решить), мне нужно зациклиться на выборе. и я не могу использовать SelectAll в режиме, которым я поделился на своем снимке экрана (в своем посте), у меня нет проблем с сохранением значения в словаре - person Shai Rado; 21.06.2017
comment
Сохраните все значения в другое время — не в событии «Изменить» — возможно, при открытии проекта. Кроме того, в Project нельзя отключить события, как в Excel, поэтому будьте осторожны, чтобы не запускать дополнительные события в коде события Change. - person Rachel Hettinger; 21.06.2017