Кто может помочь в создании (создать) макроса, чтобы файл автоматом закрывался по истечении определенного времени неактивноси с обязательным принуждением разрешить макросы. Первую часть задания я имею, не знаю, как соединить со вторым условием.
this workbook: [vba]
Код
Option Explicit
Dim DateTime As Date
Private Sub Workbook_Open() DateTime = Now + #12:10:00 AM# Application.OnTime DateTime, "TimeOut" End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime DateTime, "TimeOut", , False End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Workbook_BeforeClose False Workbook_Open End Sub
[/vba]
This Worksheet: [vba]
Код
Option Explicit
Private Sub TimeOut() ThisWorkbook.Close True End Sub
[/vba]
Кто может помочь в создании (создать) макроса, чтобы файл автоматом закрывался по истечении определенного времени неактивноси с обязательным принуждением разрешить макросы. Первую часть задания я имею, не знаю, как соединить со вторым условием.
this workbook: [vba]
Код
Option Explicit
Dim DateTime As Date
Private Sub Workbook_Open() DateTime = Now + #12:10:00 AM# Application.OnTime DateTime, "TimeOut" End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime DateTime, "TimeOut", , False End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Workbook_BeforeClose False Workbook_Open End Sub
[/vba]
This Worksheet: [vba]
Код
Option Explicit
Private Sub TimeOut() ThisWorkbook.Close True End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim wb ThisWorkbook.Sheets("WAR").Visible = -1 For Each wb In ThisWorkbook.Sheets If wb.name <> "WAR" Then wb.Visible = 2 Next wb Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim wb ThisWorkbook.Sheets("WAR").Visible = -1 For Each wb In ThisWorkbook.Sheets If wb.name <> "WAR" Then wb.Visible = 2 Next wb ThisWorkbook.Save ThisWorkbook.All_On Cancel = True Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true Workbook_Open End Sub
Public Sub Workbook_Open() Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim sh For Each sh In ThisWorkbook.Sheets sh.Visible = -1 Next sh ThisWorkbook.Sheets("WAR").Visible = 2 Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true End Sub
[/vba]
у меня так работает, на листе WAR написано включите выполнение внутреннего содержимого (Макросы)
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim wb ThisWorkbook.Sheets("WAR").Visible = -1 For Each wb In ThisWorkbook.Sheets If wb.name <> "WAR" Then wb.Visible = 2 Next wb Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim wb ThisWorkbook.Sheets("WAR").Visible = -1 For Each wb In ThisWorkbook.Sheets If wb.name <> "WAR" Then wb.Visible = 2 Next wb ThisWorkbook.Save ThisWorkbook.All_On Cancel = True Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true Workbook_Open End Sub
Public Sub Workbook_Open() Application.EnableEvents = False Application.DisplayAlerts = False Application.ScreenUpdating = False Dim sh For Each sh In ThisWorkbook.Sheets sh.Visible = -1 Next sh ThisWorkbook.Sheets("WAR").Visible = 2 Application.EnableEvents = true Application.DisplayAlerts = true Application.ScreenUpdating = true End Sub
[/vba]
у меня так работает, на листе WAR написано включите выполнение внутреннего содержимого (Макросы)K-SerJC
Благими намерениями выстелена дорога в АД.
Сообщение отредактировал K-SerJC - Четверг, 23.11.2017, 14:21
скопировать мой код на ваш лист строки из вашей процедуры Workbook_Open() добавить в мою, пред строкой end sub ваш блок Workbook_Open() удалить все.
скопировать мой код на ваш лист строки из вашей процедуры Workbook_Open() добавить в мою, пред строкой end sub ваш блок Workbook_Open() удалить все.K-SerJC
Благими намерениями выстелена дорога в АД.
Сообщение отредактировал K-SerJC - Четверг, 23.11.2017, 16:09
нашел я похожее решение, вместе с логом всех пользователей файла. Только не знаю, как это соединить с первой частью
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ищем последнюю занятую строчку в логах lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row 'заносим дату-время выхода из файла If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now
'скрываем все листы, кроме листа WAR Worksheets("WAR").Visible = True For Each sh In ActiveWorkbook.Worksheets If sh.Name = "WAR" Then sh.Visible = True Else sh.Visible = xlSheetVeryHidden End If Next sh
'сохраняемся перед выходом ActiveWorkbook.Save End Sub
Private Sub Workbook_Open() 'ищем последнюю занятую строчку в логах lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row 'заносим имя пользователя и дату-время входа в файл Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME") Worksheets("Лог").Cells(lastrow + 1, 2) = Now
'отображаем все листы For Each sh In ActiveWorkbook.Worksheets sh.Visible = True Next sh 'скрываем листы WAR и ЛОГ Worksheets("WAR").Visible = xlSheetVeryHidden Worksheets("Лог").Visible = xlSheetVeryHidden
End Sub
[/vba]
нашел я похожее решение, вместе с логом всех пользователей файла. Только не знаю, как это соединить с первой частью
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ищем последнюю занятую строчку в логах lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row 'заносим дату-время выхода из файла If lastrow > 1 Then Worksheets("Лог").Cells(lastrow, 3) = Now
'скрываем все листы, кроме листа WAR Worksheets("WAR").Visible = True For Each sh In ActiveWorkbook.Worksheets If sh.Name = "WAR" Then sh.Visible = True Else sh.Visible = xlSheetVeryHidden End If Next sh
'сохраняемся перед выходом ActiveWorkbook.Save End Sub
Private Sub Workbook_Open() 'ищем последнюю занятую строчку в логах lastrow = Worksheets("Лог").Range("A60000").End(xlUp).Row 'заносим имя пользователя и дату-время входа в файл Worksheets("Лог").Cells(lastrow + 1, 1) = Environ("USERNAME") Worksheets("Лог").Cells(lastrow + 1, 2) = Now
'отображаем все листы For Each sh In ActiveWorkbook.Worksheets sh.Visible = True Next sh 'скрываем листы WAR и ЛОГ Worksheets("WAR").Visible = xlSheetVeryHidden Worksheets("Лог").Visible = xlSheetVeryHidden
по сути тоже самое, только еще на лист лог записывает имена пользователей и дату открытия/закрытия файла при включении макросов все равно пере запускать придется.
по сути тоже самое, только еще на лист лог записывает имена пользователей и дату открытия/закрытия файла при включении макросов все равно пере запускать придется.K-SerJC
И все таки не работает. При разрешение макросов, лист Sheet1 остается скрытым, а WAR открытым. также не работает автоматическое закрытие файла.
И все таки не работает. При разрешение макросов, лист Sheet1 остается скрытым, а WAR открытым. также не работает автоматическое закрытие файла.draginoid
Добрый вечер. Получилось решить проблему немного иначе. Все работает, только, когда сам закрываю документ, выкидывает табличку на фоне листа с предупреждением. И эта же табличка выскакивает при автомаическом закрытии файла. Пока не нажмешь ок, не закрывается. Как выключить это предупреждение?
Уже нашел
Добрый вечер. Получилось решить проблему немного иначе. Все работает, только, когда сам закрываю документ, выкидывает табличку на фоне листа с предупреждением. И эта же табличка выскакивает при автомаическом закрытии файла. Пока не нажмешь ок, не закрывается. Как выключить это предупреждение?
конечно, поделюсь Все работает, как мне и хотелось, и не надо файла перезагружать при разрешении макросов
[vba]
Код
Dim DT As Date Const Period = "00:05:00"
Sub App_Close() If Now - DT > TimeValue(Period) * 2 Then DT = Now + TimeValue(Period) Application.OnTime DT, "Thisworkbook.App_Close", DT + TimeValue("00:05:00"), Schedule:=True Else ActiveWorkbook.Close SaveChanges:=True End If End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If lastrow > 1 Then Worksheets("log").Cells(lastrow, 3) = Now
Worksheets("WAR").Visible = True For Each Sh In ActiveWorkbook.Worksheets If Sh.Name = "WAR" Then Sh.Visible = True Else Sh.Visible = xlSheetVeryHidden End If Next Sh
DT = Now + TimeValue(Period) Application.OnTime DT, "Thisworkbook.App_Close", DT + TimeValue("00:05:00"), Schedule:=True End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) DT = Now - 1
End Sub
[/vba]
конечно, поделюсь Все работает, как мне и хотелось, и не надо файла перезагружать при разрешении макросов
[vba]
Код
Dim DT As Date Const Period = "00:05:00"
Sub App_Close() If Now - DT > TimeValue(Period) * 2 Then DT = Now + TimeValue(Period) Application.OnTime DT, "Thisworkbook.App_Close", DT + TimeValue("00:05:00"), Schedule:=True Else ActiveWorkbook.Close SaveChanges:=True End If End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If lastrow > 1 Then Worksheets("log").Cells(lastrow, 3) = Now
Worksheets("WAR").Visible = True For Each Sh In ActiveWorkbook.Worksheets If Sh.Name = "WAR" Then Sh.Visible = True Else Sh.Visible = xlSheetVeryHidden End If Next Sh