◯ マクロを使って一括操作。
新しいパスワードを設定した複数ブックを一括して保存しよう。
前編では、パスワードを設定した複数ブックを一括して開く処理を作成してきました。次は、開いたブックのパスワードを新しいパスワードに置き換え、上書き保存して閉じるマクロを作成してみたいと思います。
新しいパスワードは、図1(前編に掲載)の表のB4セルに設定した文字列を指定することとします。B4セルに文字列が入力されているときはその文字列を、未入力のときはパスワードなしに設定します。
標準モジュールに、続けて、リスト2のコードを記述してください。
リスト2、パスワードを変更してブックを上書き保存するコード。
「パスワード保存」という名前のプロシージャを作成しました。このプロシージャを実行すると、開いている各ブックのパスワードをB4セルの値に変更し、上書き保存して閉じます。
(1)で、まず、サンプルブックをアクティブ(ThisWorkbook.Activate)にします。複数のブックを開いているため、サンプルブック以外からマクロが実行されたケースを想定した処理です。
(2)と(3)の、対象年月を「yyyymm」の書式で変数tmpdに格納する処理は、前編に掲載したリスト1の(1)(2)と全く同じです。
(4)のFor Eachステートメントは、Workbooksコレクションに対して繰り返し処理を行います。開いているブックが8つなら、8回処理を繰り返します。繰り返し処理の間、現在処理の対象となっているワークブックは変数oに格納されます。つまり、変数oをWorkbookオブジェクトとして扱えます。
(5)のIfステートメントの条件式「o.Name <> ThisWorkbook.Name」で、現在処理の対象となっているワークブックの名前と、サンプルブックの名前が同じかどうかを判定します。ブック名がサンプルブックと異なるとき(売掛一覧データブックのとき)、(6)~(9)の処理を実行します。
(6)の「o.Password = Cells(4, 2).Value」では、Passwordプロパティを使用して、パスワードをB4セルの値に変更しています。B4セルの値が空の文字列のときは、パスワードなしに設定されます。
(7)の「Application.DisplayAlerts = False」で、Excelの確認メッセージの表示をオフにしています。これは、(8)でパスワードを変更したブックを上書き保存するとき、確認のメッセージが表示されることを防ぐためです。
(8)でブックを上書き保存して閉じます。
(9)で確認メッセージの表示をオン(True)に戻します。
すべての売掛一覧データブックを上書きして閉じた後、(10)のForステートメントの繰り返し処理で、各ブックのファイル名を元のファイル名に戻します。
(11)の、変数opathに各売掛一覧データブックのあるフォルダーへのパスを作成する処理は、前編に掲載したリスト1の(5)と全く同じです。
(12)で変数npathに「売掛一覧データ.xlsx」と元のファイル名を、(13)で変数opathに「売掛一覧データ(支店名yyyymm).xlsx」という書式の仮のファイル名を、それぞれ連結して格納します。これを、(14)のNameステートメントで、仮のファイル名(変数opath)から元のファイル名(変数npath)へ、ファイル名を変更します。これらの処理は、前編に掲載したリスト1のときとは逆になりますね。
仮のファイル名に変更したすべてのブックに対して、(11)~(14)のリネーム処理を実行したら、コードを終了します。
(イラスト:武藤 玄)
では実際に、コードを実行して動作を確認してみましょう。Excelには、前編で紹介したマクロで開いた各売掛一覧データのブックが、開かれていることとします。
コードを実行する前に、サンプルブックのB4セルに新しい共通のパスワードを指定しておきましょう。ここでは、図5のように「1234」を指定することにします。
図1、B4セルに新しいパスワード「1234」を指定する。
あとで上書き保存したことが確認できるように、「売掛一覧データ(東京本店202406).xlsx」のB3セルの値を「株式会社○」から「株式会社●」に変更しておきます。
「マクロ」ダイアログボックスを表示し、「マクロ名」の一覧から、「パスワード保存」マクロを選択し、「実行」ボタンをクリックします。
マクロが実行され、サンプルブック以外のブックがすべて閉じました。本当にパスワードが変更され、上書き保存されているか、エクスプローラーから確認してみましょう。「東京本店」フォルダーの「202406」フォルダーを開きます。ブック名が元の「売掛一覧データ.xlsx」に戻っていることが確認できます)。
図3、ブック名が元の「売掛一覧データ.xlsx」に戻った。
ブックを開くと、パスワードを確認するダイアログボックスが表示されるので、新しいパスワードの「1234」を入力します。
図4、ダイアログボックスに「1234」を入力する。
2024年6月の東京本店の売掛一覧データが表示されました。B3セルの値が、編集した値「株式会社●」に変更されています。
正常に上書き保存されていることが確認できました。東京本店の売掛一覧データブックを閉じてください。
では、各売掛一覧データブックを新しいパスワードで、もう一度開いてみましょう。サンプルブックのB3セルに、新しいパスワード「1234」を入力し、「パスワード解除」マクロを実行します。
図6、B3セルに「1234」を入力し、「パスワード解除」マクロを実行する
[画像のクリックで拡大表示]
各売掛一覧データブックが開きました。今度は、パスワードなしにして、保存してみましょう。B4セルをクリアして、「パスワード保存」マクロを実行します。
図7、B4セルをクリアし、「パスワード保存」マクロを実行する。
各売掛一覧データブックが自動的に閉じました。本当にパスワードなしに変更されているか、エクスプローラーから、各支店の「202406」フォルダーにある売掛一覧データブックを、手動で開いて確認してみてください。パスワードの入力なしにブックを開けることが確認できると思います。
また、対象の年月を2024年7月に変更すると、「202407」フォルダーにある各売掛一覧データブックに対して、同じ処理を行えます。
試しに、7月の売掛一覧データを開いてみましょう。B2セルを「6」→「7」に変更し、B3セルは「1234」のままで、「パスワード解除」マクロを実行してみます。
図8、B2セルを「6」→「7」にし、「パスワード解除」マクロを実行する。
「パスワードが異なるため開けません」のメッセージが表示され、コードの実行が中止されました。
図10、メッセージが表示され、コードの実行が中止された。
7月の売掛一覧データブックのパスワードは初期値のままなので、「1234」のパスワードでブックを開こうとしても、エラーになります。B3セルの「1234」のパスワードをクリアして、もう一度「パスワード解除」マクロを実行しましょう。
今度は正常に、7月の売掛一覧データが開かれました。
図⒒、7月の売掛一覧データブックが一括して開かれた。
各支店からの売掛一覧データは毎月送られてくるので、フォルダーは「202408」、「202409」と今後増えていきますが、対象年月を変更することで対応できます。また対象支店が7支店以上になっても、B12セル以降に支店を追加することで、同様に対応が可能です。
ちなみに、パスワードなしに設定した売掛一覧データブックを、マクロで開くときはどうすればいいのでしょう?B3セルが未入力のときは、「支店名yyyymm」のパスワードが自動生成されるのでしたね。
実は、パスワードが設定されていないブックに対して、OpenメソッドのPassword引数でパスワードを指定しても、無視されてブックが開きます。つまり、パスワードが設定されていないブックを開くときは、B3セルにどのような値が入力されていても、関係なく開くことができるということです。こちらも、ぜひ試してみてください。
今回のマクロ、いかがでしたでしょうか?
最後に一点、注意事項があります。それは、2つ目に紹介したサンプルを実行すると、対象のブックのパスワードが同一になるということです。これは「パスワードの使いまわし」と呼ばれる行為で、基本的には好ましくない行為です。ただ、管理者のみが取り扱える厳重に管理したデバイスだけにブックを保存している場合であれば、必要なセキュリティレベルを緩く運用できるケースもあるでしょう。そのような場合、今回のマクロを参考にしてもよいと思います。