1

Тема: Какой процесс не дает переименовать папку?

Идея макроса такая. Повесить на гор.клавишу "Esc" выполнение макроса по закрытию документа, но не самой оболочки Word.

Но не могу никак понять, что держит ворд при переименовании папки (при необходимости) после выполнения моей процедуры, когда выполняется вторая часть моего кода «Run», если пользователь создает новый пустой лист док., вносит в него изменения, затем выбирает папку для пересохранения?
Если пользователь хочет в последствии переименовать по какой то причине эту папку, то выходит сообщение виндовс о том, что нет возможности ее переименовать. Соответственно, если у кого то стоит программа анлокер, то она предлагает разблокировать WINWORD.EXE.
Я так же пробовала "Options.DefaultFilePath(wdDocumentsPath)" - винда все равно жалуется. ChDir та же песня.
Какой процесс остается держать папку???

Dim objWordApl As New Word.Application
Dim objWordDoc As Word.Document
Dim strDocName As String
Dim intMsgBx As Integer 'вариант значения при отклике юзера на сообщение MsgBox

If wdKeyEsc Then
  strDocName = ActiveDocument.Name
  Set objWordDoc = Documents.Item(strDocName)
'Проверка, если юзер сделал изменения
  If objWordDoc.Saved = True Then 'юзер ничего не изменял
    intMsgBx = MsgBox("Закрыть документ", vbQuestion + vbYesNoCancel, "Info")
'Вычисляем, что конкретно нажал юзер?
    If intMsgBx = 2 Then 'если юзер нажал "Отмена"
      Exit Sub
    ElseIf intMsgBx = 6 Then 'если юзер нажал "Да"
      objWordDoc.Close
    ElseIf intMsgBx = 7 Then 'если юзер нажал "Нет"
      Exit Sub
    End If
  Else 'юзер внес изменения - ???здесь начинается проблема, если нужно потом переименовать папку
    Set objWordApl = Word.Application
    objWordApl.Run "DocClose"
  End If
End If
strDocName = ""
Set objWordDoc = Nothing
Set objWordApl = Nothing
Ищу соратников по программированию

2

Re: Какой процесс не дает переименовать папку?

Nataliya пишет:

...ChDir та же песня...

Папку блокируют встроенные диалоги Word, работающие с файлами, SaveAs например. Если их не вызывать, то проблем нет. Но без диалога никак, да и вызвать диалог мог пользователь, а не макрос. Поэтому, лучше добавить обход этого глюка. Надо, перед переименованием, выполнить ChDir на другую папку. Тогда, диалоги "отпустят" папку и ее можно будет переименовать. Пример:

Sub A()
Dim D As Document, S As String
    Set D = ActiveDocument
    S = ActiveDocument.Path
    D.Close
    ChDir "C:\"
    Name S As S & "12345"
End Sub
Макросы под заказ и готовый пакет - mtdmacro.ru

3

Re: Какой процесс не дает переименовать папку?

Nataliya, а мне как то непонятна логика некоторых участков кода. Ниже эти участки вашего кода с моими комментариями.

Dim objWordApl As New Word.Application
' Сказали запущенному экземпляру Ворд "Зарезервируй память
'для еще одного экземпляра Ворда"
    
Set objWordApl = Word.Application
'Сказали запущенному экземпляру "Ворд Запустили второй
' экземпляр Ворд"
'при этом ничего с ним не сделали, (старый документ не открыли
'новый не создали)  
'
    objWordApl.Run "DocClose"
'запустили встроенную команду Ворд, которой сказали "сохрани
' неизвестно что в определенную пользователем папку и закрой это
' неизвестно что, а Ворд не закрывай"
'
Set objWordApl = Nothing
'Сказали первому экземпляру Ворд "Забудь про второй экземпляр
' и освободи свою память от него"

Вообще, если экземпляр какого то приложения запущен, перед освобождением памяти неплохо выполнить команду Quit

4

Re: Какой процесс не дает переименовать папку?

Вождь пишет:
Nataliya пишет:

...ChDir та же песня...

Папку блокируют встроенные диалоги Word, работающие с файлами, SaveAs например. Если их не вызывать, то проблем нет. Но без диалога никак, да и вызвать диалог мог пользователь, а не макрос. Поэтому, лучше добавить обход этого глюка. Надо, перед переименованием, выполнить ChDir на другую папку. Тогда, диалоги "отпустят" папку и ее можно будет переименовать. Пример:

Sub A()
Dim D As Document, S As String
    Set D = ActiveDocument
    S = ActiveDocument.Path
    D.Close
    ChDir "C:\"
    Name S As S & "12345"
End Sub

Спасибо за помощь, ChDir все же помогло, хотя я что то не пойму я пробовала им воспользоваться, но толи ночное время суток сыграло злую шутку то ли еще что...
Прописала строку:

ChDir Environ("HOMEDRIVE") & Environ("HOMEPATH") & "\Рабочий стол\"

теперь все ок. Спасибо  roll

Boris_R пишет:

Nataliya, а мне как то непонятна логика некоторых участков кода. Ниже эти участки вашего кода с моими комментариями.

Данная процедура не отвечает за открытие или создание новых док. Она у меня висит на гор.клавише "Esc", чтобы была возможность закрывать открытый активный док. Зделано это потому что во-первых, в майкрософте после 2003 версии зачем то убрали крестик на закрытие для каждого экземпляра док. "Жмакая" каждый раз на общий крестик в итоге на последнем документе закрывается вся оболочка Word и подключенный макрос отключается, пользователи про это забывают запуская ворд по новой и жалуются, что мол макросы вдруг перестали работать; во-вторых, вот лично мне не нравится использовать сочетание клавиш «Ctrl+W».

Ищу соратников по программированию