RTD.RefreshData аварийно завершает работу при вызове из модальной формы

Я создал очень простую модальную форму с двумя кнопками: одна просто закрывает форму, а другая вызывает Application.RTD.RefreshData. В Excel 2003 все это работает просто отлично, но в Excel 2010 Application.RTD.RefreshData вылетает с

Ошибка выполнения «1004»: ошибка, определяемая приложением или объектом.

Если я создам форму как немодальную, все будет нормально работать как в Excel 2003, так и в Excel 2010.

Что бы это ни стоило, это весь код формы:

Private Sub RefreshDataButton_Click()
  Application.RTD.RefreshData
End Sub

Private Sub CloseButton_Click()
  Call Unload(Me)
End Sub

И я вызываю форму, используя этот код на своем листе:

Private Sub CommandButton1_Click()
  Dim form As UserForm1
  Set form = New UserForm1
  form.Show vbModal
End Sub

Я искал Google и SO для получения любой информации по этому вопросу, но безрезультатно. Это известная проблема с Excel 2010, или мне действительно не разрешено вызывать Application.RTD.RefreshData из модальной формы?

РЕДАКТИРОВАТЬ: я должен добавить, что, насколько я могу судить, в моем сеансе Excel нет нет RTD-серверов.

EDIT2: Дальнейшее исследование: ошибка не возникает в Excel 2003 или 2007; это действительно происходит в 2010 и 2013 годах.


person atkins    schedule 11.02.2014    source источник


Ответы (1)


На обычном сервере RTD вы используете обратный вызов excel для вызова UpdateNotify(), а затем Excel решит, когда вызывать RefreshData() на основе настроек дроссельной заслонки и того, насколько он «занят» в данный момент. Определение «занят» обычно включает в себя такие вещи, как пересчет формул, сохранение листа и открытие модального диалогового окна.

Excel защищает себя от внешних компонентов, когда считает себя занятым, вызывая исключение. Это имеет смысл, так как они не хотят, чтобы их приложение становилось нестабильным или зависало из-за жадной надстройки или макроса. По сути, все вызовы, которые вы помещаете в свой код, которые обращаются к любой части объектной модели Excel (включая ваш вызов RefreshData()), могут вызвать исключение, если Excel решит, что он «занят». Я подозреваю, что в более поздних версиях Excel они ужесточили определение «занят», поэтому вы видите это несоответствие с модальным диалогом.

person Franchesca    schedule 05.03.2014