• ベストアンサー

EXCELマクロ 保存禁止させるには?

EXCELのファイルを閲覧のみにしたいので、 [上書き保存]、[名前をつけて保存]等を禁止にするため、 以下のようにマクロを作成しようとしました。 EXCELマクロ、Workbook_BeforeSaveで、Cancel=Trueのコードを追加。 しかし、このマクロを入れるとこのブック自体が保存できないんです。 どうすればよいでしょう?

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

  • ベストアンサー
  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.5

> やろうとしている、「Workbook_BeforeSaveで、Cancel=True」は、 > もともと前任者入れていたマクロなので、保存する方法があるはず > なんでしょうけど・・・ 以下の手順なんていかがでしょうか。 1. Cancel=Falseと書いておいて、そこにブレークポイントを設定する 2. 保存操作をすると、Cancel=Falseで一時停止する 3. F8キーを一度押す 4. Cancel=FalseをCancel=Trueに書き換え、ブレークポイントを解除する 5. F5キーを押して、保存操作を継続する

Yocha
質問者

お礼

やってみました! できました! ありがとうございます! すごい! kawais070さんありがとうございます!

その他の回答 (9)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.10

念のため追記しておきます。 あくまで本題とハズれた、Excel2000でAutoFilter許可してのシート保護方法です。 この場合、データ改ざんに関しては、一般操作での抑止のみです。 .Protect UserInterfaceOnly:=True にしていますから、マクロでの変更が可能になります。 ファイル自体に書込みパスワードを設定するほうが現実的でしょう。

Yocha
質問者

お礼

ご丁寧にありがとうございます。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.9

>保存して開くとプロテクトがかかってない状態に戻ります。 はて?... 冒頭に書いたように >'ThisWorkbookModule >Option Explicit ThisWorkbookモジュールに提示のコードを置けば、 マクロ無効で開いたり、Application.EnableEventsでイベントを制御しない限り、 Workbook_Openイベント、つまりBookを開くイベントで設定されます。 再度確認してみてください。 それとも >EXCELファイル作成をVisual Basic6.0でやってるんで、 これが関係してるのですかね? その場合、詳細不明なので追加アドバイスできないですよ?

Yocha
質問者

お礼

ありがとうございます。 お礼が遅くなってごめんなさい。 VB6にて設定したため、保存できないのかもしれません。 マクロに入れてみます。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.8

本題とハズれますが >「シートの保護」「ブックの保護」をすると、フィルタが使えなくなっちゃうんです。 Excel2002以降はAutoFilter使用を許可できますから、2000が混在しているのですね? その場合、以下のような感じでAutoFilterを許可してシート保護をかけます。 'ThisWorkbookModule Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean)   On Error Resume Next   '追加したControlを削除   Application.CommandBars("Cell").Controls("AutoFilter").Delete   On Error GoTo 0 End Sub '------------------------------------------------- Private Sub Workbook_Open()   'セル右クリックメニューに"aFilter"追加   With Application.CommandBars("Cell") _           .Controls.Add(Type:=msoControlButton, _                  Before:=1, _                  Temporary:=True)     .Caption = "AutoFilter"     .OnAction = "ThisWorkbook.aFilter"   End With   '[EnableAutoFilter]プロパティとProtect引数[UserInterfaceOnly]を設定 _    各シートごとに必要   With Sheets("sheet1")     .Unprotect     .EnableAutoFilter = True     .Protect UserInterfaceOnly:=True   End With End Sub '------------------------------------------------- Private Sub aFilter()   On Error Resume Next   Selection.AutoFilter   On Error GoTo 0 End Sub 参考まで。 #マクロ無効化対策の必要があれば、以下のページを参考にすると良いかもしれません。 http://homepage2.nifty.com/kmado/kvba.htm (ここの E00M090 [マクロを無効にする]で開くと使えないxlsファイル )

Yocha
質問者

お礼

