Консультация № 177172
09.03.2010, 17:34
35.77 руб.
0 25 1
Здравствуйте уважаемые эксперты, подскажите, пожалуйста, в следующем, можно ли и как при помощи ВБА активный файл переименовать, если делать нужно через сохранить как ...
Тогда как удалить старый файл??
Ваше решение верно и для Ворд 2003 и для Ворд 2007???
Спасибо Эндрю

Обсуждение

давно
Модератор
137394
1850
09.03.2010, 20:45
общий
Код:
    OldName = ActiveDocument.Name
OldPath = ActiveDocument.Path

NewName = "Имя другое.doc"
NewPath = "H:\Не мои документы еще одни"

ActiveDocument.SaveAs FileName:=NewPath + "" + NewName, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False

Kill OldPath + "" + OldName
В 2003 работает, в 2007 нет. NewPath можно приравнять к OldPath, то есть написать в коде
NewPath = OldPath
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
10.03.2010, 17:40
общий
Megaloman:
Спасибо за сообщение, ещё Вашу мысль не проверил, а почему Вы её не поместили сообщение как ответ??
давно
Модератор
137394
1850
10.03.2010, 20:25
общий
Ципихович Эндрю:
Если эта реплика Вас устраивает как ответ, я помещу её в ответ, но попозже. Но в Word2007 этот код не работает (почему-то исходный файл не освобождается и как следствие -проблемы с доступом). Я понял Вашу задачу так, что решение должно работать и в word 2003 и 2007. Это платный вопрос. Если кто-то предложит решение, работающее и в 2003 и в 2007 - некрасиво будет с моей стороны отбирать часть его заработка.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
11.03.2010, 12:45
общий
Megaloman:
Я попробовал Ваш код, вроде всё работает
Но в моей личной задаче не работает, у меня вроде всё тоже
Хотел у Вас спросить, насколько мне известно, моя проблема состоит в следующем:
Я хочу удалить файл, но доступ к нему закрыт. Потому что в данный момент выполняется макрос, который находится в этом документе. Пока макрос не закончится, файл нельзя удалять.
Решена ли она в Вашем решении??
Чтобы наяву понять мою проблему Вы можете скачать файл шаблон по ссылке https://rfpro.ru/upload/1806, открыв шаблон там точно указана проблема, и она у Вас тоже должна появиться, поправьте если сможете код в этом шаблоне с ремарками. Почему я спрашивал о Ворде 2003 и Ворде 2007, потому, что мне поясняли, что это решение, которое у меня имеется в Ворде 2007 работает, а в 2003 не работает. Точнее сказать меня Ворд 2007 не интересует, но если быть дальновидным, то тогда уж лучше иметь решение для Ворда 2003 и Ворда 2007.
давно
Профессор
230118
3054
14.03.2010, 02:12
общий
это ответ
Здравствуйте, Ципихович Эндрю.

Приведенное решение работает и в Word 2007. Проблема в том, что старый файл просто не успевает закрыться до того, как начинает выполняться kill. Чтобы обойти эту проблему, можно проверить имя активного документа.
Do While ActiveDocument.Name <> NewName
Loop

Приложение:
OldName = ActiveDocument.Name
OldPath = ActiveDocument.Path

NewName = "Имя другое.doc"
NewPath = "H:\Не мои документы еще одни"

ActiveDocument.SaveAs FileName:=NewPath + "" + NewName, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName
5
Неизвестный
14.03.2010, 16:20
общий
Гаряка Асмик:
Спасибо за ответ мне кажется по всем телодвижением по Киллу можно начитнать с условия:
If OldPath <> "" Then, например:

OldName = ActiveDocument.Name
OldPath = ActiveDocument.Path

NewName = "Имя другое.doc"
NewPath = "H:\Не мои документы еще одни"

ActiveDocument.SaveAs FileName:=NewPath + "" + NewName, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False
If OldPath <> "" Then
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName
End if

Хотел спросить а в строке Kill OldPath + "" + OldName, почему ++, а не &&
давно
Профессор
230118
3054
14.03.2010, 16:27
общий
Ципихович Эндрю:
+ здесь операция конкатенации(сцепления) строк.
Неизвестный
14.03.2010, 17:12
общий
Гаряка Асмик:
Пожалуйста, давайте за основу возьмём этот мой код, так как после Вас я его переделываю по мелочи, которые как я понимаю на суть не должны повлиять
Хотя может и влияют, я до сих пор получаю ошибки
Поправьте уже в нём

Dim Имя_шаблона_с_которого_открыт_активный_документ As Variant
Set Имя_шаблона_с_которого_открыт_активный_документ = ActiveDocument.AttachedTemplate
Dim Место_нахождения_шаблона_с_которого_открыт_активный_документ As String 'объявление переменной типа строковая переменная - As String
Место_нахождения_шаблона_с_которого_открыт_активный_документ = Имя_шаблона_с_которого_открыт_активный_документ.Path & Application.PathSeparator 'Application.PathSeparator - это наклонная

OldName = ActiveDocument.Name
OldPath = ActiveDocument.Path

NewName = "Текст_имени_сохранённого_документа"
NewPath = Место_нахождения_шаблона_с_которого_открыт_активный_документ

