Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   [решено] Excel 2010 - Как вставить в книгу дату ее последнего изменения? (http://forum.oszone.net/showthread.php?t=208261)

Odisseus 04-06-2011 20:48 1688473

Excel 2010 - Как вставить в книгу дату ее последнего изменения?
 
Есть некая книга, которая периодически изменяется. Необходимо знать, когда она изменялась и автоматически вставлять эту дату где-нибудь на листе. Возможно ли это?

okshef 04-06-2011 20:53 1688480

Меню "Вставка" - "Колонтитулы" (выбрать верхний или нижний) - "Текущая дата" - не подойдет?

Twister83 05-06-2011 09:45 1688645

okshef, при открытии сразу заменяет на текущую, старую не увидеть.

Вычитал макрос по поводу даты, можно время добавить также:

В модуль ЭтаКнига
Код:

Option Explicit

Private Sub Workbook_Open()
activesheet.range("A1").Value = Format(Date, "dd.mm.yyyy")

End Sub


Iska 05-06-2011 10:07 1688651

Twister83, угу. Только данные брать другие. Примерно так:
Код:

Private Sub Workbook_Open()
    With ThisWorkbook.Worksheets.Item(1).Cells(1, 1)
        .Value = ThisWorkbook.BuiltinDocumentProperties.Item("Last Save Time")
        .NumberFormat = "dd/mm/yy h:mm;@"
    End With
End Sub

«ThisWorkbook» — ссылка на ту рабочую книгу, которая содержит данный макрос.

Twister83 05-06-2011 10:40 1688661

Iska, что-то ошибки выдает при компиляции, код вставлять без изменений?

Iska 05-06-2011 11:12 1688672

Twister83, я пробовал на имеющемся у меня Office 2003, так что, теоретически, в Вашей версии вполне могут быть отличия в объектной модели. Перед первым использованием рабочая книга должна быть сохранена.

Odisseus 05-06-2011 14:34 1688770

Всем спасибо за ответы! Есть все же несколько непоняток.
Iska, в вашем примере, как вывести дату в ячейку, ту же А1, как в примере Twister83 activesheet.range("A1") И как запустить потом этот макрос? Или он будет выполняться автоматически при сохранении книги?

Iska 05-06-2011 20:26 1688913

Цитата:

Цитата Odisseus
Iska, в вашем примере, как вывести дату в ячейку, ту же А1, как в примере Twister83 activesheet.range("A1") »

Как раз и выводится дата последнего сохранения («.BuiltinDocumentProperties.Item("Last Save Time")») рабочей книги, в которой находится данный макрос («ThisWorkbook»), в ячейку «A1» («.Cells(1, 1)») первого рабочего листа («.Worksheets.Item(1)»). Затем та же ячейка форматируется для правильного отображения даты («.NumberFormat = "dd/mm/yy h:mm;@"»).

Поскольку код находится в модуле «ЭтаКнига» в процедуре «Workbook_Open()» — он будет (при не отключённых макросах) выполняться каждый раз при открытии рабочей книги.

Если нужно, чтобы код выполнялся и при сохранении — можно добавить аналогичный код в процедуру «Workbook_BeforeSave()». Но, естественно, тут уже надо будет предусмотреть тот факт, что перед первым сохранением свойство «Last Save Time» будет попросту недоступно.

Odisseus 06-06-2011 21:51 1689593

Iska, очень информативно, спасибо огромное!

okshef 06-06-2011 21:53 1689595

Цитата:

Цитата Iska
Затем та же ячейка форматируется для правильного отображения даты »

достаточно это сделать один раз, а потом исключить из кода.

Iska 07-06-2011 04:24 1689711

Цитата:

Цитата okshef
достаточно это сделать один раз, а потом исключить из кода. »

Теоретически — да. На практике же надо смотреть, есть ли какая-либо защита у ячейки, рабочего листа, книги. Ибо строка/столбец могут быть банально удалены.

Odisseus 04-06-2014 13:38 2359810

А как вставить дату в колонтитул?

Iska 04-06-2014 20:06 2359975

Код:

Private Sub Workbook_Open()
    Dim objWorksheet As Worksheet
   
    With ThisWorkbook
        For Each objWorksheet In .Worksheets
            objWorksheet.PageSetup.CenterHeader = .BuiltinDocumentProperties.Item("Last Save Time")
        Next
    End With
End Sub


Odisseus 05-06-2014 13:32 2360309

Iska,
Не работает... Если заменить CenterHeader на CenterFooter, то по идее, должно отобразиться в нижнем колонтитуле. Но ничего нет ни сверху ни снизу

Iska 05-06-2014 15:54 2360373

Судя по PageSetup.CenterFooter Property (Excel) — объектная модель не менялась.

Описывайте подробно что и как делали, как проверяли. что не работает. Буквально.

Odisseus 05-06-2014 23:10 2360523

Цитата:

Цитата Iska
Буквально »

Ну, все просто - ПКМ на вкладке листа, view code, вставил код в редактор, сохранил, закрыл редактор, внес изменения в книгу, сохранил, закрыл книгу. Открываю книгу, а колонтитул пуст... Макросы включены.

okshef 06-06-2014 00:15 2360567

Odisseus, попробуйте вставить код в процедуру Workbook_BeforeClose

Iska 06-06-2014 04:54 2360585

Цитата:

Цитата Odisseus
ПКМ на вкладке листа, view code, вставил код в редактор »

В какой именно модуль вставляли? У меня есть подозрение, что Вы вставили код в модуль листа, а не книги.

P.S. Прошлый раз ведь проблем с этим не было?

Odisseus 06-06-2014 14:40 2360756

Цитата:

Цитата Iska
В какой именно модуль вставляли? »

Собственно, скрин тут.
ПКМ на ThisWorkbook-View code, вставил туда, сохранил. Ничего не изменилось. Макросы проверил, включены все.

В прошлый раз мы ссылались на ячейки, а сейчас на колонтитул.

Iska 06-06-2014 15:23 2360777

Цитата:

Цитата Odisseus
ПКМ на ThisWorkbook-View code, вставил туда, сохранил. »

А на скриншоте — не «ThisWorkbook», а «Sheet1» ;).

Odisseus 06-06-2014 19:36 2360893

Цитата:

Цитата Iska
не «ThisWorkbook», а «Sheet1» »

Есть такой момент... Но я делал именно так, как описал в предыдущем посте. То есть, получается, что макрос применился к листу?

okshef 06-06-2014 20:52 2360925

Цитата:

Цитата Odisseus
макрос применился к листу? »

конечно, если вы его записали в процедуру листа.
Цитата:

Цитата Odisseus
ПКМ на вкладке листа »

дык, в книгу надобно...

Iska 07-06-2014 02:09 2361037

Цитата:

Цитата Odisseus
Но я делал именно так, как описал в предыдущем посте. »

Наверное, всё-таки, не так, а как Вы написали в первый раз, как процитировал Вас коллега okshef — «ПКМ на вкладке лист».

Будучи уже в редакторе, сделайте двойной щелчок по «ThisWorkbook» в окне проекта:

для открытия модуля рабочей книги.

Odisseus 07-06-2014 13:44 2361162

Нюансы, блин)) Извиняюсь за тупость. Заработало.
А как можно добавить свой текст в этот центральный колонтитул. После отработки макроса, весь текст в нем заменяется на даты изменения.

Iska 07-06-2014 13:57 2361172

Цитата:

Цитата Odisseus
А как можно добавить свой текст в этот центральный колонтитул »

Программно? Пояcните.

Odisseus 07-06-2014 18:34 2361284

Цитата:

Цитата Iska
Пояcните. »

Допустим, нужно, чтобы в центральной ячейке футера было так "Список изменен @дата@" a не просто дата. Как это сделать?

Iska 07-06-2014 23:23 2361361

Код:


objWorksheet.PageSetup.CenterFooter = "Список изменен " & .BuiltinDocumentProperties.Item("Last Save Time")


Odisseus 08-06-2014 14:59 2361565

Iska, Большое спасибо!

