あとは...。マクロでのパスワード設定の試みが失敗するのは、エラーで強制終了してしまう(実行時エラー)のか、パスワードを設定したはずがうまくいってない(論理エラー)ということなのかわかりませんが、前者であれば for 文内で on error resume next ... on error goto 0 を入れて失敗する場合は debug.print でシート名を出力する、後者ならその後片っ端から値を編集することを試していって無事に値が書き換わってしまったものについてはシート名を debug.print する、等すると、手作業対象のシートを絞り込めて多少仕事は楽になったかも...とは思いました。(ファイルを見ていないのとそもそもの要件がわからないので、見当外れなことを書いているのかもしれませんが)
84nomuraさんの投稿
(投稿ID: 5427)
会社の資料で、すべてのシート(一部除く)に対して、"password"というパスワード有りのシート保護をする作業をしています。
(シート数は100位あります)
(当然、会社の資料なので現物はお見せできません)
が、なぜかシートによって 正しくパスワード付きの保護になる場合もあれば、パスワードなしの保護になってしまう場合も
あり、規則性がよくわかりません。(パスワードなし保護の場合、”シートの保護の解除"を押せば簡単に解除されてしまうため、
保護をする意味があまりありません)
構文は以下のような単純なものです。
ファイルの拡張子は、xltm というものです。
Sub hoge()
Dim W As Worksheet
For Each W In Worksheets
W.Protect Password:="password"
Next
End Sub
この現象について、お心あたりはありますでしょうか。
小川 慶一さんのコメント
(コメントID: 8006)
> この現象について、お心あたりはありますでしょうか。
何とも言えないですね。
会社の資料ということですが、問題再現可能なシート2枚(同じコードで成功するもの、しないものを含める)をお送りいただくことは可能ですか。
データがなくてもそれで問題再現できるようでしたら、調べてみます。
あと、拡張子 xltm ということですが、となると、テンプレートファイルですね。
実データを入れてファイルを配布するときは、 .xlsm でということになるのではないかとも思います。であれば、 .xlsm にしてから同じマクロを実行してそれで問題なければ良い気もしますが、この方法は確かめられたでしょうか。
小川 慶一さんのコメント
(コメントID: 8007)
仕事の設計としても、そのほうがシンプルです。
なお、エクセルのシートの保護機能はオモチャなので、本気を出せば、シートの保護は突破できます。
https://keizokuma.com/excel-sheet-unlock-password/
「シートには保護パスワードを設定しろ。なぜなら、○○だからだ」とおっしゃる上司の方がいらっしゃる等ということでしたら、上記の旨を説明して、その「○○」を実現する別の方法を提案されたほうが良いようにも思います。
(あるいは、他の方法では「○○」が実現不可能なそうであれば、その旨説明する)
84nomuraさんのコメント
(コメントID: 8010)
当該マクロは、自分が作業効率化するためにしていたものです。そう何度も発生する作業ではないので、手作業で乗り切りました。
ただ、同じようなシートにパスワード付き保護を与えるマクロ(これは自分のためにやっているマクロではなく、会社の資料として必要だからやっている)のは想定通りの動きをしているので、ちょっとよくわかりません。とはいえ、その重要なマクロはちゃんと動いたので、いったん本件クローズで大丈夫です。最終的には、xltmのファイルはシステムに入れることになっていて、拡張子を指定されているので、別の拡張子は使えません。
小川 慶一さんのコメント
(コメントID: 8011)
「手作業で乗り切った」ということですか...。
いったん .xlsm にしてマクロを実行してから「名前をつけて保存」で「ファイルの種類」でExcelマクロ有効テンプレート(*.xltm)を指定して保存するというのは選択肢としてあったかもしれません。
(.xltmであったことが原因ならばですが)
あとは...。マクロでのパスワード設定の試みが失敗するのは、エラーで強制終了してしまう(実行時エラー)のか、パスワードを設定したはずがうまくいってない(論理エラー)ということなのかわかりませんが、前者であれば for 文内で on error resume next ... on error goto 0 を入れて失敗する場合は debug.print でシート名を出力する、後者ならその後片っ端から値を編集することを試していって無事に値が書き換わってしまったものについてはシート名を debug.print する、等すると、手作業対象のシートを絞り込めて多少仕事は楽になったかも...とは思いました。(ファイルを見ていないのとそもそもの要件がわからないので、見当外れなことを書いているのかもしれませんが)
上記のようなパスワード設定と検査の試みをくりかえして、毎回同じ結果(成功/失敗するファイルはいつも同じか)を調べてみたり、失敗するシートだけを別ファイルに移動させて、それでも移動先で同じ処理をしようとするとすべて失敗するのかとか、失敗するシートをすべて除外したファイルでは果たしてすべてのシートで処理は成功するのかとか、さらにいろいろ興味あるところです。
以前、エクセルファイルそのものが壊れていたことが原因でマクロが動作不良を起こすといった事例のサポートをしたことがあります。
そのときは、シートをすべて別ファイルに移動させてからマクロを実行したら問題なく動作しました。
シートが100枚近くあるとなると、どこかで微妙に情報が壊れているかもしれないですし、案外、ファイルの情報を構成する xml ファイル群のどれかが壊れているせいで全体に影響を与えているのかもしれませんね。
今回はお役には立てなかったようですが...また何かあればご相談ください。