VBAの時間設定について教えてください

このQ&Aのポイント
  • VBAで特定の時間だけマクロを実行する方法について教えてください。16時30分から21時までの特定の時間帯に、マクロAを実行したいのですが、エクセルが開いていなくても実行されるのでしょうか?また、マクロAの中には特定の条件があり、その条件を満たさない場合は実行されません。
  • Worksheet_SelectionChangeイベントを使用して、SUB()とEndSubで指定された範囲を開く方法について教えてください。初心者ですので、本を参考に勉強していますが、うまくできません。
  • VBAで特定の時間帯にマクロを実行する方法や、Worksheet_SelectionChangeイベントを使用して特定の範囲を開く方法について教えてください。初心者なので、分かりやすく説明していただけると助かります。
回答を見る
  • ベストアンサー

VBAの時間設定について教えてください

質問1: VBAで、ある一定の時間だけ指定したマクロが実行されることは出来ますか? (例えば毎日16時30分~21時だけ"マクロA"が実行されるというような) ただ、16時30分にエクセルが開いているとは限らないので、もし開始される時間に開いてない場合でも、指定した時間内に1度でも開けば必ず実行されるのでしょうか? マクロAには Sub マクロA() If sheets("1").Range("A1").Value <>"" Then msgbox"このシートは使えません" Else End If End sub という命令を作っています。 質問2: SUB() EndSub で Private Sub Worksheet_SelectionChange(ByVal           Target As Range を開くことは出来ないのでしょか。 色々やってみたのですが出来ません。 すいません。初心者なので色々本を見ながら勉強していますが、なかなかうまく出来ません。 どなたか、教えてください。      

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

> このシートモジュールを2つのシートで使いたいのですが、 merlionXXです。 使いたいシートのシートモジュールにそれぞれ記述してください。 > もしセルA2の日付が今日であれば、作動する。 日付のセルA2は2つのシートの、それぞれにあるのですね? A2の日付が本日だった場合のみ、指定時間帯にA1セルに入力があったらメッセージをだすんですね? 以下のような記述となります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub 'A1セル以外なら作動せず If Date <> Range("A2").Value Then Exit Sub 'A2セルが本日以外なら作動せず tm = Time() '現在時間を取得 If tm < TimeValue("16:30:00") Then Exit Sub '16:30前なら作動せず If tm > TimeValue("21:00:00") Then Exit Sub '21:00を過ぎたら作動せず If Target.Value <> "" Then '何か入力があったら作動 MsgBox "この時間帯にこのシートは使えません!", vbCritical, "Σ( ̄ロ ̄lll) " '警告 End If End Sub もしかして、警告が出た場合、A1への入力を無効にして元通りにしたいのなら、上記ではなく以下のようにします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub 'A1セル以外なら作動せず If Date <> Range("A2").Value Then Exit Sub 'A2セルが本日日付以外なら作動せず tm = Time() '現在時間を取得 If tm < TimeValue("16:30:00") Then Exit Sub '16:30前なら作動せず If tm > TimeValue("21:00:00") Then Exit Sub '21:00を過ぎたら作動せず If Target.Value <> "" Then '何か入力があったら以下を作動 MsgBox "この時間帯にこのシートは使えません!", vbCritical, "Σ( ̄ロ ̄lll) " '警告 With Application .EnableEvents = False 'イベントを無効に .Undo '元通りに .EnableEvents = True 'イベントを有効に End With End If End Sub

seikasan
質問者

お礼

本当にありがとうございました。 とても勉強になりました。

その他の回答 (4)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

No3 merlionXXです。 > それを『もしA1に何か入力されればメッセージが表示される』という命令にしたいと考えてます。 > Private Sub Worksheet_Activate()にすればそれが出来るのですが、標準モジュールではうまくいきません。 ますますわかりません。 何か入力されたら自動実行されるマクロを組みたいのなら標準モジュールの通常のマクロではだめです。 シートモジュールでイベントを拾うしかありません。 そのイベントも お書きになったPrivate Sub Worksheet_Activateではなく、、 Private Sub Worksheet_SelectionChangeでもなく、 Private Sub Worksheet_Change です。 そして、そのマクロ指定時間内にしか働かせたくないなら、 標準モジュールのマクロA()も、先ほどの予約()も消去し、該当するシートのシートモジュールに以下のように記述してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub 'A1セル以外なら作動せず tm = Time() '現在時間を取得 If tm < TimeValue("15:30:00") Then Exit Sub '15:30前なら作動せず If tm > TimeValue("21:00:00") Then Exit Sub '21:00を過ぎたら作動せず If Target.Value <> "" Then '何か入力があったら MsgBox "この時間帯にこのシートは使えません!", vbCritical, "Σ( ̄ロ ̄lll) " '警告 End If End Sub

seikasan
質問者

お礼

ありがとうございます!! もうひとつ質問いいでしょうか。 このシートモジュールを2つのシートで使いたいのですが、 もしセルA2の日付が今日であれば、作動する。 それ以外は作動しない。 これを先程教えて頂いたモジュールを応用して作れますか?

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

Sub マクロA() は標準モジュールにあるんですよね? 同じ標準モジュールに Sub 予約() Application.OnTime TimeValue("16:30:00"), "マクロA" End Sub を記述して、一旦このマクロ Sub 予約() を実行してください。 これで、指定時間の16:30に マクロA() が走ります。 あとは、Thisworkbookモジュールに Private Sub Workbook_Open() If Time() < TimeValue("16:30:00") Then Call 予約 ElseIf Time() <= TimeValue("21:00:00") Then Call マクロA End If End Sub を記述してください。 これで、指定時間の16:30前にひらかれれば、Sub 予約() を作動させ、16:30~21:00までの間に開かれると、即 マクロA() が作動します。 (テストしてませんが・・・) 質問2は、シートのセル選択で作動するマクロを、いったい何をしたいのか意味不明です。

seikasan
質問者

補足

質問2ですが、質問1にある『マクロA』は『もしA1に値があればメッセージが表示される』という命令にしてますが、 それを『もしA1に何か入力されればメッセージが表示される』という命令にしたいと考えてます。 Private Sub Worksheet_Activate()にすればそれが出来るのですが、標準モジュールではうまくいきません。 質問がへたですいません・・・・

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

1) 実行した際の時間を拾って判断するとか? Sub try() Dim i i = TimeValue(Now()) If i < "16:30:00" Or i > "21:00:00" Then Exit Sub ' ~やりたい処理~ End Sub 違うかな?

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.1