end-uさん、ありがとうございます! すみません、言い忘れました。 EXCEL2000で使用する場合もあります。 やってみました。     .EnableAutoFilter = True     .Protect UserInterfaceOnly:=True の状態でバッチリなんですが、保存して開くとプロテクトがかかってない状態に戻ります。 この状態を保存することはできないんでしょうね。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.7

気になったのですが、マクロで保存できないようにした場合、マクロを無効にして開いてしまえば改ざんし放題になってしまいます。 前任者もおそらくマクロ無効の状態で「Workbook_BeforeSaveで、Cancel=True」のコードを書いて保存したのではないでしょうか。 改ざんを絶対に許さないならフィルタを諦めてPDFで配布する方がよろしいかと。 うっかり上書きを防ぎたいと言う程度でしたら、ファイルのプロパティを読み取り専用にするだけで十分ではないでしょうか。

Yocha
質問者

お礼

ぐう~ EXCELのフィルタ機能さえいらなければ、PDFが一番でしょうね。 読み取り専用にはしてるので、このままでいいことにしよっかな?

Yocha
質問者

補足

お礼欄でお礼を言うのを忘れてしまった。 すみません。 ありがとうございます、mt2008さん。 みなさんのお知恵はすごいです!

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

一旦終了して、マクロを無効にして再度立ち上げて Workbook_BeforeSaveで、Cancel=Trueを記入して保存終了したらいいのでは?

Yocha
質問者

お礼

できました! でも、今気づいたんですが、 EXCELファイル作成をVisual Basic6.0でやってるんで、 みなさんにいただいた回答ではダメかも。 VBから操作できる方法なにか考えてみます。 ありがとうございます、merlionXXさん。 ありがとうございます、みなさん。

  • qualheart
  • ベストアンサー率41% (1451/3486)
回答No.4

補足です。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If Date > #11/5/2008# Or Time > #11:15:00 AM# Then Cancel = True End If End Sub のように時間もIF式に組み込めば、どちらかが一致した場合に保存を強制キャンセルするので、今日の指定時間以降、または明日以降は保存を禁止できるようになります。

Yocha
質問者

お礼

おお、すばらしい。 qualheartさんありがとうございます! 助かりました。

  • qualheart
  • ベストアンサー率41% (1451/3486)
回答No.3

こんなのはどうでしょう? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _     Cancel As Boolean) If Date > #11/5/2008# Then Cancel = True End If End Sub つまり、今日中は保存できるけど、明日からは保存できないってことです。

Yocha
質問者

お礼

ありがとうございます! これでいけるかも。

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.2

いい方法を思いつきました。 If InStr(ActiveWorkbook.Name, ".") >= 1 Then Cancel = True End If Excelのブックは、最初に保存される前は、拡張子無しの "Book1" という名前でして、保存されると、"Book1.xls" となります。 そこで、ブックの名前に "." が含まれているか否かで 判定をすれば、2度目以降の保存ができなくなるという 感じです。 閲覧のみにしたいファイルを開いて、新規のブックにコピーし、 上記のマクロを仕込んだ上で保存をすれば、二度と保存できない ファイルのできあがりとなります。

Yocha
質問者

補足

ありがとうございます! やってみましたが、だめです~ EXCELを作成する際、もともと罫線の入ったベースのEXCELファイルをコピーして作るため、新規作成じゃないんです! でも、いいヒントになる気がします。考えて見ます! やろうとしている、「Workbook_BeforeSaveで、Cancel=True」は、 もともと前任者入れていたマクロなので、保存する方法があるはずなんでしょうけど・・・

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.1

「シートの保護」「ブックの保護」ではダメなんですか? マクロで保存を禁止したところで、ファイル自体をエクスプローラを 使ってコピーすることは可能だし、あまり意味があるとは思えないの ですが…

Yocha
質問者

補足

すばやい回答ありがとうございます。 説明不足でした、すみません。 フィルタ用のボタンをつけているので、 「シートの保護」「ブックの保護」をすると、フィルタが使えなくなっちゃうんです。 エクスプローラーを使ってコピーするのはかまわないんですが、 データの改ざんができないようにしたいのです。

関連するQ&A