プロが教えるわが家の防犯対策術!

エクセルで期間限定で使えるソフトを作ろうと思っています。
簡単に申し上げると、
使用期限を設けて、期限の日がくると、
エクセルのセルに
「有効期限が来ましたので、再度お申し込みください。」
という文章が表示され(ポップアップでなくていいです)、
このシート以外は片っ端からシートが削除され、
上書き保存され、これ以上使えないというものを作りたいのです。

ツールバーのマクロの記録を利用した
極度に簡単なマクロしかやったことがないので、
以下の点を中心にマクロの作成の仕方を
お教え頂けますと幸甚です。

(1)有効期限の日付を入力しておいて、その日が来るとマクロが実行される方法
TODAY関数と有効期限の引き算でゼロになったら実行でしょうか。
該当セルの数値がゼロになったらマクロが実行されるという方法を
お教え頂けませんか。
ちなみに、有効期限の日付は、非表示にしてシートの保護で開けないようにしておこうと思います。

(2)有効期限が来たら自動的にマクロが実行される方法
上記(1)の方法でやれば、ファイルを開いたとたんマクロが実行されるのでしょうか。

(3)マクロでシートを削除する方法
これは、通常のマクロの記録でやろうとすると、
シートを削除すると「やり直し」でもシートを復活させられないので、
シートがなくなっちゃった状態でしか保存できない気がするのですが・・・。

(4)上書き保存するマクロ
上記(3)と同様、マクロの記録では
できないので、これ以外のやり方をお教え頂けませんか。

(5)シートを表示させるマクロ
マクロを実行した時点で「有効期限が来ました・・」と入力された
シートを表示させたいのです。
マクロで表示させる方法をお教え頂けますでしょうか。

(6)マクロを見れないようにする方法
マクロを自由自在に操れる人が
私の作ろうとするエクセルファイルを手にしたら、
「有効期限になる前にマクロを削除しちゃえ」と
やられないかが心配です。
うまい対処方法ございませんでしょうか。

(7)パソコンの日付の操作の対処
上記の(6)と絡むのですが、
パソコンの日付とプロパティーから
パソコンの日付をいじって
有効期限より前の日付にしたら
ずっと使われてしまうのではないか心配です。
うまい対処方法ございませんでしょうか。



ずぶの素人の私にどなたか
この方法をご教示頂けませんでしょうか。

A 回答 (5件)

おひさしぶりです himinana さん


今回の件は少々処理が長いのである程度小分けにしています。
まず事前の説明をします。


(1)有効期限の日付を入力しておいて、その日が来るとマクロが実行される方法
まずこれはマクロ内記述した方が良いでしょう。
わざわざこれのためにシートロックする必要はありません。
VBAのプロジェクトのロックは後で記述します。


(2)有効期限が来たら自動的にマクロが実行される方法
Thinworkbookからopenイベントを使用します。
開くたびに特定の関数でチェックします。


(3)マクロでシートを削除する方法
VBAで普通に削除できます。マクロの記録でもマクロは生成されるはずですが…?
何かシート再生する必要があるのでしょうか?あれば言ってください。
フォーマットシートをマクロ上から生成するなど方法はいくらでもあると思います。
ちなみに全てのシートを削除はしません。またその必要も無いでしょう。


(4)上書き保存するマクロ
これもVBAで普通に保存できます。マクロの記録でもマクロは生成されるはずですが…?


(5)シートを表示させるマクロ
事前にそのシートがないのであれば生成すればいい。ただそれだけです。
もしもそのシートがあるならばそのシートに切り替えるだけです。
まぁ事前にこんなシートあっても困るので今回は作成の方向でいきます。


(6)マクロを見れないようにする方法
--------------------------------------------------------------------------------
VBE(Microsoft Visual Basic)を開く
--------------------------------------------------------------------------------
ツール(T)
VBAProjectのプロパティ(E)
保護 タブを選択する
プロジェクトのロック[プロジェクトの表示を用にロックす(V)]の部分にチェックを入れる
プロジェクトのプロパティ表示のためのパスワード を入力
--------------------------------------------------------------------------------
上記を行えばパスワードがわからない限りマクロを削除されると事はおろか
読まれることすらありません。


(7)パソコンの日付の操作の対処
システム日付変更への対処は正直面倒です。
仮に私がその方法を書いたところで理解は難しいでしょう。

レジストリとAPIをマスターしましたと言うのなら考えます。
多少悪質ならば外部ファイルを相手のわかりづらい所に設置しタイムスタンプを作成し
しておく方法もあります。指定日以降以外の日付がくればタイムスタンプを作成しておく
ことで使用できなくなります。
ですが根本対策ではなく、またいい使い方とも言いがたいでしょう。


では以下を回答として提示します。
※以下は必ずVBE上のThinworkbookの中に書き込んでください。