こんにちは  Excelでは、Auto_open手続きで起動したときにマクロ実行する手続きがあります(セキュリティで止まらないように設定が必要)。 excel.exe パス名\ファイル名.xls  指定時刻にExcelを起動するには、OSのタスク(システム ツール←デフラグとかがあるところ)を使うのが普通です。  Excelで作業しているときに自動実行タスクと衝突しないようにね!

関連するQ&A

  • シートのイベント VBA

    シートをクリックしたらシートをクリアしたいのですが クリックするセルがA1の場合は、マクロを実行させたくないのですが 下記のコードだとエラーになってしまいます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Target.Range = Range("a1") Then Cells.Clear End If End Sub ”Range("a1")でなければ、Cells.Clearする” にはどうすればいいですか?

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • マクロの疑問

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "A2" Then Range("A2").Select End If End Sub とすると、どのセルを選んでもA2に飛ぶのに、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "A3" Then Range("A2").Select End If End Sub とすると、A3を選んでも全く移動しないのはなぜでしょうか。 なにか落とし穴がありそうで。。。 よろしくお願いします。

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • エクセルvba  (ByVal Target As Range)について

    シートのイベントプロシージャーが Private Sub Worksheet_SelectionChange(ByVal Target As Range) End Sub となりますが (ByVal Target As Range)部分は何なのでしょうか? 何のためにあるのかわかりません。 Private Sub Worksheet_SelectionChange() End Sub としたらエラーが返ってきました。 理由を教えてください。 よろしくお願いします。

  • エクセル デバッグできるのとできないのがある

    シートイベントについて教えてください。 シートモジュールに --------------------------------------------------------- Option Explicit Private Sub Worksheet_Activate() MsgBox "" End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "" End Sub Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "" End Sub --------------------------------------------------------- と記載した時に、 F8で動かせるのは、Worksheet_Activateだけなのですがなぜでしょうか? ほかのイベントは、F8で実行させても、OSの音が鳴るだけで、マクロの実行はされません。 ご回答よろしくお願いします。

  • カーソルを動かしたときは発動させたくありません

    エクセルの Worksheet_SelectionChangeイベントで --------------------------------------------------------- Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "$A$1です" End If End Sub --------------------------------------------------------- のコードを標準モジュールに書いて、A1セルをクリックすると、MsgBoxが表示させますが、 B1セルから、キーボードの「→」キーを押してA1に移動してもMsgboxが表示されてしまいます。 クリックした時はマクロを発動させたいのですが、カーソルを動かしたときは発動させたくありません。 そんな事は可能でしょうか?

  • エクセル2010のvbaについて

    Sheet1に挿入したイメージ(ActiveX)をクリックすると数字が上がって 実行中にもう一度同じイメージをクリックすると止まるようにしたいのですが 数字が上がったまま止まりません(上限はあるのでオーバーフローはしません) Worksheet_SelectionChangeで(ActiveXのイメージがもう一回押されて) 選択セルが変わったら停止としたかったのですが反応しません イメージをクリック(実行)してもう一回押すとクリックしている間は止まりますが離すと再開されます コードにクリックされた回数がわかるようにしましたが増えません 説明が分かりにくかったら追記します 回答お願いします クラスモジュールのコード(イメージの名前によって少し処理を変えるためです) Private Sub myImg_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Integer, a, b, C As POINTAPI, obj As OLEObject i = myImg.Index - 1 Call GetCursorPos(C) Set obj = ActiveWindow.RangeFromPoint(C.X, C.Y) b = Range("A1") Range("A1") = obj.Name Range("A2") = Range("A2") + 1    'クリックされた回数が分かるようにするため追加 If Range("A2") = 2 Then Range("C1").Select End If Range("A3") = "B1" If obj.Name = 2 Then Range("A3") = "B3" Range(Range("A3")).Select End Sub Sheet1のコード Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Address <> Range(Range("A3")).Address Then Exit Sub Do While ActiveCell < Range("A4") * 100 If ActiveCell.Address <> Range(Range("A3")).Address Then Exit Do End If DoEvents ActiveCell = ActiveCell + 1 Loop End Sub

  • Excel VBA 他のシートに演算結果を入れたい

    例えば、A~Dというシートのいずれかのo1セルに数値を入力すると、演算結果がp1に入る場合。 A~Dのどのシートでもo1に入力したら、Z!p1にp1の値を放り込みたいのです。 で、以下のようなコードを書いたのですが、上手くいきません。 因みに、セルの移動方向はオプションで「右方向」に設定してあります。 ※結果としてセルの移動を認識していないのか、まったく無反応です。 ※Range("Z!$P$1") =… の行にブレークポイントを設定しても、引っかかりません。 何が悪いのかお教え頂ければ幸甚です。 >違うシートには代入できない… ってことでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$P$1" Then Range("Z!$P$1") = Range("$P$1") End If End Sub ※なお、出典元のSubは以下の様なもので、正常に動作していました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address = "$A$1" Then Range("B1") = Range("B1")+1 End If End Sub

  • エクセルVBAで Cancel=Trueの使い方

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_Deactivate() Cancel = True MsgBox "キャンセルしました" End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cancel = True MsgBox "キャンセルしました" End Sub 以上のように使ってみましたが、どれも「キャンセルしました」とメッセージは出るものの、直前の操作(入力、シート切替、セル移動)はキャンセルされませんでした。 どこが間違っているのでしょうか?

専門家に質問してみよう