ちょっと変わったマニアな作品が集結

どなたかご教授お願い致します。

・エクセルの当該ブックを、起動10分後に自動終了(保存しない)させる
・開いている間は、10分のカウントダウンを「分:秒」でA1セルに表示する

以上を実行したいのですが、VBAは全く素人ですので、うまくいきません。
見よう見まねで、以下のようなことをしましたが、結局ダメでした。

何卒、よろしくお願い致します。



ThisWorkbook Workbook Open

Private Sub Workbook_Open()
test01
Application.OnTime Now + TimeValue("00:10:00"), "終了"

End Sub


標準モジュール Module1

Sub 終了()
ThisWorkbook.Close Savechanges:=False
Application.Quit
End Sub


Sub test01()

With Sheets("バックアップ").Range("A1")
.Value = Time
.NumberFormatLocal = "mm:ss"
End With
Application.OnTime Now + TimeValue("0:00:01"), "test01"

End Sub

このQ&Aに関連する最新のQ&A

A 回答 (2件)

最初に10分TimeValue("00:10:00")


を書き込んでおいて
Timeの代わりにこれを繰り返せば。あと00:00秒のときの判定も必要かと。
   .Value = .Value - TimeValue("00:00:01")
    • good
    • 1
この回答へのお礼

御礼が遅くなりました。
有難うございました。

お礼日時:2013/10/22 16:40

「終了」プロシージャの最初に


一番最後に予約したタイマーを取り消すコードを1行追加してください。

Sub 終了()
Application.OnTime Now + TimeValue("0:00:01"), "test01", , False
  以下のコードは提示されたとおり。
    • good
    • 0
この回答へのお礼

出来ました。
早速ご回答いただき、大変有難うございました。

もしよろしければ、もう1点ご教示ください。
現在は、時間経過を現在時刻の(分・秒)で表示していますが、これを起動し10分からカウントダウン表示(分・秒)することはできますでしょうか。
よろしくお願い致します。

お礼日時:2013/10/17 17:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA=一定時間エクセルの入力操作がない場合、自動的にそのブックを閉じたい

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり
する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。

そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・

上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょうか?

可能の場合、どのようなVBAになりますか??

よろしくお願いします。


'ブックの上書き保存
ActiveWorkbook.Save
' 保存確認を避けるため、保存済みにする
ThisWorkbook.Saved = True

' 他にブックが開いていなければ、Excelを終了する
If Workbooks.Count <= 1 Then Application.Quit

' 本ブックをClose
ThisWorkbook.Close False

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり
する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。

そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・

上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょ...続きを読む

Aベストアンサー

何かオペレーションが行われたかを監視して、5分ごとにそれをチェックし、オペレーションがされなかったらブックを閉じるというマクロを組んでみました。(最後のオペレーションから5分間監視、ではなく、ブックを開いてから5分間隔でチェックするので、多少のタイムラグがあります)

しかし、「何もしなかったら」というのを検知する方法がわからなかったため、ちょっと強引ですが ThisWorkbook のイベントほとんど全てをを定義して、「何かした」というフラグを立てるという方法になっています。
そのため、ThisWorkbook のイベントで拾えない操作をしたときにも強制終了する可能性があります。

まず、標準モジュールに以下のマクロを貼り付けてください。
"00:05:00"という箇所が「5分」を定義しているところなので、時間間隔を調整したいときはそこをいじってください。



Public Operated As Boolean

Sub SetTimer()
 Application.OnTime Now + TimeValue("00:05:00"), "CloseMe"
End Sub

Sub CloseMe()
 If Operated Then
  Operated = False
  SetTimer
  Exit Sub
 End If
 
 'ブックの上書き保存
 ActiveWorkbook.Save
 ' 保存確認を避けるため、保存済みにする
 ThisWorkbook.Saved = True

 ' 他にブックが開いていなければ、Excelを終了する
 If Workbooks.Count <= 1 Then Application.Quit

 ' 本ブックをClose
 ThisWorkbook.Close False
End Sub



そして、ThisWorkbook に以下のマクロを貼り付けてください。



Private Sub Workbook_Open()
 Operated = False
 SetTimer
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_Deactivate()
 Operated = True
End Sub

Private Sub Workbook_Activate()
 Operated = True
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Operated = True
End Sub

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
 Operated = True
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 Operated = True
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
 Operated = True
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 Operated = True
End Sub

Private Sub Workbook_WindowActivate(ByVal Wn As Window)
 Operated = True
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
 Operated = True
End Sub

Private Sub Workbook_WindowResize(ByVal Wn As Window)
 Operated = True
End Sub



ご覧の通り、Workbook_Open()だけは初期設定をしていますが、その他は「何かイベントが発生したらフラグをTrueにする」の羅列です。

単にExcelのファイルを開いて、マウスのホイールでスクロールしながらあちこちシートを眺めているだけの場合など、セル操作や印刷などの操作がない場合にも強制終了されてしまうので、そこはご承知ください。

何かオペレーションが行われたかを監視して、5分ごとにそれをチェックし、オペレーションがされなかったらブックを閉じるというマクロを組んでみました。(最後のオペレーションから5分間監視、ではなく、ブックを開いてから5分間隔でチェックするので、多少のタイムラグがあります)

しかし、「何もしなかったら」というのを検知する方法がわからなかったため、ちょっと強引ですが ThisWorkbook のイベントほとんど全てをを定義して、「何かした」というフラグを立てるという方法になっています。
そのた...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Q一定時間操作されないと自動で終了させる方法

プログラムが一定時間操作されない状態(マウス操作やキー操作)が続くと
自動的にプログラムを終了させたいのですが
どうすれば実現できるのでしょうか?

Aベストアンサー

タイマーコントロールを使用してみてはいかがでしょうか。
例えば、1分おきにタイマーイベントを発生させて内部でカウントをとる。
そのカウンターが一定以上になるとプログラム終了。
キー操作など他のイベントが発生したときは、そのカウンターをリセットする。
これでできると思いますが、いかがでしょう。

Qワードやエクセルで「時間が来たら閉じる」って出来ますか?

過去の質問に「時間が来たら警告を出す」というのがあったのは
発見出来たのですが 今回やりたい事は「試験で使えるように時間制限を付けたい」というものです。

「開いたら30分後に自動的に(強制的に?)ソフトを閉じる」
「再度開く為にはパスワードが必要」(最初に開く時には不要)

というようにしたいのですが やはりVBAで解決するしか方法はないでしょうか?

ワードでも良いのですが、出来れば Excel2003 でやりたいと考えています。
宜しくお願い致します。

Aベストアンサー

>ご教示いただいた内容(Cells.Font.ColorIndex = 0')をそのまま
そのままで良いです。意味は 文字の色を自動に 設定するだけです。
回答前のファイル作成して保存するときは、必ずシートを選択して文字色を白、シートに保護
ブックの保護は解除して保存することになりますね。(毎回で大変ですが)
マクロで時間が来て保存された状態は
シートに保護、色は自動、ブックに保護の状態です。


更にと気が付いたので、終了時に保存のいいえを選択する可能性がありますね。
Sub OnTime1()
ActiveSheet.Protect Password:="1234"
Msgbox "指定の時間が来ましたので編集できなくなりました。指定のフォルダに回答を保存してください。"
Application.DisplayAlerts = False'←メッセージを出さない
ThisWorkbook.SaveAs Password:="1234", WriteResPassword:="1234"
ThisWorkbook.Close
End Sub
の1行を加えると上書き保存しますかのメッセージがでなくなります。
この1行はうまく出来るようになってから記述しないと修正の作業が大変になります。

>ご教示いただいた内容(Cells.Font.ColorIndex = 0')をそのまま
そのままで良いです。意味は 文字の色を自動に 設定するだけです。
回答前のファイル作成して保存するときは、必ずシートを選択して文字色を白、シートに保護
ブックの保護は解除して保存することになりますね。(毎回で大変ですが)
マクロで時間が来て保存された状態は
シートに保護、色は自動、ブックに保護の状態です。


更にと気が付いたので、終了時に保存のいいえを選択する可能性がありますね。
Sub OnTime1()
ActiveSheet.P...続きを読む

QExcel VBA 自動的に閉じるMsgBox

連続で、Popupを使う際に、途中で、他の処理を実行すると、Popupが自動で消えなくなってしまいます。
下のサンプルにて、GetOpenFilename をコメントアウトすれば、Popupは、正常に機能(指定時間後に自動で消える)しますが、GetOpenFilename を入れると、メッセージは、自動で消えなくなってしまいます。

Sub mySample()
Dim WSH As Object
Dim FileName As String

Set WSH = CreateObject("WScript.Shell")
WSH.Popup "1秒後、自動的に閉じる", 1, "Title", vbInformation
WSH.Popup "1秒後、自", 1, "Title", vbInformation
FileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?", , "Title")
WSH.Popup "1秒後、自動", 1, "Title", vbInformation
WSH.Popup "1秒後、自動的", 1, "Title", vbInformation
Set WSH = Nothing
End Sub

途中に処理を入れても、メッセージが自動で消えるようにしたいのです。
サジェスチョンがあれば、よろしくお願いします。

尚、Windows8.1,Excel2010です。

下記を参考にしてはいます。
Office TANAKA(http://officetanaka.net/excel/vba/tips/tips21.htm)

連続で、Popupを使う際に、途中で、他の処理を実行すると、Popupが自動で消えなくなってしまいます。
下のサンプルにて、GetOpenFilename をコメントアウトすれば、Popupは、正常に機能(指定時間後に自動で消える)しますが、GetOpenFilename を入れると、メッセージは、自動で消えなくなってしまいます。

Sub mySample()
Dim WSH As Object
Dim FileName As String

Set WSH = CreateObject("WScript.Shell")
WSH.Popup "1秒後、自動的に閉じる", 1, "Title", vbInformation
...続きを読む

Aベストアンサー

こちらの
https://oshiete.goo.ne.jp/qa/5393997.html
#6さんのMessageBoxTimeoutA を使う方法、
#7さんのUserForm を使う方法がよろしいかと。

MessageBoxTimeoutA の方がお手軽かな。
※ WScriptのpopup はあてになりません。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセルで定期的(30分おき)にマクロを実行させる方法は?

エクセルにて刻一刻変る外部データ(株価)を表示させています。それを自動で30分置きにデータ蓄積させる方法はありませんか?

現在は自分で作ったキーボードマクロで 時計を見ながらボタンを押し、データを取り込ん出る始末です。

その簡単マクロに「30分置きに実行させる」と云う記述を付け足す程度で自動実行させる事は可能でしょうか? 
当方キーボードマクロでの自動書き込みしか出来ない素人ですが、少々複雑な物であっても頑張ってみるつもりですので、どなたかご教授下さい。

Aベストアンサー

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、

 ・ブッククローズをトラップした
 ・進捗状況をステータスバーに表示するようにした
 ・その他しょうもないこと

です。

このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。


Option Explicit

Dim mcolTask As Collection

Sub 実行予約()

  Dim i      As Date
  Dim strProcName As String
  Dim datBigin  As Date
  Dim datEnd   As Date
  Dim datInterval As Date
  Dim datTimeout As Date
  Dim blnJustTime As Boolean

  ' Setting-------------------------------------------------------

  datBigin = TimeValue("10:00:00")  ' 開始時刻
  datEnd = TimeValue("18:00:00")   ' 終了時刻
  datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
  datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
  blnJustTime = True         ' datInterval で丸めるか
  strProcName = "MACRO1"       ' 実行するマクロ名

  '---------------------------------------------------------------

  ' 既に実行予約されているか確認
  If mcolTask Is Nothing Then

    ' 日付シリアル値を加算
    datBigin = datBigin + Date
    datEnd = datEnd + Date
    ' 終了時刻が開始時刻より小さければ日をまたぐので補正
    If datEnd < datBigin Then datEnd = datEnd + 1
    ' 現在時刻が既に終了時刻を過ぎている場合
    If datEnd < Now() Then
      MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
      Exit Sub
    End If
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin < Now() Then
      ' 開始時刻を datInterval で指定された値で丸めるか
      If blnJustTime Then
        datBigin = Application.Floor(Now() + datInterval, datInterval)
      Else
        datBigin = Now() + datInterval
      End If
    End If

    ' 初期化
    Set mcolTask = New Collection

    ' メイン部分
    For i = datBigin To datEnd Step datInterval
      ' 後から取り消せるようにコレクションに退避
      mcolTask.Add CStr(i) & "," & strProcName
      ' Application.Ontime で実行予約を行う
      Application.OnTime EarliestTime:=i, _
                Procedure:=strProcName, _
                LatestTime:=i + datTimeout, _
                Schedule:=True
    Next i
  Else
    MsgBox "既に実行中です", vbInformation
  End If

End Sub

Sub 未実行予約強制解除()
 
  Dim i  As Long
  Dim vntS As Variant
 
  On Error Resume Next
  Application.StatusBar = "タスク破棄中... "
  For i = 1 To mcolTask.Count
    vntS = Split(mcolTask.Item(i), ",")
    Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
  Next i
  Application.StatusBar = ""
  Set mcolTask = Nothing

End Sub

' タスク管理用
Private Sub RemoveTask()
  
  On Error Resume Next
  mcolTask.Remove (1)
  Application.StatusBar = "待機中のタスク... " & mcolTask.Count
  DoEvents
  Beep
  If mcolTask.Count = 0 Then
    Application.StatusBar = ""
    Set mcolTask = Nothing
  End If

End Sub

Sub Auto_Close()

  Dim intRes As Integer
  If Not mcolTask Is Nothing Then
    intRes = MsgBox( _
        Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
           & "破棄して終了しますか?", _
        Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
        Title:="問い合わせ")
    If intRes = vbOK Then
      Call 未実行予約強制解除
    Else
      ' ブッククローズをキャンセル
      Application.ExecuteExcel4Macro ("Halt(True)")
    End If
  End If

End Sub

' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()

  Dim lngRow As Long
  With ThisWorkbook.Sheets("Sheet1")
    lngRow = .Range("V65536").End(xlUp).Offset(1).Row
    .Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
    .Cells(lngRow, "Y").Value = Now()
  End With

  ' ご自分のマクロの最後に次の一行を追加しておいて下さい
  Call RemoveTask

End Sub

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング