1

Тема: Изменил документ вчера или сегодня???? Не надо путаницы

какие строки скрипта надо  указать в Sub AutoClose() шаблона документа
чтобы если он не изменялся, тогда бы и не сохранялся, пока у меня в процедуре есть только эта строка:

'условие, если пользователь не делал вручную изменения закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

То есть другими словами из шаблона создал документ Документ1, например вчера
сегодня на секунду открыл его и закрыл, после этого вижу датой изменения свежайшее время
Как этого избежать, чтобы если я его не изменял сегодня, то оставалось верное время изменения локумента???? Спасибо

2

Re: Изменил документ вчера или сегодня???? Не надо путаницы

напишу строку лучше для читаемости:

'условие, если пользователь не делал вручную изменения, тогда
' закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

3

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

...чтобы если он не изменялся, тогда бы и не сохранялся...

smile Значит изменялся, иначе бы не сохранялся!
Конкретизируйте. Что не изменялось?

Где-то я уже напоминал, что ActiveDocument.Undo - это не параметр, а команда, выполняющая одну отмену. Вы неверно ее используете.

Макросы под заказ и готовый пакет - mtdmacro.ru

4

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Вы мне советовали:
If ActiveDocument.Saved = False Then Dialogs(wdDialogFileSaveAs).Execute
Я пробовал, увы не работает, а эта строка
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute
как нирвана
По поводу что мне нужно в этом вопросе напишу вечером

5

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute
как нирвана

То, что делает эта строка по крайней мере странно:
- Undo=False - значит буфер отмены пуст (т.е. документ не изменен),  после чего выводится диалог на сохранение;
- Undo=True - значит успешно выполнена отмена одного последнего действия (т.е. документ, до этой операции отмены, был изменен, а вот после...);

Макросы под заказ и готовый пакет - mtdmacro.ru

6

Re: Изменил документ вчера или сегодня???? Не надо путаницы

может для Вас и странно, но мною проверено и делает, то что мне нужно:
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute
как нирвана, как глоток воздуха, как хлеб, как вода, как жизнь

7

Re: Изменил документ вчера или сегодня???? Не надо путаницы

я говорил, что напишу вечером, чего тянуть. Есть шаблон, его имя например 00.dot, Word 2003 года у него имеется поцедура:

Sub AutoClose()
'AutoClose работает при закрытии документа Ворд

'условие, если буфер отмены пуст, тогда ...
'закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

End Sub

Также имеется процедура
Sub AutoNew() и Sub AutoOpen(), которые делают одну и ту же функцию Function AutoOpen_AutoNew()
В которой есть много чего, мне кажется нет смысла описывать, что в ней, потому что не зависимо от этого мне надо. Например открыв этот шаблон через создать ввожу слово, жму в верхний крестик справа предлагает сохранить документ, но почему уже введено там в поле имени "Frame...." мне этого не надо, надо чтобы было пусто, как этого добиться?
2. Главное, но после того как всё же я сохраню документ например под именем 55,  например сегодня, открываю завтра на секунду и тут же закрываю, он закроется и временем моего последнего изменеия будет свежее время, как этого избежать??? Заранее спасибо

8

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

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

Попробуйте проделать эту операцию отключив в Word макросы. Сразу станет ясно, кто изменяет документ, либо Ваши макросы, либо сам Word wink

Документ хранит в себе кроме текста кучу всего: свойства, параметры, переменные, панели, стили, автотекст, и много-много другого. Так что любое кажущееся незначительным действие может привести к сохранению документа.

Макросы под заказ и готовый пакет - mtdmacro.ru

9

Re: Изменил документ вчера или сегодня???? Не надо путаницы

поставил я уровень безопасности очень высокий. Проделал тоже самое после открытия документа дата изменения не меняется. Я понимаю, что эти изменения делал ранее макрос, но тем не менее как добиться того чтобы как я и спрашиваю в вопросе Изменил документ вчера или сегодня???? Не надо путаницы ????

10

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Чтобы документ не сохранялся при закрытии:
ActiveDocument.Saved = True

Макросы под заказ и готовый пакет - mtdmacro.ru

11

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ваш ответ как я понял таков:

Sub AutoClose()
'AutoClose работает при закрытии документа Ворд

'условие, если буфер отмены пуст, тогда ...
'закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute:ActiveDocument.Saved = True
End Sub
Так??
Верится с трудом, вроде я делал так, проверю, напишу

12

Re: Изменил документ вчера или сегодня???? Не надо путаницы

так и есть, увы открываю сохранённый с шаблона документ через секунду закрываю не трогая в нём ничего и временем изменения стаёт свежая дата и время?????????

13

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Я не могу ничего посоветовать по поводу Вашего кода. Потому как целиком кода я не видел, а кусок выложенный в первом сообщении, для меня, лишен всякого смысла.

