この人頭いいなと思ったエピソード

制限をかけたExcelファイルの、あるセルにNOW関数で開いた時刻を表示させていますが、読取専用で開いてもその時点の時刻が表示されてしまいます。最終更新時刻が表示されていると望ましいのですが、VBAでクローズ時の時刻を更新するような手立てしかないでしょうか?(それすらできるかどうかは不明ですが・・・)

 1. 保存時にのみ現在時刻をセルに更新することが可能か?
 2. 1がVBAで可能とした場合、読取専用では強制的にマクロ無効とできるか?

要は、読取専用で最終更新時刻が分かるようにしたいのです。NOW関数だと開いた時刻となってしまい、いつが最終更新か分からず、更新時に手入力で時刻更新だとミスもあるだろうから自動でできないか?ということです。

VBAにすると知識の浅い者から、開いた場合のセキュリティ警告画面で質問されることも考えられるので強制無効が可能ならばベター、それ以前に関数で対応できればベストだと思われます。

よろしくお願いします。

A 回答 (4件)

残念ながらブック(ファイル)の最終保存日時(最終更新日時)を取得するワークシート関数はないですね。


しかし、VBAでユーザー定義関数を作ってしまえば、ワークシート上にそのファイルの最終保存日時を表示させることが可能になります。

標準モジュールに以下のコードを貼り付け、最終更新日時を表示させたいセルで
=LastSaveTime()
と入力してください。そのままではシリアル値が表示されるので、[セルの書式設定]でご希望の時刻表示に設定をしてください。

Function LastSaveTime()
LastSaveTime = ThisWorkbook.BuiltinDocumentProperties("Last save time").Value
End Function

なお、ファイル単位でマクロを強制無効にしたり強制有効にすることは出来ません。あくまで各端末のセキュリティ設定によります。

あるいはマクロは使わずに、ショートカットキーにより時刻をダイレクトに入力することが可能です。

[Ctrl] + [;] … 現在の日付を入力
[Ctrl] + [:] … 現在の時刻を入力

参考まで。
    • good
    • 0
この回答へのお礼

的確なアドバイスをありがとうございます、非常にスマートですね。以下のような力技で対処しましたが、こちらのほうがスッキリとしているので有難いです。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error GoTo now_error
  now1 = Cells(1, 1).Value2
  now2 = Cells(1, 6).Value2

  If now2 > now1 Then
    Cells(1, 1).Value2 = now2
  Else
    Exit Sub
  End If

now_error:
  Exit Sub
End Sub

ちなみに読取専用時で、ファイルメニューの「上書き保存」「別名保存」を使用不可にはできないのでしょうか?そうすれば、複製ファイルを作られなくってうれしいのですが・・・。

お礼日時:2009/04/17 17:22

何度もすみません。

merlionXXです。

先ほど(No3)のコードにくわえ

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub

も入れておくと、終了時に「保存しますか?」と聞いてこなくなるので読取専用ファイルを別名保存させたくない場合には便利かと思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなってすみませんでした、しばらくWebへ接続できない環境でしたので・・・。

今回は目的ファイルの共有を見合わせたため、このコードは次回の参考にさせていただきます。丁寧な解説をありがとうございました。

お礼日時:2009/06/13 21:51

merlionXXです。



> ちなみに読取専用時で、ファイルメニューの「上書き保存」「別名保存」を使用不可にはできないのでしょうか?そうすれば

ファイルが読取専用の場合、上書き保存はもともとできませんから「別名保存」を不可にします。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If ThisWorkbook.ReadOnly Then
Cancel = True
MsgBox "保存できません!", vbCritical, "Sorry!!"
End If
End Sub
    • good
    • 0

こんにちは


難しいですね。どうやっても誤操作されたらお釈迦ですから。
更新時のみファイルを保存するという運用が確実に出来るなら、マクロを使うやり方で、OSから最終更新日時を得る方法がある話しを聞いたことがあります。
確かFileSystemObjectのFileオブジェクトでプロパティDateLastModified で出来ると。
でも、私は使ったことがありませんので詳細は判りません。
このメッセージでお判りになる方がいらっしゃったらフォローお願いいたします。
    • good
    • 0
この回答へのお礼

アドバイスをありがとうございます。

別手段で最終更新時を取得させることはできるのですが、保存時に難があります。さて困りましたね・・・。

お礼日時:2009/04/17 16:53

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

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


おすすめ情報