If ActiveDocument.FullName = Место_нахождения_шаблона_с_которого_открыт_активный_документ & NewName Then MsgBox$ "Файл с именем " & NewName & " по адресу " & Место_нахождения_шаблона_с_которого_открыт_активный_документ & " уже существует", vbOKOnly, "ДОКУМЕНТ НЕ МОЖЕТ БЫТЬ СОХРАНЁН": Exit Sub
ActiveDocument.SaveAs FileName:=NewPath + "" + NewName, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False


Если этот блок в конце
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName 'ПОЛУЧАЮ Рун тайм еррор 53???????????????????????????????????????????????

Если этот блок в конце
If OldPath <> "" Then
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName 'ПОЛУЧАЮ Рун тайм еррор 70??????????????????????????????????????????????77
End If


И какой из блоков лучше???
давно
Профессор
230118
3054
14.03.2010, 17:20
общий
Ципихович Эндрю:
Этот макрос нельзя запускать два раза подряд, тогда старое и новое имена совпадают и нельзя удалить файл. Каждый раз редактируйте NewName
Неизвестный
14.03.2010, 17:40
общий
Гаряка Асмик:
А как же:
If ActiveDocument.FullName = Место_нахождения_шаблона_с_которого_открыт_активный_документ & NewName Then MsgBox$ "Файл с именем " & NewName & " по адресу " & Место_нахождения_шаблона_с_которого_открыт_активный_документ & " уже существует", vbOKOnly, "ДОКУМЕНТ НЕ МОЖЕТ БЫТЬ СОХРАНЁН": Exit Sub

Согласен но в моём варианте NewName = Текст_имени_сохранённого_документа то есть без кавычек, просто там выше есть то что его Текст_имени_сохранённого_документа меняет берёт из закладок

давно
Профессор
230118
3054
14.03.2010, 18:04
общий
Думаю, надо добавить условие
If OldNewName <> NewName Then
Неизвестный
14.03.2010, 18:55
общий
Гаряка Асмик:
Не понял откуда возьмётся OldNewName, возможно нужна точка OldNew.Name
Скопируйте мою реплику пожалуйста от 17 часов 12 минут и измените что нужно, выдайте пожалуйста конечный ответ, а то столько вариантов ...
давно
Профессор
230118
3054
14.03.2010, 19:07
общий
If OldName <> NewName Then , извините
Неизвестный
14.03.2010, 19:50
общий
Гаряка Асмик:
Я так понял последний блок должен быть:
If OldName <> NewName Then
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName
End If
Так????
давно
Профессор
230118
3054
14.03.2010, 20:00
общий
Ципихович Эндрю:
Да, можно так.
Неизвестный
14.03.2010, 20:18
общий
Гаряка Асмик:
Опять проблемы
В конце соорудил тестовую конструкцию, получил:

If OldPath <> "" Then 'строка 0 всё же считаю, что должно быть так когда документ уже был сохранён OldPath <> ""
Do While ActiveDocument.Name <> NewName 'строка 0
Loop
If ActiveDocument.Name = NewName Then тест = 0 Else тест = 1 'конструкция тест
Kill OldPath + "" + OldName 'на этой строке рун тайм эрор 70, в это время в строке выше тест = 0, как при ActiveDocument.Name = NewName код зашёл в эту строку ??????
End If
Неизвестный
15.03.2010, 18:54
общий
Гаряка Асмик:
Я Вам писал 14.03.2010, 20:18, посмотрели, что есть проблема???
давно
Профессор
230118
3054
15.03.2010, 19:10
общий
Ципихович Эндрю:
Когда if пишется на одной строчке, он на ней заканчивается. Kill не находится под условием.
Неизвестный
15.03.2010, 19:33
общий
Гаряка Асмик:

Kill находится под условием If OldPath <> "" , то есть в сообщении 14.03.2010, 20:18 первая строка
давно
Профессор
230118
3054
16.03.2010, 12:49
общий
Мне все же кажется, If OldPath <> "" не скажет о том, что документ уже сохранялся. Если это OldPath = ActiveDocument.Path, в нем будет путь к документу.
давно
Профессор
230118
3054
16.03.2010, 14:12
общий
Ципихович Эндрю:
Условием, что документ отличается от старого, будет If OldPath <> NewPath Or OldName <> NewName Then, то есть должен отличаться путь. Если путь совпадает, то должно отличаться название.
Неизвестный
16.03.2010, 18:24
общий
Гаряка Асмик:
Если концовка будет такая
If OldPath <> NewPath Or OldName <> NewName Then
Do While ActiveDocument.Name <> NewName
Loop
Kill OldPath + "" + OldName '
End If
Тогда при первом сохранении документа получаем рун тайм эррор 53
давно
Профессор
230118
3054
17.03.2010, 12:41
общий
Ципихович Эндрю:
Какой текст ошибки?
Неизвестный
18.03.2010, 16:32
общий
Гаряка Асмик:
53 File not found Файл не найден

Неизвестный
21.03.2010, 07:35
общий
Гаряка Асмик:
Текст ошибки 53 File not found Файл не найден
Форма ответа