◯ パスワードのついた複数のExcelブック、マクロを使って一括操作。
ジョンアップなどによって手順が変わる可能性があります。
小清水さん「もう~~~いらんちゅーの! この長ったらしいパスワード!!」
末成くん「パスワードの入力がめんどくさいの? 小清水さん」
小清水さん「各支店から来る売掛データ、支店名プラス年月がパスワードだってみんな知ってるから、パスワードの意味ないわよ!」
末成くん「社外へのセキュリティじゃない?」
小清水さん「だったら全支店共通のパスワードにしなさいよ! その方が楽だし!」
末成くん「そりゃダメでしょ! ウチの会社のルールだから…僕に言われてもねえ…」
小清水さん「そう…ルールは変えられないわよね…代わりにVBAで解決ってのはどう? キミが」
Excelを業務で使っていて、思わず「困った」という経験はないでしょうか。そして、「こんなマクロがあれば、すぐに解決できるのに…」と、感じたことはないでしょうか。
Excelは大変便利な表計算ソフトですが、適切な使い方をしないと、正しい結果が得られないことが多々あります。この連載では、業務効率化を妨げている不適切な作業や悪習慣を、マクロで自動化することによって解決していきます。
皆さんは、重要な情報が入力されたブックをどのように管理していますか?
Excelには、ブックにパスワードを設定する機能があります。パスワードが設定されたブックでは、開く際に、ダイアログボックスでパスワードの入力を要求されるようになります。
このパスワードによるセキュリティの管理は、個人情報を含むブックや、メールでのデータのやり取りなどで大変重宝しますが、パスワードの入力という手間が増えるデメリットもあります。
今回は、パスワードの設定された複数ブックを一括で操作し、パスワードの解除や変更を行うマクロを作成してみたいと思います。
それでは早速、作っていきましょう。
パスワードが設定された複数ブックを一括して開こう。
まずは、パスワードが設定された複数ブックを一括して開くマクロから作っていきましょう。そのマクロを動かすためのサンプルブックを作ります。サンプルブックのSheet1シートには、図1の表が作成されています。
また、サンプルブックのあるォルダーには、図2のフォルダーとブックがあらかじめ作成されているものとします*1。
この会社では、毎月、各支店から「売掛一覧データ.xlsx」というブックを集めます。集められたブックは、図2のように支店名と年月によるフォルダーに仕分けされ、保存されます。
さらに、この売掛一覧データのブックには、「支店名yyyymm」という書式ルールでパスワードが設定されています。例えば、横浜支店の2024年6月の売掛一覧データなら、パスワードは「横浜支店202406」です。
サンプルブックの表(図1)では、B1とB2セルに対象年と月が、B5~B11のセル範囲に対象となる支店名が、それぞれ入力されています。この表を使って、B3セルには現在のパスワードを、B4セルには新しいパスワードをそれぞれ設定できるようにしています。B4セルの値は、あとで解説するパスワード変更のマクロで使います。
Visual Basic Editor(VBE)を起動し、「挿入」メニューから「標準モジュール」をクリックして、標準モジュールを追加します。コードウィンドウに、リスト1のコードを記述してください。
「パスワード解除」という名前のプロシージャを作成しました。このプロシージャを実行すると、各支店のフォルダーの中にある、B1、B2セルで指定した年月の売掛一覧データブックを、自動作成した「支店名yyyymm」という書式ルールのパスワードを使用して開きます。
(1)と(2)で、まず、B1、B2セルに入力されている数値から、「yyyymm」の書式で年月を表す文字列を作成します。
(1)では、DateSerial関数を使用して「B1セル年B2セル月1日」の日付を作成しています。
(2)では、Format関数で「yyyymm」の書式に変換しています。サンプルブックの場合、「202406」の文字列が変数tmpdに格納されます。
(3)のForステートメントは、B列の5行目からデータのある最終行までの間、(4)~(17)の処理を繰り返します。サンプルブックでは、カウンタ変数iが5から11になるまで、処理を繰り返すことになります。
(4)は、行継続文字「半角スペース」+「(半角アンダーバー)」を使用して改行していますが、実際は1行のコードです。ここではまず、変数tmpfに「売掛一覧データ(支店名yyyymm).xlsx」という書式で、仮のファイル名を作成しています。Excelでは同じファイル名のブックを同時に開くことはできません。同時に開くためには、各ブックのファイル名をあらかじめ異なる名前にリネームしておく必要があります。もちろん、リネームしたブック名は閉じるときに、マクロで元の名前に戻します。
(5)で、変数opathに、各売掛一覧データブックのあるフォルダーへのパスを作成します。サンプルブックのフォルダーのパスに、繰り返しの対象となっている支店名と、変数tmpdに格納された年月の文字列を、「¥」を挟んで連結し、変数opathに格納します。
(6)と(7)で、2つのパスを変数npathとopathに、それぞれ格納します。
(6)では、変数npathに、変数opathと変数tmpf(仮のファイル名)を連結したパスを格納します。
(7)では、変数opathに、変数opathと「売掛一覧データ.xlsx」の文字列を連結したパスを格納します。
そして(8)のNameステートメントで、元のファイル名(変数opath)から仮のファイル名(変数npath)へ、ファイル名を変更します。
(9)の「On Error Resume Next」は、このあとの処理でエラーが発生しても、エラーを無視するための命令です。(11)や(12)の処理でパスワードが違っていてブックが開けないとき、エラー処理を行うために必要となります。
(10)のIfステートメントで、B3セルのパスワード指定の有無を判定します。
パスワードの指定がない場合、(11)で「支店名yyyymm」をパスワードに指定してブックを開きます。
パスワードの指定がある場合は、(12)でB3セルの値をパスワードに指定してブックを開きます。開くブックのパスはWorkbooks.OpenメソッドのFilename引数で、パスワードの指定はPassword引数で、それぞれ指定します。
パスワードが違っていてブックが開けない場合、エラーが発生します。(13)のIfステートメントの条件式「Err.Number <> 0」で、エラーが発生したかどうかを判定しています。ErrオブジェクトのNumberプロパティは、エラーが発生したときに「0」以外のエラー番号を、エラーが発生しなかったときに「0」を返します。
エラーが発生したとき、(14)で仮のブック名を元のブック名に戻します。(15)で「パスワードが異なるため開けません」のメッセージを表示し、(16)の「Exit Sub」でコードの実行を中止します。
エラーが発生しなかったときは、次のブックを開くために、(17)の「ThisWorkbook.Activate」で、マクロを実行しているこのサンプルブックをアクティブにします。これは、Workbooks.Openメソッドでブックを開いたときに、開いたブックが必ずアクティブブックになるためです。
(4)~(17)の処理をすべての支店に対して繰り返したら、コードの実行を終了します。
では実際に、コードを実行して動作を確認してみましょう。
Excelの画面で、「開発」タブの「マクロ」ボタンか、「Alt」+「F8」キーを押します。開いた「マクロ」ダイアログボックスに表示される「マクロ名」の一覧から、「パスワード解除」マクロを選択し、「実行」ボタンをクリックします。
マクロを実行すると、サンプルブックのB5セルからB11セルまでに入力されている、7つの支店の売掛一覧データが一括して開かれました(図3)。
各売掛一覧データブックの名前が、「売掛一覧データ(支店名yyyymm).xlsx」に変更されています(図4)。また、図1の表のB2セルで指定したとおり、それぞれの支店の「6月」のブックが開かれていることも確認できます。
開いた各売掛一覧データブックは後編で紹介するマクロで使用するため、閉じずにこのままにしておいてください。