なんか最近、パスワード関連の質問をよく受けます。なので、パスワードに関連した内容をいくつか解説しようと思います。まずはこちらから。ブックにパスワードをつけて保存するやり方です。これ、質問されるといつも「マクロ記録すれば分かるよ」って答えてたんですけど、今回実際にやってみて驚きました。今のExcelは、ブックにパスワードを設定する操作をマクロ記録しても、パスワードに関することが記録されないんですね。いやぁ~知りませんでした。Excel 2003まではできたんですよ。無慈悲に突き放すようなことを言ってしまい、すみませんでした>質問してくれた方々
ご存じない方もいるでしょうから、まずは手動で、ブックにパスワードを設定する方法をご紹介します。やり方は2つあります。1つめは、ブックに名前をつけて保存する[名前をつけて保存]ダイアログボックスで設定する方法です。ダイアログボックスの下に[ツール]というボタンがあります。クリックするとドロップダウンリストが表示されますので、その中の[全般オプション]をクリックします。
実行すると[全般オプション]ダイアログボックスが開きます。[読み取りパスワード]ボックスに、任意のパスワードを入力して[OK]ボタンをクリックします。
実行すると[パスワードの確認]ダイアログボックスが開きますので、同じパスワードをもう一度入力します。
[OK]ボタンをクリックすると、最初の[名前をつけて保存]ダイアログボックスを操作できるようになりますので、任意のフォルダに適当な名前をつけてブックを保存すれば完了です。
この設定方法は、大昔のExcelからある古典的なやり方です。正直言って、分かりにくいですし、使いにくいです。Excel 2007以降では、もっと簡単にパスワードを設定できます。Excelで、パスワードを設定したいブックを開いたら、[ファイル]タブをクリックします。左のサイドバーで[情報]を選択すると、右側の一番上に[ブックの保護]というボタンが表示されます。クリックするとメニューが開きますので、上から2つめの[パスワードを使用して暗号化]をクリックします。
実行すると[ドキュメントの暗号化]ダイアログボックスが開きますので、[パスワード]ボックに任意のパスワードを入力します。
[OK]ボタンをクリックすると、[パスワードの確認]ダイアログボックスが開きますので、同じパスワードを入力して[OK]ボタンをクリックします。
これで完了です。ブックがパスワードで保護されていると、[情報]ウィンドウの[ブックの保護]ボタンが黄色く塗りつぶされ「このブックを開くにはパスワードが必要です」と表示されます。
ちなみに、すでにパスワードを設定しているブックから、パスワードを解除するには、先の[ドキュメントの暗号化]ダイアログボックスの[パスワード]ボックスを空欄にして[OK]ボタンをクリックします。
さて、こうした「ブックにパスワードを設定する」マクロは、どう書いたらいいのでしょう。試しに、上記の操作をマクロ記録してみます。まずは最初の、[名前をつけて保存]ダイアログボックスによる設定から。次のようなコードが記録されます。
Sub Macro1() ActiveWorkbook.SaveAs Filename:="C:\Work\Sample.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False End Sub
パスワードに関することは、何ひとつ記録されていません。では、[情報]ウィンドウの[ブックの保護]ボタンから設定してはどうでしょう。こちらもマクロ記録してみます。結果は以下のとおり。
Sub Macro1() ' ' Macro1 Macro ' ' End Sub
そうそう、これこれ、このコードでパスワードが・・・って、おい!何も記録されんのんかい!
思わず、ノリツッコミしたくなるような所業です。何も記録されません。もしかして、Microsoftはわざとやっているのではないでしょうか。ちなみに、Excel 2003の[名前をつけて保存]ダイアログボックスで、パスワードを設定してブックを保存すると、次のコードが記録されます。今回、あらためて確認しました。
Sub Macro1() ActiveWorkbook.SaveAs Filename:="C:\work\Sample.xls", FileFormat:= _ xlNormal, Password:="1234", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False End Sub
ここでは「1234」というパスワードを設定しました。ちゃんと記録されてます。
先に書きましたが、この[名前をつけて保存]ダイアログボックスでパスワードを設定する方法は、かなりの大昔から提供されていましたので、私もこれは覚えていました。SaveAsメソッドの引数Passwordに、設定したいパスワードを指定してください。ちなみに、引数WriteResPasswordは「書き込みパスワード」ですね。こちらを設定する機会は少ないでしょう。ついでに、引数ReadOnlyRecommendedは「読み取り専用を推奨する」をオンにします。あくまで"推奨"ですから、強制力は大きくありません。どうしても"必ず"読み込み専用で開かせたいのでしたら、ファイルの属性を設定した方がましです。詳しくは、下記のページをご覧ください。
最後の引数CreateBackupは「バックアップファイルを作成する」設定です。これは、ご存じの方がほとんどいないであろうレアなオプションです。ブックを保存するたびに、保存前の状態をバックアップファイルとして自動的に保存しといてくれるという機能なのですが、保存されるファイルの拡張子が「xlk」と未だに3文字なので、そのバックアップファイルを現在のExcelで開こうとすると、変な注意が促されます。
「'~のバックアップ.xlk'のファイル形式と拡張子が一致しません。ファイルが破損しているか、安全ではない可能性があります。発行元が信頼できない場合は、このファイルを開かないでください。ファイルを開きますか?」だそうです。もちろん[はい]ボタンをクリックすれば、現在のExcelでも開けるのですが、ちょっと嫌な気分ですよね。この「バックアップファイルを作成する」機能によって自動作成されるバックアップファイルの拡張子を、未だに3文字「xlk」のままにしているということは、Microsoft的に、現在のExcelにとって、この機能はあまり重要ではないと認識しているのでしょうね。そりゃそうです。今だったら、クラウドのストレージであるOneDriveに保存してねってのがMicrosoftの考えです。OneDriveだったら、もちろん自動的に何世代ものバックアップファイルが自動的に作成されますし、何なら削除したファイルでも復活可能な場合もあります。時代はクラウドなんですね~。
さて、話を元にもどしましょう。ブックにパスワードを設定する方法は2つあります。
1.の操作は、新規ブックに名前をつけて保存するとき、一緒にパスワードを設定できて便利です。では、2.の操作をマクロで実現するには、どうしたらいいでしょう。実はブック(Workbookオブジェクト)にはPasswordプロパティがあります。ここに任意のパスワードを設定すれば、"名前をつけて保存"を実行しなくても、パスワードの設定が可能です。
Sub Macro2() ActiveWorkbook.Password = "1234" End Sub
これだけです。こちらの方法は、すでに名前をつけて保存してある既存ブックに対して、パスワードを設定するときに便利ですね。次のように、パスワードを空欄("")にすれば、パスワードを解除できます。
Sub Macro2() ActiveWorkbook.Password = "" End Sub
ちなみに、このPasswordプロパティを調べることで、ブックに設定されているパスワード文字列を取得することも可能だそうです。やってみましょう。パスワードには"1234"を設定してあります。
Sub Macro3() MsgBox ActiveWorkbook.Password End Sub
ありゃ、取得できませんね。パスワードキャラクタ(*)でマスクされちゃってます。当然ですけど、判定もできません。
Sub Macro4() If ActiveWorkbook.Password = "1234" Then MsgBox "パスワードは'1234'です" Else MsgBox "わかりません" End If End Sub
Passwordプロパティを調べただけでは、設定されているパスワード文字列を調べることはできないと。そういう仕様のようです。まぁ、考えてみれば、それで良いのかもしれません。だって、Passwordプロパティを取得するということは、そのブックをExcel上で開いているわけで。だったら、パスワードは知っているはずですからね。最後に、ブックがパスワードで「保護されているかどうか」を調べる方法をご紹介します。これは簡単です。ブック(Workbookオブジェクト)のHasPasswordプロパティは、ブックにパスワードが設定されているとTrueを返し、設定されていないとFalseを返します。
Sub Macro5() If ActiveWorkbook.HasPassword = True Then MsgBox "パスワードで保護されています" Else MsgBox "パスワードで保護されていません" End If End Sub