Доступ к активному документу в VBA при открытии документа в интрасети - PullRequest
1 голос
/ 30 августа 2010

У нас есть старые шаблоны Word, которые изначально были написаны для Word 97. Для каждой новой версии мы обновляли шаблоны. Теперь перейдем от Word 2003 к Word 2010, и, конечно, есть проблемы.

Шаблон содержит следующий код:

Private Sub Document_Open()
    On Error Resume Next
    If ActiveDocument.Type = wdTypeDocument Then
        ' Update the document from database'
    End If
End Sub

Проблема в том, что ActiveDocument выдает ошибку

Эта команда недоступна, поскольку ни один документ не открыт

Документы открыты скриптом во внутренней сети:

<a href="javascript:opendokument('P:\\01\\2-010-01.doc')">012-010-01</a>
<SCRIPT language=javascript> 
function opendokument(dokument){
var objAppl;;

try{
    objAppl = GetObject("","Word.Application");
    objAppl.Documents.open(dokument);
}
catch(exception){
    objAppl = new ActiveXObject("Word.Application");
    objAppl.Visible = true;
    objAppl.Documents.open(dokument);
}   
objAppl = null; 
}
</script>

Если я запускаю скрипт с локального компьютера или открываю документ через Windows, я не получаю сообщение об ошибке

Ответы [ 3 ]

1 голос
/ 07 октября 2011

У меня та же проблема, мое хитрое решение сейчас это

Private Sub Document_Open()
    Application.OnTime (Now + TimeValue("00:00:02")), "ProcessActiveDocument"
End Sub

Sub ProcessActiveDocument
    'ActiveDocument works here
End Sub
1 голос
/ 30 августа 2010

Я не работал с моделью событий Word в Word 2010, но есть несколько вещей, на которые я бы посмотрел.

Сначала посмотрите, есть ли дополнительные события, которые вы можете подключить. В Word 2000 я вижу только New, Open и Close. Возможно, в Word 2010 есть другие события, такие как Loaded? Если это так, вы можете попытаться поместить код в одно из тех событий, где документ уже обязательно будет загружен.

В противном случае вы могли бы написать некоторый код, который «ждет», пока ActiveDocument не будет установлен для экземпляра объекта. Вы можете попробовать что-то вроде этого:

Private Sub Document_Open()

  Do While ActiveDocument Is Nothing
    DoEvents
  Loop

  If ActiveDocument.Type = wdTypeDocument Then
    Debug.Print "Now the document is open"
  End If

End Sub

DoEvents в цикле должно позволять загружать документ, а условие While в конечном итоге поймет, что ActiveDocument не Nothing, и позволит программе продолжаться. Конечно, это предполагает, что документ фактически станет открытым, но это стоит попробовать. Чтобы понять, как может работать этот код, посмотрите на следующий код:

Private Sub Document_Open()

Dim dtmLater As Date
Dim doc As Document

dtmLater = DateAdd("s", 5, Now())

  Do While doc Is Nothing
    DoEvents
    If Now() >= dtmLater Then
      Set doc = ActiveDocument
    End If
  Loop

  If ActiveDocument.Type = wdTypeDocument Then
    Debug.Print "Now the document is open"
  End If

End Sub

Приведенный выше код произвольно приостанавливается на 5 секунд, чтобы вы могли видеть, как код зацикливается, пока не будет установлен объект doc. Как только объект создан, код может двигаться вперед.

0 голосов
/ 03 сентября 2010

Я добавил сервер интрасети в зону локальной интрасети в Internet Explorer. А затем я установил для параметра «Инициализация и сценарии элементы управления ActiveX, не помеченные как безопасные для сценариев» значение «Включено».

...