Grey_rnd 18-07-2016 14:12 2651874

Цитата:

Цитата Iska
«ThisWorkbook» — ссылка на ту рабочую книгу, которая содержит данный макрос. »

Поясните для тех кто "в танке". Не знаком с VBA но фишку надо реализовать. У меня есть многостраничный файл, надо, что бы на первой странице отображалось дата последнего сохранения. Каким образом добавить эту ссылку?
Макрос добавил в файл, но почему то его название не отображается при вставке макроса на страницу...(((

Iska 18-07-2016 14:27 2651885

Цитата:

Цитата Grey_rnd
У меня есть многостраничный файл, надо, что бы на первой странице отображалось дата последнего сохранения. »

Microsoft Excel научился разделять колонтитулы первой и остальных страниц?!

okshef 18-07-2016 14:49 2651890

Iska, 2010 умеет

А так же четных и нечетных

Печать верхнего колонтитула только на первой странице

Iska 18-07-2016 15:16 2651899

Цитата:

Цитата okshef
Iska, 2010 умеет
А так же четных и нечетных »

Точно, есть, это я не доглядел. Хотя, помнится, уже как-то даже спрашивал с год-два назад. Вывод: не пользуешь — забыл.

Grey_rnd, попробуйте (не проверялось. ибо не на чем):
Код:


objWorksheet.PageSetup.DifferentFirstPageHeaderFooter = True
objWorksheet.PageSetup.FirstPage.CenterFooter = "Список изменен " & .BuiltinDocumentProperties.Item("Last Save Time")


Grey_rnd 18-07-2016 22:11 2652012

Цитата:

Цитата Iska
Microsoft Excel научился разделять колонтитулы первой и остальных страниц?! »

Не знаю....у меня 2007...
Допустим файл называется Отчет по обследованиям.xlsx, прошу подскажите как мне исправить представленный Вами макрос, что б все работало...

okshef 18-07-2016 23:05 2652021

Макрос создает колонтитул активного листа до начала печати
Скрытый текст
Код:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = True
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = "Список изменен " & ActiveWorkbook.BuiltinDocumentProperties(12)
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
End Sub


Grey_rnd 18-07-2016 23:22 2652026

okshef, мне бы просто дату в самом документе, потому как обычно используется электронный вид.

okshef 18-07-2016 23:29 2652031

Замените на
Код:

.FirstPage.CenterHeader.Text = Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
Или вам в какую-то ячейку, а не в колонтитул?

Grey_rnd 19-07-2016 10:41 2652123

Цитата:

Цитата okshef
Или вам в какую-то ячейку »

Да именно, просто в ячейку, что бы была дата последнего сохранения. Я так думаю,что при распечатке эта дата тоже будет видна.

okshef 19-07-2016 14:36 2652224

Код:

Worksheets("Sheet1").Range("D6")=Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
Вместо Sheet1 и D6 - ваши хотелки в виде названия листа и нужной ячейки. Если заранее установить формат ячейки на "Краткий формат даты", то конструкцию с Format(what, how) можно не использовать

Grey_rnd 25-07-2016 09:42 2653838

okshef, Куда вставить последний приведенный Вами код?
Код:

Worksheets("Sheet1").Range("D6")=Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
Вместо
Код:

.FirstPage.CenterHeader.Text = Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
????
Что то не срабатывает? что делаю неправильно?
Alt+f11, выбираю Module, вставляю код, сохраняю, сохраняю файл как файл с макросом. Далее Вид - Макросы...а внутри пусто. Он же должен там присутствовать когда добавлен?

PS
1.Как закоментировать некоторые строки, что б временное не участвовали в процессе?)

Iska 25-07-2016 10:42 2653864

Цитата:

Цитата Grey_rnd
1.Как закоментировать некоторые строки, что б временное не участвовали в процессе?) »

Апострофом — «'» или «Rem».

Grey_rnd 25-07-2016 10:53 2653867

Что то нет никаких движений...
Вот скопированный код:
Скрытый текст

Код:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = True
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
    Rem .FirstPage.CenterHeader.Text = Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
        .Worksheets("График").Range("H1") = Format(ActiveWorkbook.BuiltinDocumentProperties(12), "dd.mm.yyyy")
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
End Sub


Что делаю не так? Макросы вроде включил в настройках...

Iska 25-07-2016 11:52 2653904

Grey_rnd, многое «не так». Не так вставлено. И не туда вставлено.

1. Вставлять следует не в модуль «\Modules\Module1», а в модуль Рабочей книги «ЭтаКнига»:



2. Вставляйте такой код (остальное Вам для изложенной выше хотелки не нужно):
Код:

Option Explicit

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    With ThisWorkbook
        .Worksheets("График").Range("H1") = Format(.BuiltinDocumentProperties.Item("Last Save Time"), "dd.mm.yyyy")
    End With
End Sub


Grey_rnd 25-07-2016 16:31 2654020

Цитата:

Цитата Iska
Вставлять следует не в модуль «\Modules\Module1», а в модуль Рабочей книги «ЭтаКнига» »

1. А в чем принципиальная разница?

2. В документ макрос вставлять не надо, я так понимаю (через вид-макросы)? Он выполняется автоматически при открытии файла?
3. Сделал как вы сказали, чет не пахат...))))

okshef 25-07-2016 21:05 2654090

Grey_rnd, создайте копию вашего файла без данных, но с макросом, и выложите уже, наконец...

Grey_rnd 26-07-2016 08:55 2654154

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

okshef 26-07-2016 09:22 2654160

Все работает. Просто отправьте документ (фрагмент) на печать и увидите.

Grey_rnd 26-07-2016 10:34 2654177

Цитата:

Цитата okshef
Все работает. Просто отправьте документ (фрагмент) на печать и увидите. »

:sorry: Повторюсь, мне бы не в печати, а так в эл. виде видеть...
Просто что бы сторонний человек открыл файл и увидел, что дата последней актуализации тогда то..

Iska 26-07-2016 13:31 2654231

Цитата:

Цитата Grey_rnd
1. А в чем принципиальная разница? »

Принципиальная разница в том, что процедура обработки события «Workbook_BeforePrint()» может обрабатывать событие Workbook.BeforePrint Event (Excel) только будучи в модуле «ЭтаКнига»/«ThisWorkbook» Рабочей книги. Если Вы поместите эту процедуру просто в один из модулей — это будет обычная процедура.

Цитата:

Цитата Grey_rnd
2. В документ макрос вставлять не надо, я так понимаю (через вид-макросы)? Он выполняется автоматически при открытии файла? »

Надо. Да.

Цитата:

Цитата Grey_rnd
Повторюсь, мне бы не в печати, а так в эл. виде видеть...
Просто что бы сторонний человек открыл файл и увидел, что дата последней актуализации тогда то.. »

Сторонний человек может посмотреть «дату актуализации» не открывая файл, просто в его расширенных свойствах:
Скрытый текст
откуда, она собственно и бралась для вставки в документ. Это основы. Объясните, что не надо изобретать велосипед да ещё и с квадратными колёсами.

a_axe 26-07-2016 16:35 2654289

Цитата:

Цитата Iska
процедура обработки события «Workbook_BeforePrint() »

Iska, а почему в данном случае следует использовать BeforePrint, а не Workbook_AfterSave, я видимо упустил по беседе некие требования?
Вроде логично привязать к сохранению - пользователь сохранил документ, о чем тут же осталась запись в ячейке H11. Ведь документ могут сохранить, но ни разу не напечатать.
Код
Цитата:

Option Explicit

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
With ThisWorkbook
.Worksheets("График").Range("H1") = Format(.BuiltinDocumentProperties.Item("Last Save Time"), "dd.mm.yyyy")
End With
End Sub

Iska 26-07-2016 17:13 2654295

Цитата:

Цитата a_axe
Iska, а почему в данном случае следует использовать BeforePrint, а не Workbook_AfterSave, я видимо упустил по беседе некие требования? »

Изначально было вообще «Workbook_Open()».


Время: 12:09.

Время: 12:09.
© OSzone.net 2001-