- ベストアンサー
マクロ作動
Private Sub Worksheet_SelectionChange(ByVal Target As Range) tm = Time() '現在時間を取得 If tm < TimeValue("08:30:00") Then Exit Sub If tm > TimeValue("09:30:00") Then Exit Sub Dim ANS As Integer Dim 値 As String If Sheets("営業確認").Range("D6").Value <> "" Then ANS = MsgBox(Sheets("営業確認").Range("B6") & "のデーターが残っています。クリアしますか?", _ vbYesNo) Select Case ANS Case vbYes Sheets("営業確認").Select Sheets("営業確認").Range("B6:E461").Select Selection.ClearContents Sheets("営業確認").Range("G6:K461").Select Selection.ClearContents Sheets("入力").Select MsgBox "クリアしました" Case vbNo MsgBox "キャンセル" End Select Else End If End Sub プログラムを組みましたが、上記のとおり時間設定している間は『キャンセル』をしてもセルを動かす度にマクロが動いてしまいます。 下記のようなマクロは可能でしょうか。 (1)一番最初にシートが開くとマクロが作動 (2)その後、指定してるシートに値があってもマクロは作動しない (3)また翌日シートを開くとマクロが作動 ※1日1回マクロが作動出来ればいいです
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 #2です。 > ただ、ブックを開けたときにcheckdataが作動しません・・・ > Activateされたときは、作動します。 ワークブックのイベントプロシージャ「Workbook_Open」のコードは、何処に 貼り付けされたのでしょうか? 「Workbook_Open」のコードは、Workbookのコードオブジェクトに実装しなけ れば動作しません。 また、#2のマクロを実装した場合は、実際に「データ確認処理」が実行される のは、『1日1回のみ』となります。 なおかつ、以下の時間帯チェック、 '== 要データ確認の時間帯かチェック == '注)この処理は、上記の日付チェックがある場合は、 ' 行わなくても(削除しても)良いかもしれません。 Dim tm As Date tm = Time '現在時間を取得 If tm < TimeValue("08:30:00") Or _ tm > TimeValue("09:30:00") Then Exit Sub End If を入れている場合は、「8:30~9:30」の時間帯に起動しないと「データ確認処理」 は実行されません。 ※「CheckData関数」は呼ばれていますが、既に「確認済み」、または、「時間帯 が外れている」場合は、「データ確認処理」は実行されない、という事です。 念のため、以下に「Workbook_Open」のコードを実装する手順を記載致します。 注)以下は、Excel2000での操作方法です。 Excelのバージョンにより、操作方法が異なるかもしれません。 その際は、同様の操作に適せん置き換えて下さい。 ※添付画像もあわせてご覧下さい。 1)対象のExcelブックを開いて、VBE「Visual Basic Editor」を起動して下さい。 2)VBE画面の左側に、「プロジェクトエクスプローラ」のツリー表示画面が表示 されていなければ、以下の操作で表示させて下さい。 <メニュー操作> 「表示」 → 「プロジェクトエクスプローラ」 3)「プロジェクトエクスプローラ」内の対象のExcelブックに該当する 「VBAProject (Excelブック名)」 の部分をダブルクリックして、ツリー表示を展開して下さい。 また、そのツリー内の「Microsoft Excel Objects」の部分もダブルクリックして ツリーを展開して下さい。 4)展開したツリー内の「ThisWorkbook」の部分をダブルクリックして下さい。 これで、画面右側にWorkbookオブジェクトの「コード画面」が表示されると思い ます。 5)開いた「コード画面」上部の左側のコンボボックスより、「Workbook」を選択 して下さい。 6)続いて、同じく画面上部の右側のコンボボックスより、「Open」を選択して 下さい。 7)これで、イベントプロシージャ「Workbook_Open」のコードの雛型(処理が何も 書かれていないもの)が表示されると思います。 ※このプロシージャ部分を、以下のコード内容に書き換えて下さい。 '== 本ワークブックが開かれた時のイベント処理 == Private Sub Workbook_Open() '【検証用のメッセージ表示】 ' ※このメッセージ表示は、Workbook_Open が実行されるかどうかを ' 検証するための処理です。 ' ※このExcelブックを開いたときに下記のメッセージボックスが表示 ' されるのを確認したら、以下の1行は削除して下さい。 MsgBox "「Workbook_Open」が実行されました。" 'データ確認処理 Call CheckData End Sub 注)上記コードには、コメントに書いているように、検証用のメッセージ表示 処理を入れています。 Excelブックを開いた際に、このメッセージボックスが表示された場合は、 このプロシージャが実行されたことの確認ができましたので、その際は、 MsgBox "「Workbook_Open」が実行されました。" の部分は削除して下さい。 8)以下の操作でコードをコンパイルします。 <メニュー操作> 「デバッグ」 → 「VBA Projectのコンパイル」 ※ここで、何も表示されなければ、コンパイルは成功です。 もしもここで、エラーがあった場合は、エラー箇所が示されますので、 その部分を見て間違いを修正して下さい。 9)VBE画面を閉じた後、一旦、Excelブックを保存して下さい。 続いて、Excel自体も終了して下さい。 10)再度、対象のExcelブックを開いて下さい。 ここで、下記表示のメッセージボックスが表示されると思います。 『「Workbook_Open」が実行されました。』 これで、イベントプロシージャ「Workbook_Open」が正常に実行されたことに なります。 このメッセージボックスを[OK]ボタンで閉じると、 データ確認用の「CheckData」関数 も呼ばれるはずです。 ※なお、上記のブックオープン時のメッセージ表示を確認した場合は、以後、 このメッセージ表示処理は必要ありませんので、上記7)に書いたように、 この表示部分(メッセージボックスの記述部分)は削除して下さい。 ■参考サイト Excel の起動時にマクロを実行する - Excel - Microsoft Office Online http://office.microsoft.com/ja-jp/excel/HA010346281041.aspx VBA基本(そのブックを開いた時に自動実行) http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_130_04.html 以上です。
その他の回答 (2)
こんにちは。 #1さんの案と同様ですが、ご提示のマクロを、「1日1回」のみ実行すうようにする には、マクロ内でデータ確認を行った(キャンセルした時も含めて)時点の日付を、 何処かのセルに記録するようにしておいて、次のマクロ実行時に、その「確認済み 日付」と「現在の日付」を比較する処理を入れて、 ・「確認済み日付」と「現在の日付」が不一致の時 → データ確認処理を実行 ・「確認済み日付」と「現在の日付」が一致した時 → 処理は行わない(関数を抜ける) ようにすれば良いと思います。 また、上記処理を行うタイミング(イベント)は、 ワークシートのイベントプロシージャ 「Worksheet_SelectionChange」 で行うよりも、 同ワークシートのイベントプロシージャ 「Worksheet_Activate」 で行った方が良いのではないかと思います。 「Worksheet_SelectionChange」で行うと、シートのセル選択が変更される度に イベントが発生してしまいますが、 「Worksheet_Activate」の方は、そのシートに切替えられた時にしかイベントは 発生しませんので、処理的にも軽くなるのではないかと思います。 また、ワークブックを起動したとき(開いたとき)に、マクロを実行するには、 ワークブックのイベントプロシージャ「Workbook_Open」に、マクロを呼ぶ処理 を入れれば可能だと思います。 また、上記のようにワークブックを起動したとき、及び、ワークシート(今回の 場合は、例えば"入力"ワークシート)に切替えたときの両方で、同じ処理を 行うことになりますので、その場合は、実際の「データ確認処理」の部分は、 『共通関数』として独立させて、「標準モジュール」に実装するようにした方 が良いかと思います。 以上を踏まえて、ご提示のマクロの改造案の一例を掲載致します。 また、ワークブックのイベントプロシージャ 「Workbook_Open」と、 ワークシート(今回は"入力"ワークシート)のイベントプロシージャ 「Worksheet_Activate」の マクロも追加しました。 注1)ワークシートのイベントプロシージャ「Worksheet_SelectionChange」 は、今回は使用しないものとします。 注2)下記マクロでは、データ確認済みの日付を記録するセルは、 "入力"ワークシートの"G1"セル に記録するようにしています。 ※このセル位置は、ご使用のワークブックの都合に合わせて、適せん 変更して下さい。 ■改造版マクロ 注)インデント等のため全角スペースを入れています。 ◎ワークブックのイベントプロシージャ「Workbook_Open」 ・「ThisWorkbook」のコードオブジェクトに実装するマクロです。 ========================= Option Explicit ' '== 本ワークブックが開かれた時のイベント処理 == Private Sub Workbook_Open() 'データ確認処理 Call CheckData End Sub ========================= ◎ワークシートのイベントプロシージャ「Worksheet_Activate」 ・「Worksheet」のコードオブジェクトに実装するマクロです。 ・今回は"入力"ワークシートのコードオブジェクトに実装する想定です。 ========================= Option Explicit ' '== 本シートに切り替わった時のイベント処理 == Private Sub Worksheet_Activate() 'データ確認処理 Call CheckData End Sub ========================= ◎「標準モジュール」に実装するマクロ ・実際にデータ確認処理を行うマクロです。 ========================= Option Explicit ' '== データ確認のチェック処理 == Sub CheckData() '== 既にデータ確認済みかチェック == '※前回、確認した日付と現在日付が同じかチェックする If Sheets("入力").Range("G1").Value = Date Then Exit Sub End If '== 要データ確認の時間帯かチェック == '注)この処理は、上記の日付チェックがある場合は、 ' 行わなくても(削除しても)良いかもしれません。 Dim tm As Date tm = Time '現在時間を取得 If tm < TimeValue("08:30:00") Or _ tm > TimeValue("09:30:00") Then Exit Sub End If '== データ確認処理 == Dim ANS As Integer '確認対象のデータがあるかチェック If Sheets("営業確認").Range("D6").Value <> "" Then 'データクリアの実行確認(メッセージ表示) ANS = MsgBox(Sheets("営業確認").Range("B6") & _ "のデーターが残っています。クリアしますか?", _ vbYesNo) '選択ボタン別の処理 Select Case ANS Case vbYes '[はい]選択時 'データクリア実行 Sheets("営業確認").Range("B6:E461").ClearContents Sheets("営業確認").Range("G6:K461").ClearContents '確認済みの日付を記録 Sheets("入力").Range("G1").Value = Date MsgBox "クリアしました。" Case vbNo '[いいえ]選択時 '確認済みの日付を記録 Sheets("入力").Range("G1").Value = Date MsgBox "キャンセルしました。" End Select End If End Sub ========================= 以上です。 上記マクロが、ご希望のものと違っていた場合はすみません。 参考になれば幸いです。
補足
ありがとうございます。 ただ、ブックを開けたときにcheckdataが作動しません・・・ Activateされたときは、作動します。 もしよろしければ、ご意見をよろしくお願いします。
- FEX2053
- ベストアンサー率37% (7991/21373)
発想だけ 1.NOW関数で日付を取得し、どこかのセル(例えば"A1")に書き込んでおく。 2.ブック起動時にマクロを起動するように、マクロを設定する。ただし、 起動時に"A1"を参照、NOW関数で得た日付と比較して同じなら、マクロは即終了させる ("A1"セルと比較しただけで終了するので、処理時間はほぼゼロに近い) 3.ブック起動時に"A1"と違う日付だったら、1.の処理を行う。 処理は別にマクロ内で完結させる必要はないです。シート上に適当にデータを 書きだしておく手は、色々応用範囲が広いと思います。
お礼
有難うございました。 無事解決しました。
お礼
ご丁寧な対応ありがとうございました。 とてもわかり易く勉強になりました。 無事、マクロも作動しました。