システムメンテナンスのお知らせ

Microsoft Excelについて、エクセルファイルをそのエクセルファイル内のマクロで削除する方法がありましたら教えてください。
ファイルを削除させなくても、記述したマクロコードだけ削除させるのでよいです。

自分で作成したマクロ入りエクセルファイルを他人にお試しとして提供することを考えています。お試しなので、ある期限になったら自動で削除させたいと思っています。

すみませんが、どなたかわかるかたがいましたらお願いします。

gooドクター

A 回答 (5件)

追記。



ANo.4の方法での自己消滅は、エクセルのファイルそのものを消去するので、慎重にテストして下さい。うっかり「オリジナルファイル」を削除してしまわないように(回答の投稿の前にテストで削除が実行されてしまい、マクロを最初から書き直ししたウッカリさんがここに居ます)

なお、何をしているかと言うと

1.使用期限切れの日付をチェック

2.エクセルファイルが消えるまで、繰り返してデリートを試みて、エクセルファイルが消えたら自分自身も自己消去するバッチファイルを生成

3.使用期限の警告を表示

4.上記2で生成したバッチファイルを、非表示モードで実行

5.自分自身のエクセルファイルファイルを閉じる

と言う処理をしています。

エクセルファイル自身は、自分自身が開かれている限り自分自身を削除できませんが、バッチファイルは「実行中の自分自身を削除可能」なので、エクセルファイルとバッチファイル自身の削除をバッチファイルで行っています。
    • good
    • 3

ThisWorkbookのOpenイベントに以下のコードを仕込むと、2014/12/23日になった時点で、開いた時に警告を出してから自己消滅します。



Private Sub Workbook_Open()
Dim ofn As String
Dim bfn As String
If Now() >= #12/23/2014# Then
ofn = ThisWorkbook.FullName
bfn = ofn & ".bat"
Open bfn For Output As #1
Print #1, "@echo off"
Print #1, ":loop"
Print #1, "del """ & ofn & """"
Print #1, "if exist """ & ofn & """ goto loop"
Print #1, "del """ & bfn & """"
Close #1
MsgBox "使用期限切れの為、使用できません"
Shell """" & bfn & """", vbHide
ThisWorkbook.Close
End If
End Sub

以前の回答にある「VBAコードの表示用にパスワードを付ける」と併用すると、コードを見られなくなるので、時限爆弾を回避する事はできません。

なお、起動時に「マクロを無効にする」を選ばれた時は上記の時限爆弾は機能しませんが、他のマクロも動かないなら実用にならないので、問題は無いでしょう。
    • good
    • 7
この回答へのお礼

ご回答ありがとうございます。
確かに、マクロを無効にしてたら、マクロの機能は働かないですね。

お礼日時:2014/12/28 18:11

こんにちは。



>エクセルファイルをそのエクセルファイル内のマクロで削除する方法
通常は、Windows Rights Management[WRM] で期限付きファイルにしてしまいます。
それが、正規の方法だと思います。

しかし、いわゆる「自爆マクロ」は、以下のようにして、可能だと思います。

>記述したマクロコードだけ削除させるのでよいです。

以下は、"Module1" を完全に消してしまいます。これは、乱用禁止のマクロです。(むろん、マクロが動くことが条件です)

また、1 は不要だと思いますが、2.は不可欠です。
1.VBEにおいてMicrosoft Visual Basic for Applications Extensibilityへの参照を追加する。
2.「VBAプロジェクト オブジェクトモデルへのアクセスを信頼する」オプションのセキュリティセンターを指定する。

つまり、1がネックになってしまいます。
その1をオンにしていないと、
 
 実行時エラー [プログラミングによる Visual Basci プロジェクトのアクセスは信頼に欠けます]
 
というエラーが出ます。

1.をマクロでオンにすることはおそらくは可能ですが、非公開の禁断のテクニックです。


'//
'Module1 にこのマクロを置きます。

Private Const LIMIT_DATE As Date = #12/19/2014#

Sub Auto_Open()
 If Date = LIMIT_DATE Then
  Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbookSave" '*
  Call DeleteModule
 End If
End Sub
Sub DeleteModule()
With ThisWorkbook.VBProject.VBComponents
 .Remove ThisWorkbook.VBProject.VBComponents("Module1")
End With
End Sub

'Module2 (以下はなくても良い、その場合は、[*]のコードを抜く)
'これは、変更が加えられたことを気づかせないためのマクロ

Private Sub ThisWorkbookSave()
  ThisWorkbook.Save
  ThisWorkbook.Saved = True
End Sub

'//

[テスト済み]起動とともに、日付が合えば、削除します。
他にも、おそらく、かなり古いテクニックを使って、自分自身のファイルを削除するマクロは可能だと思います。想像だけで、やったことはありません。もう、そうなるとウィルスを作るようなものです。
    • good
    • 1
この回答へのお礼

Windows Rights Management[WRM]期限付きファイルを知らなかったので、早速色々と調べてみます。
正規な方法でできれば、この方法を活用したいと思います。

お礼日時:2014/12/22 12:43

開いた状態でそのファイルの削除はできません(自分自身の削除はできない)



一旦名前をつけて保存で同名のファイル名でマクロなしエクセルブックとして保存
次に元になっているマクロ付きのファイルを削除(ゴミ箱にも残らない完全削除)
その後Excel終了

これで残るのはマクロの入っていないファイルになるはずです
(但しマクロ入りで復活させる方法もないわけではない)
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
ゴミ箱にも残らない削除もできるのですね。

お礼日時:2014/12/28 18:10

http://www.happy2-island.com/excelsmile/smile01/ …
に従ってマクロを見られない状態にすれば、マクロのコードを見るのにパスワードが必要になります。

「見れない状態」であれば、削除する必要は無いし、パスワードさえ漏らさなければ流用される事もありません。

因みに「マクロ実行中のエクセルのブック」は「ファイルが排他モードでオープンされている」ので、自分自身のブックファイルを削除しようとすると「アクセス違反」でエラーになり、削除は不可能です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
マクロ実行中のブックでは、ダメなのですね。参考になりました。

パスワードという選択肢も考えたのですが、「パスワードさえ漏らさなければ」ということが少し問題になって、削除できればと考えました。

お礼日時:2014/12/22 12:39

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング