|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2013 - [решено] Проверка значения переменной wBook |
|
2013 - [решено] Проверка значения переменной wBook
|
Пользователь Сообщения: 114 |
Задача такая:
Из одной книги перебрасываем данные в другую. Переброс может быть разовым или многоразовым. Для этого есть кнопка, при нажатии на которую происходит копирование некоторых ячеек в активной строке. Нужно проверить открыта ли вторая книга. Если открыта, то проверить: открыта она пользователем или из кода VBA. Если пользователем, то просим закрыть (вдруг там данные нужные какие не сохранены), если из кода (значит, переменная уже инициализирована wBook = ActiveWorkbook ), тогда копируем. Function IsBookOpen(wbFullName As String) As Boolean Dim iFF As Integer iFF = FreeFile On Error Resume Next Open wbFullName For Random Access Read Write Lock Read Write As #iFF Close #iFF IsBookOpen = Err End Function Private Sub Button_Click() flag = 0 If (IsBookOpen("C:\test.xlsx")) Then If wBook *не знаю, что тут проверить* Then MsgBox ("Закрой test'") Else MsgBox ("Можно копировать") End If Else Workbooks.Open Filename:="C:\test.xlsx" Set wBook = ActiveWorkbook End If End Sub |
|
Отправлено: 19:57, 14-08-2015 |
Ветеран Сообщения: 4626
|
Профиль | Отправить PM | Цитировать А если обойтись без проверки? Просто вывешивать сообщение, что книга будет закрыта с сохранением всех внесенных изменений, ожидать несколько секунд и в коде закрывать сохраняя изменения.
|
Отправлено: 20:50, 14-08-2015 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать а как закрыть книгу из кода, которую отрыл пользователь из проводника?
|
Отправлено: 20:52, 14-08-2015 | #3 |
Ветеран Сообщения: 4626
|
Профиль | Отправить PM | Цитировать Хмм, озадачили. Если смотреть на Ваш код, то проверка открытия как бы намекает, что книга может быть открыта из общего доступа с любого компьютера сети. Тогда, исходя из этого закрыть приложение на др. компьютере не получиться по причине того, что определить его не представится возможным.
С др. стороны возможно узнать имя пользователя открывшего общую/расширенную книгу и уже пользователю направить сообщение с помощью того же net send(msg), который в корпоративной/доменной сети доставит его в сеанс пользователя. |
Отправлено: 21:26, 14-08-2015 | #4 |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать Не совсем то, что требуется. Вроде обманул, только не знаю, насколько грамотно такое решение:
Public wBook As Workbook Function IsBookOpen(wbFullName As String) As Boolean Dim iFF As Integer iFF = FreeFile On Error Resume Next Open wbFullName For Random Access Read Write Lock Read Write As #iFF Close #iFF IsBookOpen = Err End Function Private Sub Button_Click() flag = 0 If (IsBookOpen("C:\test.xlsx")) Then If VarType(wBook) <> 9 Then MsgBox ("Закрой test'") Else MsgBox ("Можно копировать") End If Else Workbooks.Open Filename:="C:\test.xlsx" Set wBook = ActiveWorkbook End If End Sub |
|
Отправлено: 21:51, 14-08-2015 | #5 |
Ветеран Сообщения: 4626
|
Профиль | Отправить PM | Цитировать corbis, извините Меня, но смогу подержать Вас только теорией.
Ситуацию вижу так: определиться каким образом открыта книга: 1. Локально, в единственном сеансе пользователя - тогда и решение простое. Ввиду того, что в сеансе у приложения Эксель может быть одновременно открыта одна единственная книга/файл с одинаковым именем независимо от пути, то просто закрыть книгу по имени с сохранением внесенных изменений; 2 и 3. Книга открыта в терминальной сессии и/или с др. компьютера сети как книга общего доступа. Тут уже сложнее. Здесь придется с помощью кода VBA узнать имя пользователя/пользователей работающих с книгой, после с помощью системных, сторонних утилит(например от sysinternals) определить сессию/компьютер на котором залогинен пользователь занявший книгу, которому в последствии отправить сообщение. Также следует учесть/отвести время на реакцию пользователя после чего, при неисполнении требуемого действия предусмотреть возможность принудительного закрытия книги. А вот тут еще один момент - с помощью системных, сторонних утилит приложение в сессии/на удаленном компьютере можно просто "кильнуть", но ессно о никакой сохранности речи не идет, если сохранность нужна по зарез можно и заморочиться и реализовать ее. |
Отправлено: 22:32, 14-08-2015 | #6 |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать Нашёл толковый способ, может пригодится кому
Dim wBook As Workbook Set wBook = GetObject(ПутьКфайлу) If Windows(wBook.Name).Visible = False Then Windows(wBook.Name).Visible = True End If Почему-то по дефолту она скрыта. |
Отправлено: 21:10, 15-08-2015 | #7 |
Ветеран Сообщения: 4626
|
Профиль | Отправить PM | Цитировать corbis, толковый в каком смысле?
|
Отправлено: 23:26, 15-08-2015 | #8 |
Пользователь Сообщения: 114
|
Профиль | Отправить PM | Цитировать Без всяких выдумывании. Одной командой решается поставленная задача.
|
Отправлено: 03:17, 16-08-2015 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Проверка значения переменной реестра во всех пользовательских профилях | SANIOK_AV | Скриптовые языки администрирования Windows | 2 | 09-07-2013 15:20 | |
CMD/BAT - Присвоение значения переменной | starav | Скриптовые языки администрирования Windows | 1 | 30-05-2013 09:23 | |
MySQL - Хранение значения переменной в MySQL-базе | ManHack | Программирование и базы данных | 7 | 11-07-2009 10:02 | |
VBS/WHS/JS - Вывод значения переменной в сообщение | la_vanille_ciel | Программирование и базы данных | 3 | 09-04-2008 11:55 | |
php деление значения строковой переменной | Guest | Вебмастеру | 4 | 14-10-2004 17:12 |
|