none
マクロファイル終了し、その後に勝手に再起動するのを防ぎたい RRS feed

  • 質問

  • https://answers.microsoft.com/ja-jp/msoffice/forum/all/%e3%83%9e%e3%82%af%e3%83%ad%e3%83%95%e3%82%a1/a2bf4053-3d77-434c-911b-9caccd69b067

    ⇑で質問させていただき、ここにたどり着きました。環境はWin10、Excel2016です。

    共有ファイルの開きっぱなしを防ぐために、マクロ有効後、5分で閉じるようにしています。

    開く際に、読み取り専用?編集?を選ぶようにしています。

    単独で開く場合は問題ないのですが、他にエクセルファイル(ブランクファイルでも)を開いていると

    閉じたファイルが再起動してしまいます。

    シンプルなVBAにした下記の10秒後に閉じるVBAでも再現します。

    ThisWoookBookに

    Private Sub Workbook_Open()
    Call try
    End Sub

    標準モジュールに


    Sub try()
    ' 10秒後に「Sub 終了」を実行する
    Application.OnTime Now + TimeValue("00:00:10"), "終了"
    End Sub

    Sub 終了()
       If ThisWorkbook.ReadOnly = True Then
            ThisWorkbook.Close SaveChanges:=False
       End If

      If Workbooks.Count >= 1 Then
            ThisWorkbook.Close SaveChanges:=True
        Else
            ThisWorkbook.Save
            Application.Quit
        End If
    End Sub

    を組んだマクロファイル(セルはブランクです)とマクロなしのブランクファイルを同時に

    開いた状態で、マクロファイルを閉じると閉じたはずのマクロファイルが再起動しようとします。

    再起動するタイミングは閉じた後 TimeValue("00:00:10")で設定した時間で開く感じです。

    これを防ぐにはどうしたらよいのかご教授いただけたら幸いです。

    他のマクロも検討したのですが、以下のマクロは再起動はしなくなったものの

    ファイルが右上の×で閉じないばかりか、メニューのファイル、ホーム、挿入、」ページレイアウトなども選べなくなり

    行き詰っております。

    ThisWoookBookに

    Private Sub Workbook_Open()
    Call Timer
    End Sub

    標準モジュールに

    Public rng As Double

    Sub Timer()
        Dim L As Date, cnt As Double
        
        L = DateAdd("h", "0", Time)
        L = DateAdd("n", "0", L)
        L = DateAdd("s", "10", L)
        rng = 0
       
        Do
        cnt = DateDiff("s", Time, L) + rng
        A = Format(TimeSerial(0, 0, cnt), "hh:nn:ss")
        If A = "00:00:00" Then Exit Do
        DoEvents
        Loop
        Call CloseMe
        
    End Sub




    Sub CloseMe()


    ActiveWorkbook.Save


    ThisWorkbook.Saved = True
    If Workbooks.Count <= 1 Then
    Application.Quit
    Else
    ThisWorkbook.Close False
    End If


    End Sub

    上記2つの方法にはこだわっておりませんが、一定時間(今は5分で運用中)後にマクロファイルが閉じて

    その後、再起動しない方法があればと悩み中です。

    よろしくお願いいたします。

    2021年3月23日 4:16

回答

  • mach2000さん、こんにちは。

    再起動しようとするだけで、再起動はしないようですが(再起動と言うより閉じる動作をしようとしているのだと思いますが・・・)気持ち悪いですよね。

    要は、OnTimeの命令をキャンセルすればよろしいので、次の通り、標準モジュールのコードを修正し、ThisWorkbookモジュールにWorkbook_BeforeCloseのプロシージャにOnTimeの命令をキャンセルするコードを設定すれば、再起動しようとはしなくなるようです。

    ▼標準モジュール

    Public myEndTime As Date
    Sub try()
    ' 10秒後に「Sub 終了」を実行する
      myEndTime = Now + TimeValue("00:00:10")
      Application.OnTime myEndTime, "終了"
    End Sub

    ▼ThisWorkbookモジュール

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Application.OnTime myEndTime, "終了", , False
    End Sub

    なお、余計なお世話ですが、Sub 終了()のコードは次の様に修正する方が良いように思いますが、余計なお世話ですから、悪しからず。読み飛ばしてください。

    Sub 終了()
      If Workbooks.Count = 1 Then
        Application.Quit
      End If
      If ThisWorkbook.ReadOnly = True Then
        ThisWorkbook.Close SaveChanges:=False
      Else
        ThisWorkbook.Close SaveChanges:=True
      End If
    End Sub

    ※ それから、ThisWorkbookが開いている間に何らかのエラーが生じた場合、パブリック変数がリセットされてしまってうまくいかない場合があるかもしれません。悪しからず。これも避けたい場合は、パブリック変数を使う代わりに、ワークシート(例えば非表示のシートを用意して)のいずれかのセルにOpen時にmyEndTimeの値を書き込んで、Closeの際にその値を読み込んで、OnTime~~Falseのコードを実行する、というやり方もあると思います。

    2021年3月23日 5:50
  • mach2000さん、今晩は。

    小生の試行では、保存確認のメッセージが出ることはありませんでした。どうしても出るようならば、「Application.DisplayAlerts = False / True」を記せばよろしいかもしれません。

    なお、直前のコードでは、「Public myEndTime As Date」という標準モジュールに記すパブリック変数の定義の1行が抜けていますが、そちらのブックのVBAには記されていると思います。お忘れなきよう。

    2021年3月25日 10:57

