[[20150212180428]] 『ブックの保護がかかったブックを開きたい』(大和) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ブックの保護がかかったブックを開きたい』(大和)

ご回答いただけると非常に助かります・・・

色々なフォルダに入っている複数の同一のパスワード"1234"による保護がかかったマクロ有効ブック(同一名の場合も有)を開きたいです。

お恥ずかしながらネット等で調べて作成したマクロは下記です。
こちらの不備等もあれば合わせて教えてくださると嬉しいです。

    Dim OpenFile As String
    OpenFile = Application.GetOpenFilename("Excelブック,*.xlsm")'指定したマクロ有効ブックを開く

その際のパスワード解除する構文が分からず。

    ActiveWorkbook.Unprotect Password:="1234" '保護の解除
    ChDir "C:\Users\社員番号\Desktop\保存先"
ThisWorkbook.SaveAs "C:\Users\社員番号\Desktop\保存先" & Format(Now, "yyyy-mmdd-mmss") & ".xlsm", 56
同一名の場合もあるため適当に名前つけ(ブック名はその後、手作業で加工するため適当でOK)保存先フォルダへ保存し完了。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 まず、

 OpenFile = Application.GetOpenFilename("Excelブック,*.xlsm")'指定したマクロ有効ブックを開く

 ブックは開かれません。選択されたブックのフルパスが返されるだけです。
 で、フルパスが取得できたら、Workbooks.Open Filename:="そのフルパス文字列",Password:="1234" で開きます。

(β) 2015/02/12(木) 19:51


ご回答ありがとうございます!

"そのフルパス文字列"というのは開きたいブックごとに毎回違うことになると思いまして
このVBAを毎回活用したいのですが、すべてに対応させることは可能でしょうか?
(大和) 2015/02/13(金) 11:41


 >OpenFile = Application.GetOpenFilename("Excelブック,*.xlsm")'指定したマクロ有効ブックを開く
 >ブックは開かれません。選択されたブックのフルパスが返されるだけです。
 βさんの説明通りこれで「OpenFile」に選択したファイルのフルパスが格納される。

 >Workbooks.Open Filename:="そのフルパス文字列",Password:="1234"
 ここも説明された通り「Filename:=」でOpenFileを指定する。

 なお、
 Workbooks.Open Filename:="OpenFile",Password:="1234"
 ではなく
 Workbooks.Open Filename:=OpenFile,Password:="1234"
 なので間違えないように。

(ねむねむ) 2015/02/13(金) 13:10


 (ねむねむ)さん フォローありがとうございます。

 (大和)さん

   Workbooks.Open に与える引数はねむねむさんのコメントの通りです。
   もう1つ、「フルパスが取得できたら」と書きました。
   取得できないこともあり得ます。操作者がダイアログでキャンセルボタンを押したときです。
   標準モジュールに以下を書いて、選んだり、キャンセルボタンをおして確かめてください。

 Sub test()
    Dim OpenFile As String
    OpenFile = Application.GetOpenFilename("Excelブック,*.xlsm") '指定したマクロ有効ブックを開く
    If OpenFile = "False" Then
        MsgBox "選ばれませんでした"
    Else
        MsgBox "選んだブックのフルパスは" & vbLf & OpenFile & "です"
        '実際のコードでは、ここでブックを開いてください。
    End If
 End Sub

(β) 2015/02/13(金) 13:30


ねむねむ様 β様

無事開くことが出来ました。本当にありがとうございます。
しかし、フォルダに保存ができなくなりました…原因がわかりますでしょうか?
1から10まで聞いてしまってお恥ずかしい限りです。

   Dim OpenFile As String
    OpenFile = Application.GetOpenFilename("Excelブック,*.xlsm")'指定したマクロ有効ブックを開く

Workbooks.Open Filename:=OpenFile,Password:="1234"

    ActiveWorkbook.Unprotect Password:="1234" '保護の解除
    ChDir "C:\Users\社員番号\Desktop\保存先"
ThisWorkbook.SaveAs "C:\Users\社員番号\Desktop\保存先" & Format(Now, "yyyy-mmdd-mmss") & ".xlsm", 56