Private Sub Workbook_Open()
endsheetname = "有効期限切れ" '#有効期限切れ時のシート名
If Date >= "2008/09/10" Then '#有効期限切れの日付
Application.DisplayAlerts = False

'#有効期限切れの作成
If Sheets.Count = 1 Then
If Sheets(1).Name <> endsheetname Then
Sheets.Add(After:=ActiveSheet).Name = endsheetname
End If
Else
On Error Resume Next
Sheets(endsheetname).Delete
On Error GoTo 0
Sheets.Add(After:=ActiveSheet).Name = endsheetname
End If

'#有効期限切れのシート以外削除
sheetnumber = Sheets.Count
For i = 1 To sheetnumber
For j = 1 To 2
If Sheets.Count = 1 Then Exit For
If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For
Next
Next
Range("a" & 1).Value = "有効期限が来ましたので、再度お申し込みください。"
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
End Sub






どうですか?動かしてみましたか?条件は満たされたはずです。
有効期限以外の場合「有効期限が来ました」シートを除き全てのシートが削除されたでしょう?

追加処理・処理違い・補足等あればいってください。
    • good
    • 0

(1)有効期限の日付を入力しておいて、その日が来るとマクロが実行される方法


>TODAY関数と有効期限の引き算でゼロになったら実行でしょうか。
方法はいくつかあると思いますが、お考えの方法でも十分可能だと思います。
ただ、ゼロになったら・・・よりもゼロ以下になったら・・・の方がいいかもしれません。

>該当セルの数値がゼロになったらマクロが実行されるという方法をお教え頂けませんか。
マクロは基本的にエクセルのファイルを開いた状態で実行されると考えておいていいので、
実行する方法としては、
メニューバーからマクロを選んで実行
フォームやオートシェイプなどでボタンを作って(そこにマクロを登録しておき)マウスでクリックして実行
任意の特定のセルを(入力など)編集した時に実行
任意のセルを選択(クリック)したときに実行
ファイルを開いた時に自動実行・・・・・・などがあります。
したがって、該当セルの数値がゼロになる状況になっても、ファイルを開かないことにはマクロは実行されません。
TODAY関数も、ファイルを開いたときに当日の値を取得しているようです。

(2)有効期限が来たら自動的にマクロが実行される方法
>上記(1)の方法でやれば、ファイルを開いたとたんマクロが実行されるのでしょうか。
ファイルを開いた時に自動実行するマクロを設定しておき、その中に有効期限云々の条件を付けておけばそういう事も可能です。
"有効期限が来たら"っと言う条件でマクロの実行を変化させる場合は、VBAの記述の中に、IF・・・Then.....End IF という書き方で指定します。
IFの後に条件(TODAY関数と有効期限の引き算でゼロ)Then
メッセージを表示して、不要シートを削除して保存する
End IF
こういった内容で、VBAの記述方法に従って指定します。
IF・・・Then.....End IF はマクロの記録では記録出来ませんので、VBEを使ってご自身で入力・編集することになります。
IF・・・Then.....End IFについては、VBEのヘルプファイルや、WEB上のエクセル関連のサイトを検索して情報を探してみてください。

(3)マクロでシートを削除する方法
>これは、通常のマクロの記録でやろうとすると・・・・シートがなくなっちゃった状態でしか保存できない気がするのですが・・・。
マクロで削除してそのまま上書き保存すれば、当然そういう結果になります。


(4)上書き保存するマクロ
>上記(3)と同様、マクロの記録ではできないので、これ以外のやり方をお教え頂けませんか。
ワークシートの削除や上書き保存はマクロの記録でも可能だと思います。
・・・・っが!質問者の言いたいことは、こうでしょうか?
マスターファイル(例えば"今月の記録"という名前)に必要なデータを入力していき、月末が来たらその旨マクロで表示した上で、不要シートを削除して九月分・十月分・・・・・・と各月ごとに保存していく。
ファイルを保存したら翌月分は又マスターに記録していき・・・・・・・これを繰り返していく。
この場合はマスターファイルのワークシートを削除して上書きしたら、翌月分は記録出来なくなるでしょう。
なので、ワークシートを削除するなどの処理をしたファイルは、別の名前を付けて保存することになるでしょう。
これをマクロでやることも可能だと思いますが、作業の性格上はマスターファイルに翌月分を入力する段階ですでに保存用の名前に変更しておく方がいいでしょう。
とりあえずそれは手作業で名前を付けてやることにして、現状では次への課題としてだけ考えておいた方がいいかもしれません。
しいて言えば、ワークシート関数でファイル名を取得することは可能ですので、期限を過ぎたらマクロを実行という条件のほかに、マスターファイルと違うファイル名なら実行するという条件を付けておけば何とかなると思います。

