Консультация № 180872
21.11.2010, 13:29
45.37 руб.
0 41 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
функция Килл для меня уже стала нарицательным словом. В нижеследующем коде задумка такая
Пользователь находится в открытом документе Ворд, задача переименовать этот файл не закрывая его
Решаю путём сохранения файла под другим именем, вся загвоздка в удалении того "старого файла"
Код:

Код:

Function Концовка_для_всех_кнопок(ByVal Текст_имени_нового_сохраняемого_документа As String)

Dim Новый_не_сохранённый_ранее_Документ As Boolean
If Len(ActiveDocument.Path) = 0 Then Новый_не_сохранённый_ранее_Документ = True

'условие, если документ не был сохранён ранее, тогда ...
If Новый_не_сохранённый_ранее_Документ = True Then
Место_нахождения_активного_документа = ActiveDocument.AttachedTemplate.Path & Application.PathSeparator 'Application.PathSeparator - это наклонная
Else 'в противном случае
Место_нахождения_активного_документа = ActiveDocument.Path & Application.PathSeparator 'Application.PathSeparator - это наклонная
End If

Dim Имя_активного_документа_с_расширением As String 'объявление переменной типа строковая переменная - As String
Имя_активного_документа_с_расширением = ActiveDocument.Name 'имя активного документа

'условие, если полное имя активного документа, то есть место его сохранения и его имя с расширением
'равно
'полному имени файла под которым требуется сохранить файл
'тогда скрыть форму, выдать сообщение, выйти с процедуры
If ActiveDocument.FullName = Место_нахождения_активного_документа & Текст_имени_нового_сохраняемого_документа Then Unload Me: MsgBox$ "Файл с именем:" & Chr$(13) & Текст_имени_нового_сохраняемого_документа & Chr$(13) & "по адресу:" & Chr$(13) & Место_нахождения_активного_документа & Chr$(13) & "уже существует", vbOKOnly, "ДОКУМЕНТ НЕ МОЖЕТ БЫТЬ СОХРАНЁН": Exit Function

'условие, если файл ...doc в папке ... на диске ... существует, надо указывать с расширением, например .doc, дословно если длина имени пути - Dir файла больше нуля тогда файл ... существует, тогда ...
If Len(Dir(Место_нахождения_активного_документа & Текст_имени_нового_сохраняемого_документа)) > 0 Then Unload Me: MsgBox$ "Файл с именем:" & Chr$(13) & Текст_имени_нового_сохраняемого_документа & Chr$(13) & "по адресу:" & Chr$(13) & Место_нахождения_активного_документа & Chr$(13) & "уже существует", vbOKOnly, "ДОКУМЕНТ НЕ МОЖЕТ БЫТЬ СОХРАНЁН": Exit Function

ActiveDocument.SaveAs FileName:=Место_нахождения_активного_документа & Текст_имени_нового_сохраняемого_документа, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False

'условие, если документ был сохранён ранее, тогда удаляем старый документ
If Новый_не_сохранённый_ранее_Документ = False Then Kill (Место_нахождения_активного_документа & Имя_активного_документа_с_расширением) 'здесь получаю ошибку 70 Доступ запрещён, как её избежать???????

End Function


Обсуждение

Неизвестный
22.11.2010, 13:37
общий
Адресаты:
>Как задается параметр этой функции? Как запускается программа?

Ответ в Ворде есть кнопка по её нажатию выполняется макрос в котором одна строка Форма.Шоу
Форма находится в Нормал.дот в папке Формс
На форме 3 кнопки Сохранить
У каждой кнопки свои действия, а именно с закладок документа собрать новое имя - Текст_имени_нового_сохраняемого_документа
В конце кода каждой кнопки есть строка
Концовка_для_всех_кнопок Текст_имени_нового_сохраняемого_документа
И переходит на указанную функцию
Function Концовка_для_всех_кнопок(ByVal Текст_имени_нового_сохраняемого_документа As String)

Сделал я последний блок кода от сегодня, 06:43 таковым:
If Новый_не_сохранённый_ранее_Документ = False Then
Do While NewPath + "" + NewName <> OldPath + "" + OldName
Loop
Kill OldPath + "" + OldName
End If
Виснет компьютер
И самое главное как зависнет и даже форма не убирается, хотя вверху скрипта есть
Unload Me
давно
Профессор
230118
3054
22.11.2010, 13:43
общий
Конечно, виснет, потому что программа зацикливается - условие никогда не выполняется.
У меня такой цикл
Do While ActiveDocument.Name <> NewName
Loop
работает прекрасно.
Неизвестный
22.11.2010, 13:46
общий
Ну так это же я послушал PsySex и сменил на
Do While NewPath + "" + NewName <> OldPath + "" + OldName
Loop
а с утра было так как и у Вас
Do While ActiveDocument.Name <> NewName
Loop
и ошибка 70??????????? Как победить Килла?????????
давно
Профессионал
848
1596
22.11.2010, 13:57
общий

