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

Зайцев.Я

Не стесняйтесь звонить даже за советом...


Войти
x
x

Новости

  • 1
  • 2
  • 3
  • 4
  • 5
Prev Next

Материалы по CCNA R&S

15-12-2015 Hits:2338 Новости Александр

Материлы по изучению CCNA Routing and Switching   Cisco Packet Tracer 6.2 for Windows Student Version   Видео материалы: ICND 1ч.   ICND 2ч.   ICND 3ч.   ICND...

Пишем программы для веба

04-12-2015 Hits:14098 Новости Александр

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

Лабораторные работы

30-11-2015 Hits:4143 Новости Александр

 Лабораторные работы CCNA R&S   Теория - конечно очень нужная вещь , но без практики ни чего не запомнишь , ниже ссылки...

Добавляем звуки при наведении мыши или клике на меню

10-11-2015 Hits:12598 Новости Александр

Добавляем звуки при наведении мыши или клике на меню И так - всё просто , звук является частью дизайна и способность...

Обсуждение Virtumart 2

20-02-2015 Hits:3879 Новости Александр

 По моему мнению которое скорей всего субъективно - Virtumart 2 в отношении отображения цен сделан мягко говоря - коряво. И дабы...

www.radiobells.com #radiobells_script_hash

Флудилка

Обсуждение 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?

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

Гость
Гость Суббота, 27 Май 2017