Макросы под заказ и готовый пакет - mtdmacro.ru

14

Re: Изменил документ вчера или сегодня???? Не надо путаницы

вечером выложу файл

15

Re: Изменил документ вчера или сегодня???? Не надо путаницы

внешняя ссылка
посмотрите пожалуйста шаблон по ссылке, спасибо

16

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

...посмотрите пожалуйста шаблон по ссылке...

Глянул. По-моему, если в Sub AutoClose() вместо
If ActiveDocument.Undo = False Then
писать
If ActiveDocument.Saved = False Then
будет  то что надо. Еще проще процедуру Sub AutoClose() вобще удалить. Будет происходить тоже самое.

Все изменения документа происходят в Function AutoOpen_AutoNew(), но они не фирсируются т.к. имеется ActiveDocument.Saved=True.  Макросов поддержки "Frame_рамка_каркас" я не вижу, а при использовании этого элемента управления также будут появлятся изменения. Что бы они не фиксировались макросы надо оформлять следующим образом:

Private Sub Frame_рамка_каркас_Click()
Dim Сохранен As Boolean
    Сохранен = ActiveDocument.Saved
    ' начало не фиксируемых изменений
    ' ...
    ' конец не фиксируемых изменений
    If Сохранен Then ActiveDocument.Saved = True
End Sub 
Макросы под заказ и готовый пакет - mtdmacro.ru

17

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Честно сказать не понял Вашей мысли, в плане чего, или попутали название, так как нет необходимости в процедуре
Frame_рамка_каркас_Click()
ничего делать кроме как Beep
Если предположить что Вы просто спутали название, тогда я не пойму в коде:

Dim Сохранен As Boolean
    Сохранен = ActiveDocument.Saved
    ' начало не фиксируемых изменений
    ' ...
    ' конец не фиксируемых изменений
    If Сохранен Then ActiveDocument.Saved = True

как то же должны отделяться фиксируемые изменения от не фиксируемых, но я их не вижу, видимо не полный код
или как эта строка If Сохранен Then ActiveDocument.Saved = True будет работать

18

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

...нет необходимости в процедуре Frame_рамка_каркас_Click()...

Название порцедуры мной взято для примера. Не в названии дело. Вам надо определится какие изменения фиксировать, а какие нет. Может так понятнее:

Sub Ваш_макрос()
    ' начало фиксируемых изменений
    ' ...
    ' конец фиксируемых изменений
Dim Сохранен As Boolean
    Сохранен = ActiveDocument.Saved
    ' начало не фиксируемых изменений
    ' ...
    ' конец не фиксируемых изменений
    If Сохранен And (ActiveDocument.Saved <> True) Then ActiveDocument.Saved = True
    ' начало фиксируемых изменений
    ' ...
    ' конец фиксируемых изменений
End Sub

Отредактировано Вождь (19.08.2010 21:21:02)

Макросы под заказ и готовый пакет - mtdmacro.ru

19

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Попробую сформулировать Вашу задачу, как я ее понимаю:
- есть документ со встроенным элементом управления;
- надо чтобы в документе сохранялись все изменения, кроме изменений самого элемента управления.
В задаче нужны макросы:
1. Макрос настройки элемента управления при открытии/создании документа.
2. Макросы поддержки работы элемента управления.
3. Макрос сброса элемента управления в начальное состояние перед сохранением документа.
Третий пункт на Ваше усмотрение. Это если Вы хотите, что элемент управления не хранил в себе данных. Как вариант - элемент управления перед сохранением можно вообще удалять.

В общем, макросы будут выглядеть так:

Sub AutoClose()
    If ActiveDocument.Saved = False Then
        ' сброс состояния элемента управления в исходное перед сохранением
    End If
End Sub

Sub Макрос_элемента_управления()
Dim Сохранен As Boolean
    ' фиксируемые изменения
    Сохранен = ActiveDocument.Saved
    ' не фиксируемые изменения
    If Сохранен And (ActiveDocument.Saved <> True) Then ActiveDocument.Saved = True
    '  фиксируемые изменения
    Сохранен = ActiveDocument.Saved
    ' не фиксируемые изменения
    If Сохранен And (ActiveDocument.Saved <> True) Then ActiveDocument.Saved = True
    '  фиксируемые изменения
End Sub

Sub AutoOpen()
    AutoOpen_AutoNew
End Sub

Sub AutoNew()
    AutoOpen_AutoNew
End Sub

Sub AutoOpen_AutoNew()
    ' настройка элемента управления 
    ActiveDocument.Saved = True
End Sub
Макросы под заказ и готовый пакет - mtdmacro.ru

20

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Честно сказать мне пока тяжеловато для восприятия, но пока и времени нет
хотел спросить Вас, закомментрируте мне эту строку

ActiveDocument.Saved = True '
и
ActiveDocument.Saved = False
и разве можно писать:
ActiveDocument.Saved <> True
вроде же пишем в этом случае
ActiveDocument.Saved = False

21

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

закомментрируте мне эту строку
ActiveDocument.Saved = True
и
ActiveDocument.Saved = False

True - указывает, что документ не был изменен с момента его последнего сохранения
False - перед закрытием документа Word выдаст запрос на его сохранение

Ципихович Эндрю пишет:

разве можно писать:
ActiveDocument.Saved <> True
вроде же пишем в этом случае
ActiveDocument.Saved = False

У меня привычка - сравнивать с проверяемым значением.

Поясню на примере типа Byte. Допустим, надо проверить условие X <> 10. Вы же не пишете:

If (X = 0) or (X = 1) or ... or (X = 225) Then ' сравнения с числами от 0 до 255, кроме 10
    MsgBox "X <> 10"
End If

Вот и я не пишу, а сравниваю с проверяемым значением:

If X <> 10 Then MsgBox "X <> 10"

Да, если сравнивать переменные типа Boolean это не критично, т.к. переменная имеет только два значения. Но важно, когда сравниваешь переменные разного типа. Пример:

Dim L as Long
   L = 999
   MsgBox L = False '  результат False, но это не значит что L = True !!! 
Макросы под заказ и готовый пакет - mtdmacro.ru

22

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Вождь пишет:
Ципихович Эндрю пишет:

закомментрируте мне эту строку
ActiveDocument.Saved = True
и
ActiveDocument.Saved = False

True - указывает, что документ не был изменен с момента его последнего сохранения
False - перед закрытием документа Word выдаст запрос на его сохранение

Ципихович Эндрю пишет:

разве можно писать:
ActiveDocument.Saved <> True
вроде же пишем в этом случае
ActiveDocument.Saved = False

У меня привычка - сравнивать с проверяемым значением.

Поясню на примере типа Byte. Допустим, надо проверить условие X <> 10. Вы же не пишете:

If (X = 0) or (X = 1) or ... or (X = 225) Then ' сравнения с числами от 0 до 255, кроме 10
    MsgBox "X <> 10"
End If

Вот и я не пишу, а сравниваю с проверяемым значением:

If X <> 10 Then MsgBox "X <> 10"

Да, если сравнивать переменные типа Boolean это не критично, т.к. переменная имеет только два значения. Но важно, когда сравниваешь переменные разного типа. Пример:

Dim L as Long
   L = 999
   MsgBox L = False '  результат False, но это не значит что L = True !!! 

Странно мне вам говорить, но это не вопрос кода. Это вопрос понимания. Для Ципихович Эндрю.

23

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Я и не спорю, что это не вопрос кода, это вопрос моего понимания
благодаря Вам я пусть и не понимая, но внёс себе на вооружение строку кода:
'условие, если документ не был изменен с момента его последнего сохранения, тогда ...
If ActiveDocument.Saved = True Then ...
Так я Вам говорю, что не работает она, а работает вот эта строка:
'условие, если документ не был изменен с момента его последнего сохранения, тогда ...
If ActiveDocument.Undo = False Then ...
Также благодаря Вам я пусть и не понимая, но внёс себе на вооружение строку кода:
'перед закрытием документа Word выдать запрос на его сохранение
ActiveDocument.Saved = False
Тогда у меня возникает вопрос, как закоментировать эту строку:
Dialogs(wdDialogFileSaveAs).Execute '?????????????????????????
А также мою строку кода в Sub AutoClose():
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute
я коммертирую так:
условие, если буфер отмены пуст, тогда закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении

Правильно???
И тогда почему когда эта строка кода имеется в Sub AutoClose() шаблона, то она ведёт себя так
как  мне нужно, а когда с этого шаблона я уже создал документ то уже она ведёт себя не так как мне нужно???????

24

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Ципихович Эндрю пишет:

как закоментировать эту строку:
Dialogs(wdDialogFileSaveAs).Execute

Диалог он и есть диалог, что это такое видно при его запуске, и в комментарии не нуждается.

Ципихович Эндрю пишет:

А также мою строку кода в Sub AutoClose():
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

Использование Document.Undo я подробно комментировал выше. См. описания Undo=False и Undo=True.

Ципихович Эндрю пишет:

почему когда эта строка кода имеется в Sub AutoClose() шаблона, то она ведёт себя так
как  мне нужно

Выложенный шаблон "00 Материал фрейм.dot" при удалении Sub AutoClose() работает так, как Вам нужно, т.е. документ на его основе не сохраняется при простом открытии-закрытии. Другое дело, что Вы не включили в шаблон макросы поддержки "Frame_рамка_каркас", а они как я понимаю есть. Т.е. мы обсуждаем разные шаблоны.

Макросы под заказ и готовый пакет - mtdmacro.ru

25

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Вы говорите:
при удалении Sub AutoClose() работает так, как Вам нужно
Увы нет, потому что мне нужно, чтобы всё было по человечески, а именно:
1. имею шаблон
2. навожу на него курсор
3. выбираю Открыть
4. ничего не далаю, закрываю
НЕ НАДО МЕНЯ СПРАШИВАТЬ О СОХРАНЕНИИ, РАЗ Я НИЧЕГО НЕ ДЕЛАЛ
ДОВОЖУ ДО ВАШЕГО СВЕДЕНИЯ, ЧТО ДОКУМЕНТ БУДЕТ ИЗМЕНЯТЬСЯ, НО НЕ ПОЛЬЗОВАТЕЛЕМ, А ПРОГРАММНО
ЭТО РЕШАЕТСЯ ДОБАВЛЕНИЕМ:

Sub AutoClose()
'AutoClose работает при закрытии документа Ворд

'условие, если буфер отмены пуст, тогда ...
'закрыть документ, не сохраняя его и при этом не выводить диалог о его сохранении
If ActiveDocument.Undo = False Then Dialogs(wdDialogFileSaveAs).Execute

End Sub

ЭТО ВАША ПОДСКАЗКА И ЗА НЕЁ ВАМ БЛАГОДАРЕН!!!!!
Двигаемся далее:
1. имею тот же шаблон
2. навожу на него курсор
3. выбираю Создать
4. кое-что делаю, закрываю
НАДО МЕНЯ СПРАШИВАТЬ О СОХРАНЕНИИ, РАЗ Я КОЕ-ЧТО ДЕЛАЛ
Когда вылазит диалог о сохранении, всегда имя заполнено, как этого избежать, чтобы было пусто?????
5. затем созданный на основе этого шаблона документ открываю
6. ничего не делаю
7. закрываю
8. меня не о чём не спрашивает и это правильно, ведь я ничего не делал
9. время изменения делается свежее, как этого избежать?????????????

26

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Чтобы исключить обработку шаблона его же макросами добавьте код:

Function AutoOpen_AutoNew()
    ' не обрабатываем шаблон
    If ActiveDocument.FullName = ThisDocument.FullName Then Exit Function 

Чтобы вновь созданные документы всегда сохранялись надо ActiveDocument.Saved=True удалить из Function AutoOpen_AutoNew() и добавить в Sub AutoOpen():

Sub AutoOpen()
    AutoOpen_AutoNew 
    ActiveDocument.Saved = True 
End Sub

Диалог с пустым именем файла:

With Dialogs(wdDialogFileSaveAs)
       .Name = "" ' имя файла
       .Show
 End With

Процедуру AutoClose лучше удалить, но если хотите выводить свой диалог то вот:

Sub AutoClose()
    ' нет изменений
    If ActiveDocument.Saved Then
    ' это щаблон
    ElseIf ActiveDocument.FullName = ThisDocument.FullName Then
    ' это документ
    Else
        ' Ваш диалог сохранения документа
    End If
End Sub
Макросы под заказ и готовый пакет - mtdmacro.ru

27

Re: Изменил документ вчера или сегодня???? Не надо путаницы

Подскажите как в диалоге при сохранении файла Ворд как указать папку и тип файла

'диалог при сохранении файла
With Dialogs(wdDialogFileSaveAs)
       .Name = "" ' имя файла
       .Show 'показать
       ???'папка
       ???'тип файла
 End With

28

Re: Изменил документ вчера или сегодня???? Не надо путаницы

'диалог при сохранении файла
With Dialogs(wdDialogFileSaveAs)
'тип сохраняемого файла
'0 - Документ Word
'1 - Шаблон документа
'2 - Обычный текст
'3 - Обычный текст
'4 - Обычный текст
'5 - Обычный текст
'6 - Текст в формате RTF
'7 - Обычный текст
'8 - Вэб-страница
'9 - Вэб-страница в одном файле
'10 - Вэб-страница с фильтром
'11 - XML-документ
'12 - Word 97-2003 & 6.0/95 - RTF
'13 - Word 97-2003 & 6.0/95 - RTF
'14 - Works 6.0 & 7.0
       .Format = 0 '0 - Документ Word, можно заремарчить или удалить данную строку, что означает .Format = 0
       .Name = "" 'имя сохраняемого файла ""
       .Name = "C:\" 'место сораняемого файла, имя сохраняемого файла ""
       .Name = "C:\Имя" 'место сораняемого файла, имя сохраняемого файла "Имя"
       .Show 'показать диалог сохранения файла, указываем эту строчку последней
             
End With