Форма находится в Нормал.дот в папке Формс

т.е. вы хотите выполнить макрос из normal.dot, и в конце выполнения макрос должен удалить normal.dot -так получается?
Ну так это же я послушал PsySex и сменил на
Do While NewPath + "" + NewName <> OldPath + "" + OldName
Loop

я такого не предлагал. Это вы сами так придумали.
Неизвестный
22.11.2010, 14:00
общий
Адресаты:
Извините меня пожалуйста, значит я не правильно тпонял Вас, пусть я сам придумал
В данный момент как победить Килла???????????
давно
Профессионал
848
1596
22.11.2010, 14:11
общий
Ответ в Ворде есть кнопка по её нажатию выполняется макрос в котором одна строка Форма.Шоу
Форма находится в Нормал.дот в папке Формс
На форме 3 кнопки Сохранить
У каждой кнопки свои действия, а именно с закладок документа собрать новое имя - Текст_имени_нового_сохраняемого_документа
В конце кода каждой кнопки есть строка
Концовка_для_всех_кнопок Текст_имени_нового_сохраняемого_документа
И переходит на указанную функцию
Function Концовка_для_всех_кнопок(ByVal Текст_имени_нового_сохраняемого_документа As String)

поскольку все это дело находится в normal.dot, то при вызове Концовка_для_всех_кнопок переменные OldPath и OldName будут указывать на normal.dot, вы кстати можете поставить точку прерывания и посмотреть в момент выполнения что там в этих переменных, и макрос сохраняя этот документ с новым именем потом пытается удалить normal.dot, что не может быть, т.к. он занят Word'ом.
Неизвестный
22.11.2010, 14:16
общий
Адресаты:
Вы бы лучше сказали, что на что надо исправить, а то вдруг я опять не правильно Вас пойму...
давно
Профессионал
848
1596
22.11.2010, 14:19
общий
а ваша форма обязательно должна работать из normal.dot ?? почему она не может работать просто из документа например мойфайл.doc ???
давно
Профессионал
848
1596
22.11.2010, 14:23
общий
можете сделать так.
Код:
Do While ActiveDocument.Name <> NewName
Loop
if LCase(OldName)<>"normal.dot" then
Kill OldPath + "" + OldName
endif
End If

т.е. если код работает из шаблона, то удалять шаблон не будет, если из другого, то удалять старую версию будет.
Неизвестный
22.11.2010, 14:38
общий
Адресаты:

Код:

'условие, если документ был сохранён ранее, тогда удаляем старый документ
If Новый_не_сохранённый_ранее_Документ = False Then
Do While ActiveDocument.Name <> NewName
Loop
If LCase(OldName) <> "normal.dot" Then Kill OldPath + "" + OldName 'ошибка 70 на этой строке в этот момент OldName = 111111111
End If
Неизвестный
22.11.2010, 14:42
общий
Адресаты:
А это помоему надо постараться нужно чтобы
OldName было = "normal.dot"
То есть имя старого документа было "normal.dot"
Неизвестный
22.11.2010, 14:51
общий
Адресаты:
Вы вчерашнее собщение от 19:15 читали, напомню:
Есть шаблон с именем 00 с него через создать открыл его получил например Документ1
Нажал там кнопку сохранить, вылазит форма с тремя кнопками сохранить, скрипт этих кнопок с закладок формирует имя файла и сохраняет документ
Затем например ситуация изменилась надо сохранить этот файл под другим именем нажал кнопку сохранить, появляется форма сохранить с тремя кнопками сохранить, жму на одну из низ теперь документ сохранился под другим именем, а тот то старый надо удалить, вот тут вот и происходит то, что через раз удаляет
Я понимаю, что можно документ закыть переименовать, открыть но зачем
Так эффектно на моих глазах по нажатию кнопки он переименовывается
Вот вкратце если надо распишу ещё
Неизвестный
22.11.2010, 14:53
общий
Килл это уже нарицательное для меня в третий раз задаю вопрос на форуме на эту тему!
давно
Профессионал
848
1596
22.11.2010, 14:53
общий
А это помоему надо постараться нужно чтобы
OldName было = "normal.dot"
То есть имя старого документа было "normal.dot"

ну такое заключение я делаю с ваших слов
Форма находится в Нормал.дот в папке Формс

====
при ошибке посмотрите какие значения у переменных
NewPath
NewName
OldPath
OldName
???
Неизвестный
22.11.2010, 14:59
общий
Адресаты:

'условие, если документ был сохранён ранее, тогда удаляем старый документ
If Новый_не_сохранённый_ранее_Документ = False Then
Do While ActiveDocument.Name <> NewName
Loop
If LCase(OldName) <> "normal.dot" Then Kill OldPath + "" + OldName 'ошибка 70 на этой строке в этот момент
'NewPath S:\Рабочая папка
'NewName 1122
'OldPath S:\Рабочая папка
'OldName 11
'ActiveDocument.Name 1122