こちらで実行してみたのですが、保存先フォルダに保存されなくなりました。
よろしければご教授の程、願います。
(大和) 2015/02/13(金) 17:53


 まず、保存前の ChDir は、保存のためでしたら不要です。
 これからの処理に必要であれば別ですが。

 おそらく原因は "\保存先" という文字列と、その後ろのファイル名との間に \ がないので
 DeskTop そのものに、頭に保存先という名前がついたブックとして保存されたのではないかと思いますが?

 ただし、以下、気になりますのでコメントします。

 ChDir でも SaveAs でも使っておられる C:\Users\社員番号 というパス。
 確かに、2007以降は、この階層がそのユーザの領域に至るパスです。
 2003以前は、こうではなかったですし、将来、もしかしたら階層が変化するかもしれません。
 2007以降でも、このパス内の 「社員番号」、これは、PCのログインIDですね。
 自宅PCでは、個人の設定したIDになっているでしょうし、会社では、社員番号にしたり
 部署コードにしたり、あるいはPCごとの連番にしたり、それは会社のルールで設定されていますね。

 あるPCが 123456 だったとしても、別のPCでは 345678 ということになります。
 で、345678 のPCで、C:\Users\123456 と指定しても、そんなフォルダパスは見当たらないよということになります。

 なので、たとえば DeskTop までのフォルダパスを取得する場合、ハードコードではなく、システムからパスをもらいます。

 ThisWorkbook.SaveAs "C:\Users\社員番号\Desktop\保存先" & Format(Now, "yyyy-mmdd-mmss") & ".xlsm", 56

 これを

 ThisWorkbook.SaveAs "CreateObject("WScript.Shell").SpecialFolders("desktop") & "\保存先\" & Format(Now, "yyyy-mmdd-mmss") & ".xlsm", 56

 にして試してみてください。

 ところで、ファイル形式に 56(xlExcel8) を指定しているのは何か意図があるのでしょうか?
 これは、確か、2003以前のコードで扱える【後方互換】ファイルにするということだったと記憶していますが
 それにしては 拡張子が xlsm ですか?

(β) 2015/02/13(金) 19:14


 追加で

 開いたファイル(ActiveWorkBook)の保護を解除しておられますが、
 そのあと名前を付けて保存するファイルが ActiveWorkbook ではなく、 ThisWorkbook になっています。
 ThisWorkBook は、このマクロブックそのものなんですが、それでいいのですか?

(β) 2015/02/13(金) 19:32


回答ではありませんし、見当違いかもしれませんが。
最初に、質問を読んだ時こう考えていました。

 大和さんのなさりたいことは、

 1)読み取り専用パスワードを設定してあるファイルを
 2)ダイアログから選んで開き
 3)保存先フォルダに、パスワードなしで保存

 つまり読み取り専用パスワードの解除であって
 ブックの保護の解除という表現は間違いかも。

 あと、間違えて別ファイルを選んでしまったときの対策は、どういうコードにしたらよいか。
 もしかするとフォルダの中のxlsmファイルは、すべてパスワード1234で、全ファイル処理したいのかな。
 等々。

(マナ) 2015/02/14(土) 00:12


間違っていたらごめんね!

ひょっとして、犯罪的に使用されるのではないかと心配です。

マクロでやるというのはパスワードを次々に変更してトライしてデータを取り出そうとしているのかと

しかも複数のファイルが勝手に入手できるので

ファイル名を変更して保存してもいいというのも、理由のひとつですが

そんなマクロをこんな場でさらしていいのか?

マナさんの言われるように 読み取り専用パスワードの解除が目的ならいい?のですが

(心配性) 2015/02/14(土) 09:27


(心配性)さん、こんにちは

大丈夫ですよ(^^
さらされているのはパスワードが分かっていることが前提のコードです。
パスワードを盗むコードではありません。

パスワードを知っている人は、開いたファイルのパスワードを変えるもの自由だし
複数のファイルを開くのもデータを見るのも、書き換えるのも自由だし
開いたファイルを保存するのも自由です。

'----予断
複数個所に散らばっているファイルを、パスワード解除して一箇所に集め、
手作業で一気に処理を済ませたいのだろうと想像しています。
たぶんそのあとで、パスワードをかけなおして元の場所に戻したいという
ご要望になるのかなと想像します。

( 佳 ) 2015/02/15(日) 10:34


皆様コメント下さり、誠に有難うございます。

β様
無事、保存ができました。
丁寧にご教授頂き、本当にありがとうございます!
"56"ですネットで「フォルダ名に日付をつける方法」を調べた際にそう記載していた為、そのままコピーして使用しておりました。
この意味についてはきちんと理解はしておりませんでしたが、思った通りに使えていたので気にしておりませんでした。理解して質問すべきでした。すいません…。

マナ様 心配性様 佳様
自分で毎月保護つきで顧客データを作成しているのですが
そのデータを数か月ごとに一つにまとめてグラフ等を作成することになりまして
手作業で行っていたのですが不便に感じまして質問させて頂きました。
断じて犯罪に使用する目的はございません。
言葉足らずでご心配・ご迷惑をおかけ致しまして申し訳ございません。
(大和) 2015/02/16(月) 10:38


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.