すべての返信

  • mach2000さん、こんにちは。

    再起動しようとするだけで、再起動はしないようですが(再起動と言うより閉じる動作をしようとしているのだと思いますが・・・)気持ち悪いですよね。

    要は、OnTimeの命令をキャンセルすればよろしいので、次の通り、標準モジュールのコードを修正し、ThisWorkbookモジュールにWorkbook_BeforeCloseのプロシージャにOnTimeの命令をキャンセルするコードを設定すれば、再起動しようとはしなくなるようです。

    ▼標準モジュール

    Public myEndTime As Date
    Sub try()
    ' 10秒後に「Sub 終了」を実行する
      myEndTime = Now + TimeValue("00:00:10")
      Application.OnTime myEndTime, "終了"
    End Sub

    ▼ThisWorkbookモジュール

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Application.OnTime myEndTime, "終了", , False
    End Sub

    なお、余計なお世話ですが、Sub 終了()のコードは次の様に修正する方が良いように思いますが、余計なお世話ですから、悪しからず。読み飛ばしてください。

    Sub 終了()
      If Workbooks.Count = 1 Then
        Application.Quit
      End If
      If ThisWorkbook.ReadOnly = True Then
        ThisWorkbook.Close SaveChanges:=False
      Else
        ThisWorkbook.Close SaveChanges:=True
      End If
    End Sub

    ※ それから、ThisWorkbookが開いている間に何らかのエラーが生じた場合、パブリック変数がリセットされてしまってうまくいかない場合があるかもしれません。悪しからず。これも避けたい場合は、パブリック変数を使う代わりに、ワークシート(例えば非表示のシートを用意して)のいずれかのセルにOpen時にmyEndTimeの値を書き込んで、Closeの際にその値を読み込んで、OnTime~~Falseのコードを実行する、というやり方もあると思います。

    2021年3月23日 5:50
  • KokemomoYamamomoさん

    コメントありがとうございます。

    メッセージは出なくなり、当初の問題は解決しました。

    ありがとうございます。

    ただ、特定のPCからアクセスすると

    「このブックには、安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています。リンクを信頼できる場合、リンクを更新し最新データを取り込みます。信頼できない場合は、データをそのまま手元で処理してかまいません。」と出るようになってしまいました。

    色々調べた結果、なぜか外部リンクとして自分のファイルを選んでいたようです。原因は不明ですが、リンクを削除しても解決しました。

    アドバイスいただいたように以下のようにしました。

    ▼ThisWorkbookモジュール

    Private Sub Workbook_Open()
       Call try
     nd Sub
    ---------
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.OnTime myEndTime, "終了", , False
    End Sub

    ▼標準モジュール

    Sub try()
    ' 5分後に「Sub 終了」を実行する
     myEndTime = Now + TimeValue("00:05:00")
     Application.OnTime myEndTime, "終了"
    End Sub

    ------

    Sub 終了()
    If Workbooks.Count = 1 Then
     Application.Quit
    End If
    If ThisWorkbook.ReadOnly = True Then
     ThisWorkbook.Close SaveChanges:=False
     Else
     ThisWorkbook.Close SaveChanges:=True
    End If
    End Sub

    ------

    今までは、読み取り専用、編集モードともに閉じるときにはメッセージを出さないようにしていました。

    上記マクロを見ても同じような作動をすると思われますが、実際にはどちらのモードでも保存するか?聞いてくる画面が出てしまいます。

    まだ、VBAの本を片手にいろいろ作っている駆け出しなので、ここでまた悩んでいます。

    どこが問題でしょうか?

    ご教授いただければ幸いです。

    2021年3月25日 7:48
  • mach2000さん、今晩は。

    小生の試行では、保存確認のメッセージが出ることはありませんでした。どうしても出るようならば、「Application.DisplayAlerts = False / True」を記せばよろしいかもしれません。

    なお、直前のコードでは、「Public myEndTime As Date」という標準モジュールに記すパブリック変数の定義の1行が抜けていますが、そちらのブックのVBAには記されていると思います。お忘れなきよう。

    2021年3月25日 10:57
  • KokemomoYamamomoさん

    こんにちは

    「Application.DisplayAlerts = False / True」を入れても

    読み取り専用、編集とも変わらずでした。

    ブランクファイルで試したところ、おっしゃる通りメッセージは出ませんでした。

    週末、食事中にふっと思いついたことを先ほど運用中のファイルに試したところ

    メッセージは出なくなりました。

    変更したところは、

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Application.OnTime myEndTime, "終了", , False

     ’追加した内容******ここから

     If Workbooks.Count = 1 Then
       Application.Quit
     End If
     If ThisWorkbook.ReadOnly = True Then
       ThisWorkbook.Close SaveChanges:=False
      Else
       ThisWorkbook.Close SaveChanges:=True
     End If ’追加した内容******ここまで
    End Sub

    これで、様子を見ることとします。

    ありがとうございました。

    2021年3月29日 2:11