[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ReadOnly → (強制)Save』(新入生)
D:\TEST.xls があります。
こちらは「読み取り専用を推奨する」にチェックが 入った状態で保存されています。
この「読み取り専用」を YES で開こうと NO で 開いていようと
Sheet1 の A1 セルに 今日の日付 を入力し、 上書き保存し、 読み取り専用の状態にする
というマクロを作るにはどのようにすれば 良いでしょうか?
よろしくお願い致します。
WindowsXP,Excel2003
ワークブックのモジュールに Private Sub Workbook_Open() If ActiveWorkbook.ReadOnlyRecommended = True Then ActiveWorkbook.ReadOnlyRecommended = False End If Me.Sheets("Sheet1").Range("A1").Value = Now Me.Sheets("Sheet1").Range("A1").NumberFormatLocal = "yyyy/m/d;@" ThisWorkbook.Save ActiveWorkbook.ReadOnlyRecommended = True End Sub 上記を貼り付けてみて
早速ご教示頂いたのに、説明不足で本当に 申し訳ありません。
「開く時に」ではなく、「既に開いている 状態で、任意のタイミングで TODAY を 記録したい」と考えております。
重ねて恐縮ですが、どうぞよろしくお願い 致します。
(新入生)
対象のブックをbook1.xlsだとすると
対象ブックを同じフォルダ上に別名で保存する(仮にtmp.xls) book1.xlsを削除する tmp.xlsのSheet1 の A1 セルに 今日の日付 を設定する これをbook1.xlsとして、読取専用を推奨するに設定して保存する book1.xlsのブックのアクセス権を読取専用に変更する(ChangeFileAccessメソッド) tmp.xlsを削除する
こんな手順でVBAコードを作成してみては?
ichinose
ichinose さん
アドバイスありがとうございました。 都度“作り直す”ということでしょうか。思いつきも しませんでした。それで対応することにします。
もうひとつご教示頂けるでしょうか。 最初にアドバイス頂いた
If ActiveWorkbook.ReadOnlyRecommended = True Then ActiveWorkbook.ReadOnlyRecommended = False
との一文を入れて試してみたのですが、 これですと 「読み取り専用で開きますか?」と聞かれてしまいます。 このメッセージを出さずに NO で開く方法があったら お教え下さい。
よろしくお願い致します。
(新入生)
すみません。
色々試していて間違えました。
> 読み取り専用で開きますか?」と聞かれてしま うのは、
If ActiveWorkbook.ReadOnly Then ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True
でした。
どうぞよろしくお願い致します。
(新入生)
読み取り専用を推奨するで作成されたブックは、
ChangeFileAccess Mode:=xlReadWrite
で 読み取り専用にしていた間に変更された部分がないことを確認するために、ファイルが改めて読み込まれます。 よって、読み取り専用で開きますか? というメッセージが表示されるのですが・・・。
前回投稿した手順で行う限り、 ChangeFileAccess Mode:=xlReadWrite このメソッド(書き込み可能にする)は、不要ですがねえ・・・。
考えているコードを全部掲載してください。
ichinose
ichinose さん
ありがとうございます。
> 考えているコードを全部掲載して 〜
−−−−−−−−−−−−−−−−−−−−−−
Sub TEST()
If ActiveWorkbook.ReadOnly Then ActiveWorkbook.ChangeFileAccess Mode:=xlReadWrite, Notify:=True
Sheets("Sheet1").Range("A1").Value = Date
ActiveWorkbook.Save
ActiveWorkbook.ReadOnlyRecommended = True
End Sub
−−−−−−−−−−−−−−−−−−−−−−
上記でできれば良いな、とも考えておりますが、 前述の通り、一行目で >>「読み取り専用で開きますか?」と聞かれてしまいます。 >> このメッセージを出さずに NO で開く方法があったら ご教示頂けますようお願い致します。
(新入生)
>変更された部分がないことを確認する 自分で記述していて今更ながら気が付きました。 読取専用で開いた時は、それまでの変更は、保存したくない 書き込み可のときは、それまでも変更も保存するでしたね!!
そうなると、手順が少し違いますねえ が、Mode:=xlReadWriteこれは、必要ないかなあ・・・。 標準モジュールに
'================================================================== Sub test() Dim bk As Workbook Dim ro As Boolean Dim bnm As String bnm = ThisWorkbook.FullName ro = ThisWorkbook.ReadOnly If ro Then Application.DisplayAlerts = False ThisWorkbook.SaveAs ThisWorkbook.Path & "\tmp.xls" Application.DisplayAlerts = True Set bk = Workbooks.Open(Filename:=bnm, IgnoreReadOnlyRecommended:=True) Else Set bk = ThisWorkbook End If With bk.Sheets("sheet1").Range("a1") .Value = Now .NumberFormatLocal = "yyyy/m/d;@" End With bk.Save bk.ChangeFileAccess Mode:=xlReadOnly If ro Then ThisWorkbook.Close False End If End Sub Sub auto_close() On Error Resume Next Kill ThisWorkbook.Path & "\tmp.xls" On Error GoTo 0 End Sub
コード中のテンポラリーファイルtmp.xlsは、実際にはもう少しユニークな名前が よいですねえ!!
これで試してみてください。 因みにReadOnlyRecommendedは、値の取得だけで設定はできませんよ!!
ichinose
ichinose さん
何度もありがとうございます。
> 因みにReadOnlyRecommendedは、値の取得だけで設定はできませんよ!!
すみません(何度目?)。最後の一文は
>> ActiveWorkbook.ReadOnlyRecommended = True
ではなく
ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly
でした。結局
>>> このメッセージを出さずに NO で開く方法
はない、ということですね。考えてみたら 開き直す = 一度マクロもチャラになる(死んじゃう) ってことでしょうから、当たり前のことなのでしょうね。 お恥ずかしい限りです。
ご提示頂いた、一旦“外に逃げて”再度開き直し → 加工 → 保存 → ReadOnly 再設定 → という方法で解決致しました。
tmp.xls (※)は以降残り、それを使いまわす、ということで 全く問題はないのですが、ご提示頂いた Sub auto_close を うまく使うと都度 Kill できるのでしょうか?
※ > 実際にはもう少しユニークな名前がよい 〜
ありがとうございます。 オリジナルの Filename & (複) とかにしてみます。
(新入生)
>提示頂いた Sub auto_close を >うまく使うと都度 Kill できるのでしょうか?
こんな方法もありますねえ
'==================================================== Option Explicit Const tmp = "tmp.xls" Sub test() Dim bk As Workbook Dim ro As Boolean Dim bnm As String bnm = ThisWorkbook.FullName ro = ThisWorkbook.ReadOnly If ro Then Application.DisplayAlerts = False ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & tmp Application.DisplayAlerts = True Set bk = Workbooks.Open(Filename:=bnm, IgnoreReadOnlyRecommended:=True) Else Set bk = ThisWorkbook End If With bk.Sheets("sheet1").Range("a1") .Value = Now .NumberFormatLocal = "yyyy/m/d;@" End With bk.Save bk.ChangeFileAccess Mode:=xlReadOnly If ro Then Application.OnTime Now(), bk.Name & "!auto_close" ThisWorkbook.Close False End If End Sub Sub auto_close() On Error Resume Next Kill ThisWorkbook.Path & "\" & tmp On Error GoTo 0 End Sub
ichinose
ichinose さん
本当にありがとうございました。お陰様で 解決致しました。
「知識」はもちろんですが、それを使いこなす 「思考法 / 知恵」の面でも大変勉強させて 頂きました。
これからもご指導頂けますよう、どうぞ宜しく お願い申し上げます。
(新入生)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.