End If
давно
Профессионал
848
1596
22.11.2010, 15:10
общий
вы можете показать свой документ? Если вы не очень хотите чтоб он был доступен всем для просмотра, архивируйте RAR'ом с паролем, загрузите куда-нибудь, дайте ссылку, а пароль напишите мне в личку.
Сейчас код должен работать, что еще может мешать...я пока не могу больше ничего сказать.
Неизвестный
22.11.2010, 16:04
общий
Адресаты:
Вот Вы спрашиваете документ, да ради бога
А что в нём есть кнопка с кодом

Private Sub Сохранить_документ_под_именем_Click()

Application.Run "Normal.NewMacros.Показать_форму_Ф_сохранить_документ_его_имя"

End Sub

и три поля!!!

Соль то в Нормал.доте
Где есть макрос:

Sub Показать_форму_Ф_сохранить_документ_его_имя()

Ф_сохранить_документ_его_имя.Show

End Sub

и сама форма.

Форму Высылаю вместе с документом 00.дот
Прикрепленные файлы:
c78f4fb6e775e6ac8d571ad7a977f9e6.rar
Неизвестный
22.11.2010, 16:05
общий
Адресаты:
Забыл сказать в форме нажимайте только верхнюю кнопку из трёх кнопок Сохранить!
давно
Профессор
230118
3054
22.11.2010, 16:48
общий
это ответ
Здравствуйте, Ципихович Эндрю!

Файлы с расширением .dot - это шаблоны. Если Вы хотите создать файл на основании шаблона, путь, в котором он находится, должен быть прописан в меню Инструменты - Опции - Положение файла(File Locations). После этого, создавая новый файл, кликните на "файл на этом компьютере), и выберите шаблон. Получившийся файл будет копией шаблона. Его можно сохранить под любым именем.
Форму загружу на сайт, только она должна быть не в нормал.дот, а в самом документе.
Неизвестный
22.11.2010, 18:20
общий
Адресаты:
Меня больше интерусует не теория а практика
Выслал же шаблон, форму
Как добится желаемого результата создав из прилагаемого шаблона 00
документ1, сохранив документ под именем, например "11", а затем переименовав его в документ с именем, например "1122", чтобы не получить ошибку 70 при удалениии документа с именем "11"???????
давно
Профессор
230118
3054
22.11.2010, 20:32
общий
Мне кажется, работу надо переделать с самого начала. Во-первых, normal.dot надо менять лишь в крайних случаях, эти изменения должны относиться к работе с любыми документами. А тут путаница какая-то, часть в нормал, часть в 00.dot, притом, что сам normal.dot Вы не прислали.
давно
Профессор
230118
3054
22.11.2010, 21:07
общий
Проблема в имени документа.
давно
Профессор
230118
3054
23.11.2010, 00:20
общий
Попробуйте такой документ. Ошибка возникла, только когда в формировании имени принимал участие текст из поля Плюс. Теперь добавлен в форму текстбокс и номер берется оттуда. https://rfpro.ru/upload/3710
Неизвестный
23.11.2010, 04:15
общий
Адресаты:
Ну качнул я документ 3710, в нём есть кнопка Сохранить_документ_под_именем
Вот её код
Private Sub Сохранить_документ_под_именем_Click()

End Sub
Нажимая на неё что выполнится? Ничего
>А тут путаница какая-то, часть в нормал, часть в 00.dot
Да у меня так сначала так и было, всё в 00.dot, советчиков много, советуют, я пробую для достижения цели
Мне нужен шаблон, то есть 00.dot с этой формой работоспособной формой Сохранить_документ_под_именем
можете его сделать???

давно
Профессионал
848
1596
23.11.2010, 08:23
общий
простите я не особо знаком работой с шаблонами и не понял зачем он тут применяется, почему все это дело не могло работать в простом *.doc , я лично считаю что засада именно из-за того что используется шаблон. К сожалению как работает ваш проект я не смог увидеть, у меня была только 1 кнопка в документе и та не работала...
давно
Профессор
230118
3054
23.11.2010, 09:56
общий
А формы в нем нет? То есть форма с документом не сохраняется? Тогда я ее отдельно пошлю.
давно
Профессор
230118
3054
23.11.2010, 15:23
общий
https://rfpro.ru/upload/3718 Здесь дот, форма внутри.
Неизвестный
23.11.2010, 16:27
общий
Адресаты:
Поясните, пожалуйста, что это:
t = DateTime.Second(DateTime.Now)
нужно ли оно? и зачем?
давно
Профессор
230118
3054
23.11.2010, 17:40
общий
Нет, можете стереть. Это так, в процессе проб возникло.
Неизвестный
24.11.2010, 18:38
общий
Адресаты:
Вот ссылка
https://rfpro.ru/upload/3730
Там файл Копия 3718.дот
Оттуда убрал всё лишнее
Не долго радовался после нескольки раз проб всё же добился ошибки 70 на Килле
Видимо ещё какие то условия нужны?????
Форма ответа