• ベストアンサー

マクロ作動

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回マクロが作動出来ればいいです

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

  • ベストアンサー
noname#144013
noname#144013
回答No.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 以上です。

hrgc
質問者

お礼

ご丁寧な対応ありがとうございました。 とてもわかり易く勉強になりました。 無事、マクロも作動しました。

その他の回答 (2)

noname#144013
noname#144013
回答No.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 ========================= 以上です。 上記マクロが、ご希望のものと違っていた場合はすみません。 参考になれば幸いです。

hrgc
質問者

補足

ありがとうございます。 ただ、ブックを開けたときにcheckdataが作動しません・・・ Activateされたときは、作動します。 もしよろしければ、ご意見をよろしくお願いします。

  • FEX2053
  • ベストアンサー率37% (7991/21373)
回答No.1

発想だけ 1.NOW関数で日付を取得し、どこかのセル(例えば"A1")に書き込んでおく。 2.ブック起動時にマクロを起動するように、マクロを設定する。ただし、 起動時に"A1"を参照、NOW関数で得た日付と比較して同じなら、マクロは即終了させる  ("A1"セルと比較しただけで終了するので、処理時間はほぼゼロに近い) 3.ブック起動時に"A1"と違う日付だったら、1.の処理を行う。 処理は別にマクロ内で完結させる必要はないです。シート上に適当にデータを 書きだしておく手は、色々応用範囲が広いと思います。

hrgc
質問者

お礼

有難うございました。 無事解決しました。

関連するQ&A

専門家に質問してみよう