Сохранение и закрытие файла Excel при бездействии пользователя - Зайцев Я - Флудилка
^ В верх

Зайцев.Я

Все самое интересное в разделе "Флудилка"


Войти
x
x

Кто на сайте

Флудилка

Обсуждение Joomla , Virtuemart 2 , Cisco IOS , Asterisk , PHP

  • Категории
    Категории Страница отображения списка категорий системы блогов сайта.
Добавлено : Дата: в разделе: Разные заметки

Сохранение и закрытие файла Excel при бездействии пользователя

Аннотация...

За свою практику системным администратором несколько раз сталкивался с тем - что пользователям нужен один общий файл на терминальном сервере (или просто в расшаренной папке) который они могут по очереди редактировать или все хором просматривать. Соответственно сохранить изменения именно в этом же файле может только пользователь первый открывший этот файл, остальные откроют его только для чтения.  

 

Суть проблемы...

Периодически пользователь первый открывший этот файл забывает его закрыть и просто сворачивает или закрывает RDP сессию. Соответственно остальные пользователи теряют возможность вносить в этот файл изменения и начинаются звонки админу с просьбами принудительно его закрыть. Завершение RDP-сеанса по времени тоже сулило проблемы с пользователями которые внесли изменения в документ и не сохранив свернули соединение, а оно оборвалось ни чего не сохранив... 

 

На фоне этой беды написал код на VBA со следующей логикой:

1. Считывается и складывается в переменную положение курсора.

2. Запускается таймер на произвольно установленное ВАМИ время.

3. Освобождаются действия для других процессов.

4. Заканчивается таймер.

5. Еще раз считыватся позиция курсора и сравнивается с предыдущей позицией.

6. Если курсор не двигался проверяется как открыт файл - "Только для чтения" или нет, если "Только для чтения" то EXCEL документ просто закрывается, а если документ открыт с полными правами на запись , то сначала документ сохраняется по тому же пути с тем же именем, а потом закрывается.

7. Если курсор двигался то процесс начинается заново.

 

Этот код нужно вставить в документ с заранее записанным макросом "Auto_Open" заменив его так как он тут уже есть. (Вкладка меню "Разработчик"→Записать макрос→Обозвать его "Auto_Open"→Указать расположение "Эта книга"→Остановить запись→Заменить макрос на ниже приведенный код в модуле VBA "Module1")


Private Type POINTAPI
X As Long
Y As Long

End Type


Private Declare Function GetCursorPos _
Lib "user32.dll" (lpPoint As POINTAPI) As Long

 

Sub Auto_Open()
'
' Auto_Open Макрос
'
GetCursorPosition
'
End Sub

 

Private Sub GetCursorPosition()
Dim iPOINT As POINTAPI, PauseTime, Start, Finish, TotalTime
Application.DisplayAlerts = True ' Разрешаем предупреждения на время работы

GetCursorPos iPOINT ' Запрашиваем позицию курсора и записываем в переменные
Xx = iPOINT.X
Yy = iPOINT.Y

PauseTime = 60 ' Время в секундах (1 мин)

Start = Timer ' Старт
Do While Timer < Start + PauseTime ' Запускаем цикл таймера
DoEvents ' Выход на другие процессы
Loop
Finish = Timer ' Время вышло.
TotalTime = Finish - Start ' Подсчет времени простоя
GetCursorPos iPOINT ' Запрашиваем позицию курсора и записываем в другие переменные
Xx2 = iPOINT.X
Yy2 = iPOINT.Y

If Xx = Xx2 And Yy = Yy2 Then ' Сравниваем 1 и 2 положение курсора

' Начинаем действия при простое

If ActiveWorkbook.ReadOnly Then ' Проверяем файл на "ТОЛЬКО ЧТЕНИЕ"
Excel.ActiveSheet.Cells(1, 1).Select ' Переходим на ячейку 1,1 для устранения неоконченного ввода
Application.DisplayAlerts = False ' Подавляем предупреждения
Application.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True

Else

Application.DisplayAlerts = False ' Подавляем предупреждения
Excel.ActiveWorkbook.Save ' Сохраняем активную книгу
Application.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True

End If

End

Else

' Тут пользователь двигал курсор

 

End If

Cicle ' Переходим к процедуре цыкла

End Sub

 

Private Sub Cicle()
GetCursorPosition ' Зацикливаем процедуру пока не будет бездействие юзера
End Sub


 Этот код можно облагородить добавив в начале еще один таймер до первого считывания положения курсора , но меня устроило и так , да и лень было... ))) 

Поставьте свой рейтинг этой записи блога:

Комментарии

  • Гость
    Дмитрий Вторник, 07 Март 2017

    x64 версия!!!

    Какой код должен быть для версии x64?

Оставить комментарий

Гость
Гость Суббота, 23 Июнь 2018
Яндекс.Метрика Рейтинг@Mail.ru