Доброго дня! Книга имеет большой размер и работать по сети нескольким пользователям не удаётся, поэтому пользователь скачивает себе рабочую версию и работает с книгой локально. Я же в свою очередь слежу за достоверностью данных в этой книге (вношу дополнения и изменения). В книге имеется ячейка с датой последнего обновления (q1). Вопрос таков: Можно ли по средствам VBA сделать проверку при открытии более свежей версии книги если исходник расположен :\\192.168.111.112\files именно опираясь на ячейку с датой последнего обновления Q1. (Типа всплывающее окошко - Имеется более поздняя версия!) Если есть каките-то более хитрые способы реализации данного вопроса - это будет очень хорошо, в виду моего скудного познания EXCEL. Мне конечно не сложно кинуть книгу на сервер и оббежать два десятка человек чтоб обновить эту книгу у них. (даже этого они не делают т.к. компютер для них - это космичекий аппарат )))), но немного утомляет. Спасибо.
Доброго дня! Книга имеет большой размер и работать по сети нескольким пользователям не удаётся, поэтому пользователь скачивает себе рабочую версию и работает с книгой локально. Я же в свою очередь слежу за достоверностью данных в этой книге (вношу дополнения и изменения). В книге имеется ячейка с датой последнего обновления (q1). Вопрос таков: Можно ли по средствам VBA сделать проверку при открытии более свежей версии книги если исходник расположен :\\192.168.111.112\files именно опираясь на ячейку с датой последнего обновления Q1. (Типа всплывающее окошко - Имеется более поздняя версия!) Если есть каките-то более хитрые способы реализации данного вопроса - это будет очень хорошо, в виду моего скудного познания EXCEL. Мне конечно не сложно кинуть книгу на сервер и оббежать два десятка человек чтоб обновить эту книгу у них. (даже этого они не делают т.к. компютер для них - это космичекий аппарат )))), но немного утомляет. Спасибо.ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Вторник, 19.05.2015, 10:24
Function инфо(fil$, Optional n = -1) As String Dim f, p If Dir(fil) = "" Then инфо = "No file exists": Exit Function f = Dir(fil) p = Left(fil, Len(fil) - Len(f)) With CreateObject("shell.application").Namespace(p) инфо = (.getdetailsof(.Items.Item(f), n)) End With End Function
[/vba] Чтобы узнать дату создания файла нужно ввести формулу:
Код
=инфо(A2;5)*1
Ну а дальше сравнивайте с имеющейся ячейкой
Для разных ОС константа "5" может отличатся(попробуйте, если не то показывает заменить "5" на другую цифру) - у меня windows 7.
Я пользуюсь такой функцией: [vba]
Код
Function инфо(fil$, Optional n = -1) As String Dim f, p If Dir(fil) = "" Then инфо = "No file exists": Exit Function f = Dir(fil) p = Left(fil, Len(fil) - Len(f)) With CreateObject("shell.application").Namespace(p) инфо = (.getdetailsof(.Items.Item(f), n)) End With End Function
[/vba] Чтобы узнать дату создания файла нужно ввести формулу:
Код
=инфо(A2;5)*1
Ну а дальше сравнивайте с имеющейся ячейкой
Для разных ОС константа "5" может отличатся(попробуйте, если не то показывает заменить "5" на другую цифру) - у меня windows 7.SLAVICK
Function lastSave() As Date lastSave = FileDateTime(ActiveWorkbook.FullName) End Function
[/vba] Можно пройтись по всем файлам, например в текущей папке, и выцепить самый новый файл (который сохранили позже всех):[vba]
Код
Sub test() Dim MyPath As String, myname As String, lastFile As String Dim fTime As Date MyPath = ThisWorkbook.Path & "\" myname = Dir(MyPath, vbDirectory) fTime = FileDateTime(ThisWorkbook.FullName) lastFile = ThisWorkbook.Name Do While myname <> "" If myname <> "." And myname <> ".." And myname <> ThisWorkbook.Name Then If fTime < FileDateTime(MyPath & myname) Then fTime = FileDateTime(MyPath & myname): lastFile = myname End If myname = Dir Loop MsgBox "Самый новый файл в папке: " & lastFile & vbCr & "Время сохранения: " & fTime End Sub
[/vba]
Вот еще вариант:[vba]
Код
Function lastSave() As Date lastSave = FileDateTime(ActiveWorkbook.FullName) End Function
[/vba] Можно пройтись по всем файлам, например в текущей папке, и выцепить самый новый файл (который сохранили позже всех):[vba]
Код
Sub test() Dim MyPath As String, myname As String, lastFile As String Dim fTime As Date MyPath = ThisWorkbook.Path & "\" myname = Dir(MyPath, vbDirectory) fTime = FileDateTime(ThisWorkbook.FullName) lastFile = ThisWorkbook.Name Do While myname <> "" If myname <> "." And myname <> ".." And myname <> ThisWorkbook.Name Then If fTime < FileDateTime(MyPath & myname) Then fTime = FileDateTime(MyPath & myname): lastFile = myname End If myname = Dir Loop MsgBox "Самый новый файл в папке: " & lastFile & vbCr & "Время сохранения: " & fTime End Sub
Спасибо за отклики. Не думал что так быстро найдутся решения. Оба варианта где-то рядом, может я как-то криво объяснил - пардоньте. Вариант SLAVICK, в принципе оч хорош! но у мя проблемка (КАК?)
дата актуальности текущего документа в ячейке Q1 а дата исходника получилась в V11 и если исходник позже, то такое вот бы сообщение подписать [vba]
Код
MsgBox "Имеется более поздняя версия!", , ""
[/vba] А в идеале при нажатии кнопки ОК произошла бы замена книги, или что-то подобное, но тут навено я уже размечтался, т.к. для замены надо закрыть книгу, запустить процесс копирования, и опять открыть, а из под VBA такой процесс к сожалению запустить нельзя. Или я ошибась т.к. слабоват
Спасибо за отклики. Не думал что так быстро найдутся решения. Оба варианта где-то рядом, может я как-то криво объяснил - пардоньте. Вариант SLAVICK, в принципе оч хорош! но у мя проблемка (КАК?)
дата актуальности текущего документа в ячейке Q1 а дата исходника получилась в V11 и если исходник позже, то такое вот бы сообщение подписать [vba]
Код
MsgBox "Имеется более поздняя версия!", , ""
[/vba] А в идеале при нажатии кнопки ОК произошла бы замена книги, или что-то подобное, но тут навено я уже размечтался, т.к. для замены надо закрыть книгу, запустить процесс копирования, и опять открыть, а из под VBA такой процесс к сожалению запустить нельзя. Или я ошибась т.к. слабоват ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Вторник, 19.05.2015, 13:02
В приципе вариант Manyasha, тоже оч неплох. Если место поиска выделить \\192.168.111.112\files и дату в ячейке (в моём случае) Q1 сравнить с датой самого нового файла и при не совпадении выдавать сообщение[vba]
Код
MsgBox "Есть более новый файл: " & lastFile & vbCr & "Время сохранения: " & fTime
[/vba] Да и выполнялось бы это при открытии, в фоне, а окно появлялось бы только при выполении условия.
В приципе вариант Manyasha, тоже оч неплох. Если место поиска выделить \\192.168.111.112\files и дату в ячейке (в моём случае) Q1 сравнить с датой самого нового файла и при не совпадении выдавать сообщение[vba]
Код
MsgBox "Есть более новый файл: " & lastFile & vbCr & "Время сохранения: " & fTime
[/vba] Да и выполнялось бы это при открытии, в фоне, а окно появлялось бы только при выполении условия.ZamoK
А вообще дальнейшее обсуждение без примеров противоречит правилам форума... Вы начали вроде с общего вопроса, а сейчас хотите без примера, чтобы решали конкретную задачу.
В модуль книги на "открытие" т.е. [vba]
Код
Private Sub Workbook_Open()
[/vba]
А вообще дальнейшее обсуждение без примеров противоречит правилам форума... Вы начали вроде с общего вопроса, а сейчас хотите без примера, чтобы решали конкретную задачу.SLAVICK
SLAVICK, у Вас там опечатка: [v11].Value > [q11], нужно [v11].Value > [q1] ZamoK, можно еще в функцию добавить [vba]
Код
Application.Volatile
[/vba]и при открытии книги[vba]
Код
Sheets(1).Calculate
[/vba]тогда формула инфо() будет обновляться при открытии.
Кстати, .getdetailsof почему-то не возвращает секунды, из-за этого заметила некорректную работу макроса, когда оба файлы сохранены в одну минуту. Функция FileDateTime работает нормально.
SLAVICK, у Вас там опечатка: [v11].Value > [q11], нужно [v11].Value > [q1] ZamoK, можно еще в функцию добавить [vba]
Код
Application.Volatile
[/vba]и при открытии книги[vba]
Код
Sheets(1).Calculate
[/vba]тогда формула инфо() будет обновляться при открытии.
Кстати, .getdetailsof почему-то не возвращает секунды, из-за этого заметила некорректную работу макроса, когда оба файлы сохранены в одну минуту. Функция FileDateTime работает нормально.Manyasha
Кстати, .getdetailsof почему-то не возвращает секунды
Согласен, но мне этого хватает. Удобство этой функции в том, что можно получить не только дату изменения файла, но и много другой полезной инфы: Дата создания Автор Размер .... Для этого достаточно просто поменять второй параметр функции
Кстати, .getdetailsof почему-то не возвращает секунды
Согласен, но мне этого хватает. Удобство этой функции в том, что можно получить не только дату изменения файла, но и много другой полезной инфы: Дата создания Автор Размер .... Для этого достаточно просто поменять второй параметр функции SLAVICK
=ИНФО... , =lastSave выдают одну и ту же информацию, чем они отличаются
ИНФО и lastSave - названия UDF функций - они получают информацию разными способами.
lastSave - через встроенную в vba функцию FileDateTime. а инфо через "shell.application".
Информация одинаковая(кроме секунд) - "shell.application" берет только до минут. Но через "shell.application" можно узнать намного больше чем просто дата изменения. : 'n = 0-Имя,1-Размер,2-Тип,3-Изменен,4-Дата создания,5-Открыт 'n = 6-Атрибуты,7-Состояние,8-Владелец,9-Автор,10-Заголовок 'n = 11-Тема,12-Категория,13-Страницы,14-Комментарий Детальнее здесь Поэтому я пользуюсь ею. Так как можно в два клика получить разную инфу. А вообще кому что удобно - тот тем методом и пользуется
=ИНФО... , =lastSave выдают одну и ту же информацию, чем они отличаются
ИНФО и lastSave - названия UDF функций - они получают информацию разными способами.
lastSave - через встроенную в vba функцию FileDateTime. а инфо через "shell.application".
Информация одинаковая(кроме секунд) - "shell.application" берет только до минут. Но через "shell.application" можно узнать намного больше чем просто дата изменения. : 'n = 0-Имя,1-Размер,2-Тип,3-Изменен,4-Дата создания,5-Открыт 'n = 6-Атрибуты,7-Состояние,8-Владелец,9-Автор,10-Заголовок 'n = 11-Тема,12-Категория,13-Страницы,14-Комментарий Детальнее здесь Поэтому я пользуюсь ею. Так как можно в два клика получить разную инфу. А вообще кому что удобно - тот тем методом и пользуется SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Среда, 20.05.2015, 15:30