自分のExcelを読み取り専用で開くVBAは?

このQ&Aのポイント
  • Excelファイルを手動で開くとき、読み取り専用にする方法について質問です。
  • VBAを使用してExcelファイルを読み取り専用で開く方法を探しています。
  • ファイルのプロパティから「読み取り専用」にチェックを入れても、チェックが外れてしまい困っています。VBAで読み取り専用にする方法はありますか?
回答を見る
  • ベストアンサー

自分のExcelを読み取り専用で開くVBAは?

Excel2003を使っています。 基本的なことで恐縮なのですが、 Excelファイルを手動で開くとき、読み取り専用にするような方法はないでしょうか。 ファイルのプロパティから「読み取り専用」にチェックを入れても NASの性質なのか、チェックが外れてしまいます。 (前提として、ここの変更は考えていません) そこで、「読み取り専用を推奨する」にしたのですが、毎回メッセージボックスが出るため 「読み取り専用にしない」を選択される場合もあります。 そのため、VBAにその指示を書き込む方法を探していました。 たとえば、以下のコードを試してみました。 しかし、開いたファイルに指示しているため、当然ながら以下のメッセージが出ます。 "***.xls は既に開いています。2重に開くと、これまでの変更内容は破棄されます。***.xls を開きますか?" Private Sub Workbook_Open() Dim Filename As String Filename = ThisWorkbook.FullName With Workbooks.Open(Filename, , True) .ActiveSheet.Activate End With End Sub 「読み取り専用を推奨する」をオンにして、Workbook.Openの引数である ignorereadonlyrecommended を設定する…というのも、 やはり上記の点で引っかかります。 何か方法はないものでしょうか。。。

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

  • ベストアンサー
回答No.2

>Excelファイルを手動で開くとき、読み取り専用にするような方法はないでしょうか。 マクロが動いていることが前提です。 この元のマクロは、私自身の作ではありませんが、このような方法は使えませんでしょうか。 '// Private Sub Workbook_Open() Dim flg As Boolean With ThisWorkbook    If Not .ReadOnly Then      flg = .Saved      .Saved = True      .ChangeFileAccess xlReadOnly      .Saved = flg    End If  End With End Sub '//

goulden149
質問者

お礼

ご回答ありがとうございます。上記のコード、試してみました。 少し短くできるかと思って、以下も試してみました。 Private Sub Workbook_Open() ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly End Sub すると、以下のメッセージが出ます。 「読み取り専用の切り替えを行う前に、編集内容を保存しますか?」 …ご提示のように、Savedプロパティの設定がポイントかと思いました。 上記だと丸ごと各ファイルに貼って回ってもよさそうですね! こちらを使わせていただこうと思います。 独断ですが、ベストアンサーとさせていただきます。ありがとうございました。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.1

シートの中身を「書き換えさせたくない」のであれば、以下のようにします。 1.書き換えさせたくないセルを選択する。すべてであれば、全セルを選択する。 2.「書式」→「セル」→「保護」タブ→「ロック」にチェックを入れる→「OK」ボタン。 3.「ツール」→「保護」→「シートの保護」→「シートとロックされたセルを保護~」にチェックを入れる→「シートの保護を解除する為のパスワード」に、任意のパスワード文字列を入力する→「OK」ボタン。 4.上記1~3を、すべてのシートに対して行う。 5.「ファイル」→「上書き保存」で、ブック(ファイル)を上書き保存する。 これでオッケーです。xlsファイル(ブックファイル)を、読み取り専用にする必要はありません。 ファイルを開くと、カーソルの位置情報とかが更新されてしまい、閉じようとすると「Book1への変更を保存しますか?」と言うダイアログが出ますが「はい」を押しても「いいえ」を押しても、セルの中身は書き換え出来ません。 以下、蛇足ですが。 xlsファイルは、上記のように「ファイルを開いただけで、内部情報が更新されて、ファイルが『更新あり』の状態にされてしまう」ので、ファイルそのものを読み取り専用(上書き禁止)にしてはいけません。 下手に読み取り専用(上書き禁止)にしちゃうと、上書き保存ボタンを押された時とかに「上書き出来ないから別名保存しろ」と、別名保存のダイアログが出たりして、面倒になります。 なお、ファイルを開いて「上書き保存」をされると、中身は書き換わってないですけど、保存は行われるので、ファイルのタイムスタンプ(更新日時)が書き変わってしまいます(タイムスタンプの更新は避けられません)

goulden149
質問者

お礼

ご回答ありがとうございます。 記し忘れていましたが、この設定を行う各ファイルの中には、 「作業時の書き換えはOKだけど、保存はNG」という、 作業用オンリー(?)にしたいと思っているものがあります。 上記の方法は既に試しておりました。 丁寧なアドバイスをいただき、大変恐縮です。ありがとうございました。 *** >xlsファイルは、上記のように「ファイルを開いただけで、内部情報が更新されて、ファイルが『更新あり』の状態にされてしまう」ので、ファイルそのものを読み取り専用(上書き禁止)にしてはいけません。 他のファイルで何も手を付けていないのに「保存しますか?」と聞かれることがありました。 この疑問が解けました。今後の参考にさせていただきたいと思います。

関連するQ&A

  • VBAでファイルを閉じる時に、他のエクセルファイルを閉じるには?

    VBAで、 Private Sub Workbook_Open() Workbooks.Open FileName:="バス時刻表.xls",ReadOnly:=True End Sub で、バス時刻表.xlsを自動的にオープンした後、 閉じる時に、 Private Sub Workbook_BeforeClose(Cancel As Boolean) Workbooks("バス時刻表.xls").Close End Sub で記述したら、エラーとなります。 どのようにすればいいのでしょうか? よろしくお願いします。

  • VBA フォルダ内の複数Excelファイルを開く

    お世話になります。 XP エクセル2003使用です。 フォルダー内にある複数のすべてのエクセルを開くコードを 下記の解答をそのままコピーして実行しました。 (以下、このエクセルファイルを「実行ファイル.xls」と呼びます) http://okwave.jp/qa/q2598781.html (コードは最後尾に転記(※)) 問題点は、実行ファイル.xlsから実行した 開きたいエクセルファイルは、 Workbook_Open()で自動実行して、 最後に、ThisWorkbook.Closeで閉じるので、 マクロの実行がループの途中(1回目)で 実行ファイル.xls のコードの実行も終了してしますことです。 (実行ファイル.xls のファイルは開いたままです) つまり、ThisWorkbook.Closeでエクセルを閉じたときに マクロの実行までもが終わってしまうので、 実行ファイル.xlsに戻ってきません。 この問題を解決するための方法として 下記2点を調べましたが、力不足で自己解決できません。 --------------------- 1  実行ファイル.xls から開きたいエクセルファイルを開く時に 何かしらの命令文または引数を記述しておく。  → 解決のヒントを見つけることができませんでした。 --------------------- 2 実行ファイルをエクセルではなく、VBS(VBScript)で記述する。 この場合、参考にしたコードを、 VBS用に書き換えれば良いと思いますが、 VBSは記述したことがないので、さっぱりです。 方法として間違っていなければ、 できれば、どなた様か当該コードを VBS用で記述いただけませんでしょうか? --------------------- 一番良い方法が分からないので、 お力添えいただきたいのです。 よろしくお願いします。 --------------------- (※)参考コード --------------------- Sub OpenAllBooks()   Dim FileName As String   Dim OpenedBook As Workbook   Dim IsBookOpen As Boolean      FileName = Dir("*.xls")   Do While FileName <> ""     If FileName <> ThisWorkbook.Name Then       IsBookOpen = False       For Each OpenedBook In Workbooks         If OpenedBook.Name = FileName Then           IsBookOpen = True           Exit For         End If       Next       If IsBookOpen = False Then         Workbooks.Open (FileName)  ←この処理の後に戻ってこれません       End If     End If     FileName = Dir()   Loop End Sub

  • ExcelのVBAでWEBページを開くのが遅い

    よろしくお願いいたします。 現在社内システムのデータをExcelに落とすVBAを作っています。 単純に、 sub test () URL = "http://..." Dim xls As Workbook Set xls = Application.Workbooks.Open(URL) end sub のようなものを作成して実行したのですが、 Set xls = Application.Workbooks.Open(URL) の所で50~60秒ほど時間がかかってしまいます。 もう少し早くする方法はないのでしょうか?

  • エクセルVBAを保存時に消したい

    はじめて質問させて頂きます。 エクセルのVBAを覚え始めたばかりの物ですが、 見積書式を作成し、見積番号をVBAでファイルOPEN時に自動挿入し 名前を付けて保存する時はその見積番号が保存する時にファイル名に なるようにVBAを作成しました。 見積番号の呼び出し方法は 指定フォルダにある(.xls)ファイルの数+1としています。 ここで質問なのですが現状だと保存したファイルにはVBAが存在するので そのファイルの修正をする時マクロの実行の有無を聞いてきます。 実行しないを選べば見積番号は変わらないのですが 間違えて実行してしまうとそのファイルの見積番号が変わってしまいます。。 回避方法として知り合いからアドインファイルにすれば?と言われて 保存形式をxlaにしたのですがエラーが出てしまいました>< Const FPath = "C:\指示書" Sub Auto_Open() 'xlsファイル検索 With Application.FileSearch .NewSearch .Filename = "*.xls" .FileType = msoFileTypeAllFiles .LookIn = FPath .SearchSubFolders = False .Execute Cells(1, 21).Value = .FoundFiles.Count + 1 Cells(1, 21).NumberFormat = "0000" End With End Sub したから4行目のCells(1, 21).Value = .FoundFiles.Count + 1 でエラーが出てしまうようで。。原因がわかりません。 何が原因なのでしょうか?><

  • excel vba

    excel VBA (質問1) B7 セルに,DOC20071201_1231.xlsとはいっているとき下記の動作と同様のことをB7を使って表現するにはどうすればいいか。 Sub bookwo_open() Workbooks.Open Filename:="C:\Documents and Settings\taktta\My Documents\Log zzz\2007 log\2007年報告\2007年12月分\" & "DOC20071201_1231.xls" End Sub (質問2) A1セルに7とはいっているとき、B7セルに入っているファイルをオープンするには、どうすればいいか。 (A1セルにnとはいっているとき、Bnセルに入っているファイルをオープンするには、どうすればいいか。)

  • Excel VBA: 自動でxlsファイルを開くマクロでメッセージが現れたとき自動でボタンを押す方法

    自動で同ディレクトリ内のxlsファイルを開くマクロを作っています。 開きたいファイルにリンクが張られてあると、「リンクを更新しますか?」という類のメッセージウィンドウが現れるのですが、マクロでこれを自動的に「Yes」「No」と答えるにはどうしたらよいのでしょうか。一応、下のマクロでファイルを開こうとするとこまではできてます。  Sub update() Dim DataFile As Workbook Dim fn As String fn = "Link.xls" Set DataFile = Workbooks.Open(FileName:=ThisWorkbook.Path & "\" & fn) Set DataFile = Nothing End Sub

  • Excel VBAで確認なしで上書き保存

    起動中のBookでファイル名が Data.xlsのものを閉じたいと思いますが、 上書き確認メッセージを出さないように oExcel.DisplayAlerts = False を設定すると エラーになります。 CreateObject で作成した場合は、DisplayAlerts が使えるようですが、 すでに起動済みのBookを確認なしで上書き保存するにはどうしたらいい のでしょうか? Sub UnloadFile()   Dim myBook2 As Workbook   Dim myBook1 As Workbook    For Each myBook2 In Workbooks      If myBook2.Name = "Data.xls" Then        Set myBook1 = myBook2        myBook1.SaveAs myBook1.FullName        myBook1.Close      End If    Next myBook2    Set myBook1 = Nothing End Sub

  • エクセル2000VBAでファイルを操作したい

    いつもお世話になっています。 エクセルVBAで別のワークブックを参照したいので workbooks.open Filename:="C:my documents\***.xls" とすると、そのオープンするワークブックのTisWorkbookのWorkbook_Open()で実行している(.show)メニュー(ユーザーフォーム)が開いてしまいます。 このとき、Workbook_Open()を実行させないでワークブックを開く方法って、 なにかありますか? Shiftを押しながらファイルを開くとき、実行されませんよね?それをVBAでできるのですか? よろしくお願いします。

  • EXCELをもう一つ立ち上げたい

    マクロを使用して sub 関数1 shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE", 1 end sub と記述すれば EXCELがもう一つたちあがります。 また、 sub 関数2 Workbooks.Open FileName:="C:\MyDocuments\aa.xls" end sub と記述すればMyDocments配下のaa.xls というファイルがたちあがります。 そこで、ここから本題なのですが、 aa.xlsというEXCELファイルをもう一つのEXCELに立ちげる方法を教えて頂けませんでしょうか? よろしくお願いします。

  • ACCESSのVBAからExcelのセルから読めたのですが、書く方法を教えてください

    下記の方法でCell(1,1)、から読むことができました そこで今度書き込みなのですが With xlBk.Worksheets("Sheet1")    'Debug.Print .Cells(1,1)    .Cell(1,2) = "data" End With としても、エクセルシートには書かれていないのですが 書く方法を教えてください ただ、下記の Open(Filename:=strFile, UpdateLinks:=0) はエクセルをOpenする時 「このブックは他のデータソースへのリンクがふくまれています」 とメッセージがでるので、UpdateLinks:=0、と入れています よろしくおねがいします '--------------------------------- Dim xlApp As Excel.Application Dim xlBk As Excel.Workbook Dim strFile As String strFile = "C:\Sample\Book1.xls" Set xlApp = CreateObject("Excel.Application") Set xlBk = xlApp.Workbooks.Open(Filename:=strFile, UpdateLinks:=0) With xlBk.Worksheets("Sheet1")   Debug.Print .Cells(1,1) End With xlBk.Close False xlApp.Quit Set xlApp = Nothing '----------------------------------

専門家に質問してみよう