(5)シートを表示させるマクロ
>マクロを実行した時点で「有効期限が来ました・・」と入力されたシートを表示させたいのです。
マクロで表示させる方法をお教え頂けますでしょうか。
任意のシートの任意のセルにそのように表示しておき、マクロの記録でそのシートの表示範囲を選んでやれば記録されます。
要は不要シートの削除と同じで、その削除の部分を記録しなければいいのです。

(6)マクロを見れないようにする方法
(7)パソコンの日付の操作の対処
当然、そのような可能性はあります。
それを防ぐには、まず相手よりも質問者がエクセルに精通しなくてはならないでしょう。
簡易的に防止効果がありそうなストッパー的なものなら、なんとかなるかもしれませんが、それでも現状の質問者のスキルを推測するとそこまでは今対処出来なのではないかと思います。

将来を見据えたファイル設計は必要なことだとは思いますが、一度にアレも!コレも!では、前に進めなくなるだけだと思います。
今は、マクロについて基本から学んでいき。"期限が来たら自動的にメッセージを表示"の部分を実現させることを考えてやって、それが出来たら次の段階へ・・・・・・として、最終的にはマクロの削除や日付の変更に対応できるような所を目指すようにしてはいかがでしょうか?
VBEのヘルプファイルや、WEB上のエクセル/マクロの解説サイトをチェックしていけば、ある程度のことまでは出来るようになると思います。
まずは、IF・・・Then.....End IF と MsgBox について調べてみてください。
この二つがわかるようになって、組み合わせてもできるようになれば、期限がきてメッセージを表示→ワークシートを削除する までは難しくなくなるでしょう。
    • good
    • 0

耳が痛いでしょうが・・・ あえて書かせていただきます。



基本的にご自分の思う機能のマクロを作成するための技量が、まだ不充分であろうと思われます。
まずはマクロを勉強することから始めましょう。
ご質問のテーマを完成させることを目標に、題材設定するのもよろしいかと思いますが、まずは基本的なことを覚えなければ、現状のままではまともなものを『完成』させることは難しいと想像されます。(勝手な想像ですので、まったくのはずれだったら申し訳ありません)

VBA(MS関連ソフトのマクロ)に関しては、ネットのいろいろなサイトでも情報が得られますし、とりあえずの解説はエクセルのマクロのヘルプにも相当の情報があります。(もちろんマクロの例も相当量あります)
もう少しとっつきやすいものでしたら、書籍にも多くのものがあるでしょうから、基本的なしくみ(マクロをどうやって作成するのか)や構文、文法などの概念を理解することをお薦めします。

1)期限日に実行するというものを作るのは大変です。(その日に電源が入っていなかったら動きません)通常はあるタイミングで(例えばブックを開いたらなど)日付をチェックして期限日を過ぎていたら実行するという考え方をとるでしょう。
2)期限日ではありませんが、イベントを利用することで1)のようなことは可能です。
3)Deleteメソッドで可能です。 Worksheets(シート名).Delete など
4)質問の意味が不明ですが、保存はSaveメソッドで。 Workbook.Save など
 (マクロを編集する方法は下に記します。)
5)表示させるだけならActivateで。 非表示にしている場合はその前に表示状態に戻す手順が必要。
6)マクロをコンパイルしておく、VB化するなどが考えられますが、ファイルである以上エディターなどでは開くことが可能です。
7)正しい時間を得る方法として、NTPなどでネットワークを介して確認する方法がありそうですが、エクセルマクロの域を越えているような気がします。

回答をしてみたものの、どこまで参考になるかは不明です。
(ANo1様がご指摘の根本的な疑問をどうするかという問題も残りますね)

エクセルをご使用のようなので、「ツール」-「マクロ」-「Visual Basic Editor」を開いて、適当なモジュール(Module1かな?)を見てみると、そこに自動記録されたマクロが記されているはずです。
ここに書かれている文章(?)が処理の内容を記したもので、これを適切に記すことにより、実行した時に目的の処理がなされることになります。
Editorとはこの命令群(コード)を編集するためのソフトですので、自由にマクロを編集することが可能です。
いろいろ実験して、理解を深めてください。
    • good
    • 0

調べ方を覚えたほうがよいです。



(3)~(6)はこのあたりで解決できると思います。
思い通りの結果になるかはわかりませんが。
http://www.happy2-island.com/excelsmile/smile03/ …
http://www.happy2-island.com/access/gogo01/capte …

(1),(2),(7)は日付関数とシリアル値を覚えて工夫しましょう。
http://excelvba.pc-users.net/func/func4.html
http://exinfo.biz/func/func_datehour.shtml

なぜ有効期限が必要なのかはわかりかねますけど。。
    • good
    • 0

Bookを開いた時にマクロを無効にされてしまったら?


と言う疑問が。。。
    • good
    • 0

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