プロが教える店舗&オフィスのセキュリティ対策術

EXCELのファイルを閲覧のみにしたいので、
[上書き保存]、[名前をつけて保存]等を禁止にするため、
以下のようにマクロを作成しようとしました。

EXCELマクロ、Workbook_BeforeSaveで、Cancel=Trueのコードを追加。

しかし、このマクロを入れるとこのブック自体が保存できないんです。
どうすればよいでしょう?

A 回答 (10件)

> やろうとしている、「Workbook_BeforeSaveで、Cancel=True」は、


> もともと前任者入れていたマクロなので、保存する方法があるはず
> なんでしょうけど・・・

以下の手順なんていかがでしょうか。

1. Cancel=Falseと書いておいて、そこにブレークポイントを設定する
2. 保存操作をすると、Cancel=Falseで一時停止する
3. F8キーを一度押す
4. Cancel=FalseをCancel=Trueに書き換え、ブレークポイントを解除する
5. F5キーを押して、保存操作を継続する
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/11/05 11:41

念のため追記しておきます。


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

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

お礼日時:2008/11/07 14:20

>保存して開くとプロテクトがかかってない状態に戻ります。


はて?...

冒頭に書いたように
>'ThisWorkbookModule
>Option Explicit
ThisWorkbookモジュールに提示のコードを置けば、
マクロ無効で開いたり、Application.EnableEventsでイベントを制御しない限り、
Workbook_Openイベント、つまりBookを開くイベントで設定されます。
再度確認してみてください。

それとも
>EXCELファイル作成をVisual Basic6.0でやってるんで、
これが関係してるのですかね?
その場合、詳細不明なので追加アドバイスできないですよ?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/07 14:18

本題とハズれますが


>「シートの保護」「ブックの保護」をすると、フィルタが使えなくなっちゃうんです。
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ファイル )
    • good
    • 0
この回答へのお礼

end-uさん、ありがとうございます!
すみません、言い忘れました。
EXCEL2000で使用する場合もあります。

やってみました。
    .EnableAutoFilter = True
    .Protect UserInterfaceOnly:=True
の状態でバッチリなんですが、保存して開くとプロテクトがかかってない状態に戻ります。
この状態を保存することはできないんでしょうね。

お礼日時:2008/11/05 14:40

気になったのですが、マクロで保存できないようにした場合、マクロを無効にして開いてしまえば改ざんし放題になってしまいます。


前任者もおそらくマクロ無効の状態で「Workbook_BeforeSaveで、Cancel=True」のコードを書いて保存したのではないでしょうか。

改ざんを絶対に許さないならフィルタを諦めてPDFで配布する方がよろしいかと。
うっかり上書きを防ぎたいと言う程度でしたら、ファイルのプロパティを読み取り専用にするだけで十分ではないでしょうか。

この回答への補足

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

補足日時:2008/11/05 12:28
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/05 12:27

一旦終了して、マクロを無効にして再度立ち上げて


Workbook_BeforeSaveで、Cancel=Trueを記入して保存終了したらいいのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/05 12:25

補足です。



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式に組み込めば、どちらかが一致した場合に保存を強制キャンセルするので、今日の指定時間以降、または明日以降は保存を禁止できるようになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/05 11:38

こんなのはどうでしょう?



Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
    Cancel As Boolean)
If Date > #11/5/2008# Then
Cancel = True
End If
End Sub

つまり、今日中は保存できるけど、明日からは保存できないってことです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/05 11:33

いい方法を思いつきました。



If InStr(ActiveWorkbook.Name, ".") >= 1 Then
Cancel = True
End If

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

この回答への補足

ありがとうございます!
やってみましたが、だめです~
EXCELを作成する際、もともと罫線の入ったベースのEXCELファイルをコピーして作るため、新規作成じゃないんです!
でも、いいヒントになる気がします。考えて見ます!

やろうとしている、「Workbook_BeforeSaveで、Cancel=True」は、
もともと前任者入れていたマクロなので、保存する方法があるはずなんでしょうけど・・・

補足日時:2008/11/05 11:00
    • good
    • 0

「シートの保護」「ブックの保護」ではダメなんですか?


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

この回答への補足

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

補足日時:2008/11/05 10:40
    • good
    • 0

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