Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2013 - [решено] Проверка значения переменной wBook

Ответить
Настройки темы
2013 - [решено] Проверка значения переменной wBook

Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить PM | Цитировать


Задача такая:
Из одной книги перебрасываем данные в другую. Переброс может быть разовым или многоразовым.
Для этого есть кнопка, при нажатии на которую происходит копирование некоторых ячеек в активной строке.
Нужно проверить открыта ли вторая книга. Если открыта, то проверить: открыта она пользователем или из кода 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

 

Аватара для NickM

Ветеран


Contributor


Сообщения: 4626
Благодарности: 1110

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:50, 14-08-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить PM | Цитировать


а как закрыть книгу из кода, которую отрыл пользователь из проводника?

Отправлено: 20:52, 14-08-2015 | #3


Аватара для NickM

Ветеран


Contributor


Сообщения: 4626
Благодарности: 1110

Профиль | Отправить PM | Цитировать


Хмм, озадачили. Если смотреть на Ваш код, то проверка открытия как бы намекает, что книга может быть открыта из общего доступа с любого компьютера сети. Тогда, исходя из этого закрыть приложение на др. компьютере не получиться по причине того, что определить его не представится возможным.
С др. стороны возможно узнать имя пользователя открывшего общую/расширенную книгу и уже пользователю направить сообщение с помощью того же net send(msg), который в корпоративной/доменной сети доставит его в сеанс пользователя.

Отправлено: 21:26, 14-08-2015 | #4


Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить 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


Аватара для NickM

Ветеран


Contributor


Сообщения: 4626
Благодарности: 1110

Профиль | Отправить PM | Цитировать


corbis, извините Меня, но смогу подержать Вас только теорией.
Ситуацию вижу так: определиться каким образом открыта книга:
1. Локально, в единственном сеансе пользователя - тогда и решение простое. Ввиду того, что в сеансе у приложения Эксель может быть одновременно открыта одна единственная книга/файл с одинаковым именем независимо от пути, то просто закрыть книгу по имени с сохранением внесенных изменений;
2 и 3. Книга открыта в терминальной сессии и/или с др. компьютера сети как книга общего доступа. Тут уже сложнее. Здесь придется с помощью кода VBA узнать имя пользователя/пользователей работающих с книгой, после с помощью системных, сторонних утилит(например от sysinternals) определить сессию/компьютер на котором залогинен пользователь занявший книгу, которому в последствии отправить сообщение. Также следует учесть/отвести время на реакцию пользователя после чего, при неисполнении требуемого действия предусмотреть возможность принудительного закрытия книги. А вот тут еще один момент - с помощью системных, сторонних утилит приложение в сессии/на удаленном компьютере можно просто "кильнуть", но ессно о никакой сохранности речи не идет, если сохранность нужна по зарез можно и заморочиться и реализовать ее.

Отправлено: 22:32, 14-08-2015 | #6


Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить 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


Аватара для NickM

Ветеран


Contributor


Сообщения: 4626
Благодарности: 1110

Профиль | Отправить PM | Цитировать


corbis, толковый в каком смысле?

Отправлено: 23:26, 15-08-2015 | #8


Пользователь


Сообщения: 114
Благодарности: 13

Профиль | Отправить PM | Цитировать


Без всяких выдумывании. Одной командой решается поставленная задача.

Отправлено: 03:17, 16-08-2015 | #9



Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2013 - [решено] Проверка значения переменной wBook

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход