• 締切済み

エクセルVBA 土休日におけるbookclose

こんにちは。 VBAについては初心者レベルの者です。 さて早速質問ですが、あるエクセルブックを「タスク」によって17:28に自動起動させ、 Application.OnTime TimeValue("17:30:00"), "自動集計" を仕込んで17:30に自動集計をするようにし、集計後、ある方法で自動で関係者へメール配信を行うようにしております。 ところが諸事情により、常時起動しているPCにこのファイルを保存しているため、土日、祭日まで集計を行ってしまいます。 集計を行うと自動でメール配信をしてしまうため、月曜日出社すると、3通ほど無駄にメールが届くこととなり、できれば、平日のみ集計するようにしたいのです。 そこでお伺いしたいのは、 1.別途エクセルブックを作り、そのA列に、「ウィークデーの祭日、年末年始などの会社休日」を羅列します。 2.タスクによって自動集計のブックが開いた直後(17:29)くらいに、このブックをタスクでオープンさせて「今日が土日か、A列にある日付である場合、現在開いているエクセルブックをすべて閉じる」というマクロを実行させます。 こういった方法で自動集計のエクセルブックを閉じてしまえば良いと考えたのですが、「2」をかなえるマクロの記述はどう書けばよいかお教えいただきたいと思います。 また、別の方法で平日のみ集計する方法があればそれでも結構ですのでお教えください。 以上、よろしくお願い致します。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

問題にしているブックで Sub test02() MsgBox Date MsgBox Weekday(Date) End Sub  で今日の日付けと曜日がわかるから、土日はWeekday(Date)の結果が 1か7かを判定すれば良いのでは。 他ブック云々は意味がわからない。 ーー 問題は祝日と会社休日だが、使わないシートのA列ででもに、それらの年月日(日付シリアル値)を入力しておき(毎年見直しが必要で面倒だか、他に良い方法はないはず)を入力しておいて、これを検索すれば良い。Find検索やVLOOKUP関数(をVBAで使う)でコード例を探すと良い。 自分でGoogleででも照会すればコード例は沢山あるだろう。丸投げしないで、勉強のこと。 初心者がやるには、日付時刻で作業をコントロールなどするのは過ぎた課題だと思う。

ksk1976
質問者

お礼

ありがとうございます。

回答No.2

別のブックから閉じさせるのではなく、   Application.OnTime TimeValue("17:30:00"), "自動集計" を実行する前に、休日で有るかどうかを聞いてしまってはダメなのでしょうか? つまり、タスクから実行されるブックに、祝日と会社休日を列挙するシートを作成し、 Application.OnTime の前にIf文で休日であるかをチェック。 休日なら Application.Quit すれば良いと思います。 平日 を判定させるにはワークシート関数の NetWorkDays を利用するのはどうでしょうか。 1) シートを追加し、シート名を"休日"にする。 2) A列に土日以外の祝日・会社休日を西暦から入力。(以後、毎年更新する必要があります) 3)   If WorksheetFunction.NetworkDays(dateTODAY, dateTODAY, ThisWorkbook.Worksheets("休日").Range("A:A")) = 1 Then     Application.OnTime TimeValue("17:30:00"), "自動集計"   Else     Applicaiton.Quit   End If 試してないので(^^; 何とも言えませんが。 休日シートに入力する日付は、西暦から入力する必要があるので。年が変わる毎に入力する必要があります。応用で、休日シートは別のブックにしておく事も可能ですね。

ksk1976
質問者

お礼

ご丁寧な回答ありがとうございました。 試してみたのですが、「変数が定義されていない」というようなメッセージが出てNGとなってしまいました・・・。 しかし、社内でも同様の質問を投げかけていたところ、下記の記述例がわかり、こちらでうまくいくこととなりました。 Sub サンプル() If IsError(Application.Match(CLng(Date), Sheets("祝日").Columns("A"), 0)) Then If Weekday(Date) <> 1 Or Weekday(Date) <> 7 Then Application.OnTime TimeValue("17:30:00"), "自動集計" End If Else Application.Quit End If End Sub

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一例です。 ThisWorkBookのイベントプロシージャか、標準モジュールのAuto_Openで組み込んでは如何でしょうか。 Private Sub Workbook_Open() 又は、Sub Auto_Open() ~日付チェック処理~ If 休日 Then  Application.Quit EndIf

ksk1976
質問者

お礼

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

関連するQ&A

  • 非表示になったエクセルは?

    VBAマクロでパソコン画面からエクセルを非表示にする場合、 Sub TEST1() Application.visible = False End Sub で画面からエクセルが消えると思いますが、消えたエクセルはどうなってしまうのでしょうか? 何もしなければいつまでもそのままなのでしょうか? 電源を切ればでてくるのでしょうか? Application.visible = Trueで表示されるのはわかりますが、消えたエクセルにどうやってそのマクロを作動させたら良いのでしょうか? 10秒後に自動的に再表示させる方法はマクロに最初から Application.OnTime Now + TimeValue("00:00:10) などで自動実行させればよいのでしょうが、そうでない場合の再表示方法を教えてください。

  • vba セルに入力した時間をマクロで受け取るには?

    はじめまして、 マクロを使ってタイマーをセットしているのですが、 たとえば1行A列に9:00:00という時間をセットして、 それをマクロでうけとりmacro1というマクロを時間とおりに動かすようにタイマーにせっとします。 プログラムは以下のとおりなのですが、 TimeValue(Cells(1, 1))のところがうまくいきません。 解決方法を教えてください。 よろしくお願い思案す。 Set_timer = TimeValue(Cells(1, 1)) Cells(5, 3) = "設定完了" MsgBox "タイマーを設定しました。" Application.OnTime TimeValue(Set_timer), "macro1"

  • EXCELのApplication.OnTimeは予約のことですか?

    こんにちは、VBAの初心者です。 Application.OnTimeとは目覚し時計をセットするみたいに 時間になったら実行させたいタスクの「予約をする」ことですか。 ---------------- 例えばThisWorkbookに Sub ThisWorkbook_Open()  Application.OnTime TimeValue("09:00:00"), "A"  Application.OnTime TimeValue("10:00:00"), "B"  Application.OnTime TimeValue("11:00:00"), "C" End Sub 標準モジュールに Sub A()  Beep End Sub Sub B()  Beep End Sub Sub C()  Beep End Sub --------------- と書けば、Workbookを開いた時に「3つのタスクが予約された」と考えて良いのでしょうか。 その場合、11時前にEXCELを終了させたら 最後のタスクは自然消滅するのでしょうか、それともエラー扱いになるのでしょうか。

  • タイマーマクロの二重起動防止をしたい

    おねがいします。 Sub SetTimer() On Error Resume Next '時間変更注意 Application.OnTime TimeValue("00:00:30"), "強制終了" '時間変更注意 Application.OnTime TimeValue("00:10:00"), "SetTimer" '時間変更注意 Application.OnTime TimeValue("00:10:30"), "フォルダ作成" '時間変更注意 Application.OnTime TimeValue("23:52:00"), "プリント" '時間変更注意 Application.OnTime TimeValue("23:54:00"), "DB保存" '時間変更注意 Application.OnTime TimeValue("23:56:00"), "DBから日別保存へコピー" '時間変更注意 Application.OnTime TimeValue("23:58:00"), "表のクリア" UserForm16.Show End Sub 以上ののマクロを作成、実行します。 23時52分から一連の作業をして、0時10分に自ら次回のタイマー予約を踏むマクロです。 エクセルは、無人で24時間自動起動させています。 一番最初(ブックを開く)に、どのタイミングでスタートするかわからないので、 workbookプロシージャに workbook.openのタイミングで Call SetTimerを入れてあります。 印刷が二回発生して気付いたのですが、 このままだと、0時2分に再起動がかかり、ブックを開きなおします。 (SetTimer) で、0時10分に自己発動タイマーが働きますよね。(SetTimer二回目) すると、一連の作業は二重実行されてしまい、困ってます。 マクロ自身にフラグを持たせるんですか? なんとか、一度だけ実行をすることはできないんでしょうか? 教えてください。おねがいします。

  • エクセルシートの順繰り表示マクロについて

    エクセルにて随時更新されるデータを全画面表示し、3枚のシートを5秒置きに順繰り表示させるようマクロを組みました。始めは順調なのですが、数時間たつとフリーズしてしまいます。そもそもエンドレスのマクロプログラム実行に無理があるのでしょうか。 または下記のプログラムに問題があるのでしょうか。ご教授お願いします。 Sub Macro1() Sheets("Sheet2").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro2" End Sub Sub Macro2() Sheets("Sheet3").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro3" End Sub Sub Macro3() Sheets("Sheet1").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro1" End Sub

  • エクセルVBA 10分後にエクセル自動終了&カウン

    どなたかご教授お願い致します。 ・エクセルの当該ブックを、起動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

  • エクセルのマクロのタイマー機能について

    エクセルのマクロのタイマー機能について エクセルのマクロで指定した時間ごとにURLをクリックするマクロを作っています。 下記のように作っていますが、もっと簡略化して短い記述にしたく思います。 URLと指定時間は別のマクロで生成して、URLはA1~A49まで、指定時間はB1~B490までセルに書きこむようにしています。 URLはA49まで読んだらA1から読み直して10往復して、490回使用します。 使用するセルを一回ごとにずらしていくだけなので、簡単に出来そうな気もしますが、マクロ初心者のためわかりません>< 恐れ入りますが、ご教授いただければ幸いです。 ちなみにエクセル2007で作成しています。 Sub 一定の時間間隔でマクロを実行する() '進捗状況を示すために準備する 指定時刻 = Now + TimeValue("0時00分05秒") 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "新規01", TimeValue(待ち時間) End Sub Sub 新規01() Range("A1").Select 'A列のURLを取得 Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True 指定時刻 = Now + Range("B1").Value 'B列の時間を取得 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "新規02", TimeValue(待ち時間) End Sub Sub 新規02() Range("A2").Select Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True 指定時刻 = Now + Range("B2").Value 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "新規03", TimeValue(待ち時間) End Sub         ↓    同様の記述を490回繰り返す         ↓ Sub 新規建設490() Range("C1").Value = Now & " 終了" End Sub Private Sub 進捗状況を示すために準備する() Cells.Clear Columns("A:A").NumberFormatLocal = "yyyy/m/d h:mm:ss" Range("A1").Select ActiveCell.Value = Now & " 開始       " Columns("A:A").EntireColumn.AutoFit End Sub

  • エクセル2003で休日のセルに自動で0と表示させて1ヶ月出勤日数を集計

    エクセル2003で休日のセルに自動で0と表示させて1ヶ月出勤日数を集計させたい。 出勤簿を作っています。 入力規制(リストより選んで入力)の方法使って数式で集計しない方法はありますか?  項目名 記号   出  ○   欠  ×   休日  | 1日(B1)のセルを翌月にすると自動で日にち、月(A1)、曜日(B2)が変わることは出来たのですが、 休日(土日)のセルは自動で「0」(C3)となり、日計、月計を出したいです。 (1)自動で「0」となり集計出来る数式を教えて下さると助かります。 (2)休日(土日)の列に色を付けたいのですが、 これを含むと自動で「0」となる数式は変わってきますか? 2点質問します。 どうぞよろしくお願いします。

  • Excel2003 VBAでタイマーを組んでマクロを走らせたいのですが

    Excel2003 VBAでタイマーを組んでマクロを走らせたいのですが、以下のエラーメッセージが出ました。 マクロ "C:\aaa\Timer.xls'!Record1'が見つかりません。 マクロは、Timer.xlsブックのThisWorkbookに記述しています。 ---------------------------------------------------------------------- Sub timer1() 指定時刻 = TimeValue("09:00:00") 終了時刻 = TimeValue("11:00:00") Application.OnTime 指定時刻, "Record1" End Sub ---------------------------------------------------------------------- Sub Record1() Dim sh1, sh2 If TimeValue(Now) >= 終了時刻 Then '終了時刻になら終わる MsgBox "終了時刻になりました。" Application.CutCopyMode = False Exit Sub End If Set sh1 = Worksheets("1") Set sh2 = Worksheets("2") sh1.range("G5:G506").Copy 'コピー sh2.range("Q5:Q506").PasteSpecial Paste:=xlValues Selection.Offset(0, 2).Select '2行ずらす 指定時刻 = Now + TimeValue("00時05分00秒") '5分後 Application.OnTime 指定時刻, "Record1" End Sub ---------------------------------------------------------------------- どこを直せばよろしいのでしょうか? よろしくお願いします。

  • エクセルVBAにおけるON TIMEメソッドの解除方法について

    こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。 内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。 Sub テスト() do until  ・  ・ call timeup loop End Sub Sub timeup() dim timekp as integer 'テストの開始時間をキープ 'Application.OnTime timekp + TimeValue("1:00:00"),"endform" '1時間経過後終了を促すフォームを表示する End Sub Sub endform() load userform1 userform1.show 'エクセル終了のコマンドボタンがついているフォームを表示する End Sub マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。 変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。 以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。 マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか? また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

専門家に質問してみよう