Открыть книгу на последнем активном листе - PullRequest
0 голосов
/ 19 января 2019

Как я могу открыть свою книгу на последнем активном листе, когда я нажимаю на гиперссылку, которая запускает ForceReopen? Что у меня не получается, потому что LstSht не установлен. (Обратите внимание, что я не хочу сохранять изменения при запуске ForceReopen.)

' Workbook module
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Set LstSht = Sh
End Sub

' Standard module
Public LstSht As Worksheet
Sub ForceReopen()
    Application.OnTime Now + TimeValue("00:00:01"), "GoToLast"
    ThisWorkbook.Close False
End Sub

Sub GoToLast()
    LstSht.Activate
End Sub

Ответы [ 3 ]

0 голосов
/ 19 января 2019

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

Одной из возможностей является создание небольшого текстового файла, который содержит только имя листа для активации при открытии файла.Событие открытия рабочей книги может затем прочитать текстовый файл и активировать указанный лист.

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

Расположение текстового файла - это выбор дизайна: возможно, это та же папка, что и в файле Excel, или какая-то фиксированная папка конфигурации.

Другой возможностью будет использование реестра, а не текстового файла.

0 голосов
/ 19 января 2019

Помните что-нибудь во время автоматического открытия в Application.Caption

Вы можете сохранить ActiveSheet.Name в Application.Caption во время принудительного повторного открытия книги, даже если все остальные глобальные переменные будут потеряны.

' Within ThisWorkbook:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.Caption = "Last Active: " & ActiveSheet.Name
    ' Stop         ' temporary to see the caption, but restart will not work!
End Sub


' Both following subs within a normal module:
Public Sub ForceReopen()
    Application.OnTime Now + TimeValue("00:00:01"), "GoToLast"
    ThisWorkbook.Close False
End Sub

Private Sub GoToLast()
    Dim iLastSheet As Integer  ' Position of text "Last Active" in Caption
    iLastSheet = InStr(Application.Caption, "Last Active:")
    ' Stop     ' temporary to see "Last Active: ..." in the caption
    If iLastSheet > 0 Then
        On Error Resume Next
        ThisWorkbook.Sheets(Mid(Application.Caption, iLastSheet + 13)).Activate
        On Error GoTo 0
        Application.Caption = ""
    End If
End Sub

Если вы сохраняете рабочую книгу, находящуюся на Листе 1, и начинаете ForceReopen, оставаясь на Листе3 (по кнопке, по гиперссылке, вручную, независимо от того, что), то она снова открывается на Листе 3. Чтобы проверить функциональность, вы можете добавить первый Stop, чтобы увидеть, правильно ли установлен Application.Caption (книга не откроется после этого, поэтому вы должны удалить этот Стоп после тестирования):

Screenshot to demonstrate the first part

Вы можете добавить второй Stop, чтобы проверить, установлен ли Application.Caption в соответствии с назначением после его автоматического открытия: enter image description here

0 голосов
/ 19 января 2019

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

  1. Установить открытую переменную по имени LstSht. (Я бы предпочел, чтобы это было имя листа, а не объект листа, но это может быть вопросом вкуса.
  2. Установите переменную для события Activate каждого листа. Обратите внимание, что событие Activate может не произойти при первом открытии книги. Поэтому переменная также должна быть установлена ​​в событии Workbook_Open.
  3. В процедуре GoToLast предусмотрена возможность, что переменная не содержит значения - на всякий случай. Используйте On Error Resume Next. Также убедитесь, что лист не активирован, если он уже активен. Вы можете сделать эту процедуру функцией и позволить ей вернуть значение True, если лист был изменен (для любых целей).

Эффект всего этого, как вы изложили, заключается в том, что в середине всего, что вы делаете, внезапно активируется последний активный лист, а затем книга закрывается без сохранения вашей работы. Очаровательная идея!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...