- ベストアンサー
強制的にマクロを有効にするVBA
- エクセル2010でマクロを有効にするVBAについて教えてください。
- マクロの入ったファイルを開く際にマクロを強制的に有効にする方法や、複数のシートがある場合の修正方法についてお知りになりたいようです。
- また、マクロが有効になっていない場合は注意喚起のメッセージボックスを表示させる設定にすることは可能かもしれません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 >私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。 最初に、そのマクロ自体は、試してみたのですか? ダミーだけ残して、後は、非表示にするというだけのことですから、そんなに、難しい話ではないと思います。ただし、二つの条件があります。 ・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの [マクロの設定]の「警告を表示せずにすべてのマクロを無効にする」という設定と、 ・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼する」にチェックを外していることです。 それで、マクロが動かないようにしている相手は、いずれにしても、その設定自体を変えてもらう必要があると思いますが、実際、そういう相手は、「マクロ」自体を使わないという規則があったりします。 それから、リンク先のデジタル署名については、Excel 2007以上は、厄介なものになってしまいますので、なるべく避けたほうがよいです。むろんCA認証を購入していたりするなら別ですが、たぶん、その辺りはお分かりになっていないと思います。(実際、プロになるつもりでなければ、知らなくて良いです。昔、MS側で試用認証を無料で配布されたような覚えがあるのですが、今は、結構値段の張るものになってしまいました。) >このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。 [プロテクトをなし]にしても、現行のプロテクトの設定なら、あまり大きく変わりません。 本来は、[シート構成]と[ウィンドウ]の両方をプロテクトして、始めてブックの保護が生きるはずです。 以下のマクロでは、この部分です。 .Protect PSW, False, True → .Protect PSW, True, True ただし、扱いが面倒になります。 そもそもの話になるのですが、そのコードは、Excel2003 時代に知られていたマクロです。ただし、リンク先のコードや文章の内容については、いくつか気になる点がないわけではないのですが、一応、コードの方はちゃんと動きます。 これ以上、ごちゃごちゃ書いたところで、あまり理解してもらえないような気がしますから、コードを残しておきます。もう、VBAは足を洗ったつもりで、最近、ほとんど書いていませんが、試しに書いてみました。 '// '-------- '注意:最初に、予めあるウィンドウのパスワードは空にしておいてください。 'その上で、マクロでパスワードを入れてください。現在の設定は、[シート構成]のみになっています。 'また、ダミーシートは必ず必要です。そこには、適当にメッセージを入れてください。 '最初に、マクロは起動状態にして、保存しないと正しい状態にはなりません。 '--------- 'ThisWorkbook モジュール Option Explicit Private Const PSW As String = "PWS01" 'パスワード Private Sub Workbook_Open() AlterVisSheet True Me.Saved = False End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) ' 保存されているかチェック With Me If .Saved Then Exit Sub Select Case MsgBox("Do You Want to Save Changes", vbQuestion + vbYesNoCancel, "Microsoft Excel") Case vbYes AlterVisSheet False Application.EnableEvents = False .Save Application.EnableEvents = False Case vbNo .Saved = True Case vbCancel Cancel = True End Select End With End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) With Me AlterVisSheet False Application.ScreenUpdating = False Application.EnableEvents = False .Save Application.EnableEvents = False AlterVisSheet True Application.ScreenUpdating = True Cancel = True End With End Sub Sub AlterVisSheet(arg As Boolean) 'arg = False 隠す; True 表示 Dim sh As Object With Me .Unprotect PSW If .Saved = arg Then .Saved = False On Error Resume Next For Each sh In .Sheets 'グラフシートも含める If Not sh.Name Like "ダミー*" Then sh.Visible = IIf(arg, xlSheetVisible, xlSheetVeryHidden) Else sh.Visible = IIf(arg, xlSheetVeryHidden, xlSheetVisible) End If Next sh On Error GoTo 0 .Protect PSW, False, True End With End Sub '//
その他の回答 (3)
- WindFaller
- ベストアンサー率57% (465/803)
補足です。 このマクロの仕組みは、 (0) 最初に、「ダミー」シートのみの状態で保存します。 (1) マクロが起動すれば、その「ダミー」シートは隠れて、他のシートが逆に現れます。 マクロが起動しなければ、本来は「ダミー」シートのみです。 この間に、マクロ・On の状態にするというのがふつうです。 (2) 終了時には、マクロが起動して、「ダミー」シートのみの状態に戻ります。 (ある意味で、ブックには、ここで変更が加えられます。) 完全に元に戻っていない状態で保存すれば、次回の起動で、元に戻っていない形で現れます。 ところで、マイクロソフト側では、 IRM(Windows Right Management) を薦めています。調べてみてください。 私個人は、実務では用いたことはないのですが、試験的には何度も使っています。 この機能は、使う人を限定するという考え方です。 残念ながら、Professional 版のみにしか機能はありません。 デジタル署名に関しては、昔は、それでも良かったのですが、現在では、最終的なブック の変更自体が利かなくなってしまいますので、お勧めできません。 今回のマクロは、結果的には、現状の方法では、私自身は、満足するものにはならないと思っています。
お礼
このマクロのしていたことが、ようやく少しわかりました。 すでに変更を加えてあるとはそういうことだったのですね。 また、先ほど、職場のPCと家のPCで動きが違った理由がわかりました。 IRMなる機能があるのですね。 今回は活用できそうにありませんが、覚えておきます。 ありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
最初に、私は、もう最近VBAそのものは書いていませんが、今回、たまたま、見覚えのあるコードでしたので、お話に乗っただけです。だから、あまり話を長引かされても、事情があって、ずっとお付き合いできそうにもありません。だからといって、私は、別の質問を立ててくれ、というようなことを言うつもりもありません。 現実に、この種のマクロが必要なのですか? 何か、デジタル証明についても、お聞きになろうとしていた様子でしたが。 単なるVBAの勉強ですか?何か、お困りのことがあるのですか? 私が、納得できるような条件のお話があれば別ですが、そもそも、とても実用的にはナンセンスなマクロだと思います。実際、マクロは使いたくないというユーザーに、Excelは使わせないというような目的のマクロでは、無理があります。 (1) ですから、基本的には、私は、このマクロを実用的に使っていただくつもりはないし、Excel 2003用のコードを、Excel 2010 で使用するには条件が違いすぎて、問題が残ると考えています。 #2の説明が悪かったようですが、マクロを無効にしても、マクロを利用するという変更をしてもらわないと、ダメだということです。 ・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの [マクロの設定]の「警告を表示してすべてのマクロを無効にする」という設定と、 ・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼することを許可する」にチェックをいれていること、 最終的には、こういう条件にしないと、マクロは結果的に動かないということです。 その上で、自分のPCで行う時には、信頼済みドキュメントをすべてクリアして、信頼されていない状態にする。[クリア(C)]をクリック。そして、マクロで終了させる、ということです。 >2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表示されてしまいます。 とおっしゃられても、おそらく、環境設定自体が違っているのだろうと思います。つまり、マクロ自体が動いていない状態で、保存しているようです。マクロ自体の理解が出来ていないからだと思います。 もともと、マクロはが動いていない状態で開くことであり、それで、マクロを稼働させて、オシマイということです。「毎回」という条件ではないのです。そこらがよくお分かりなっていないようです。 (2) は、表示そのものをコマンドで止めているはずで、そのようなはずはないはずですが、PCのスペックの問題かもしれません。しかし、これも、そもそもになるのですが、「ダミー」シートを残すという発想自体の切り替えをしなければならないはずです。リンク先では、1つでしたが、多数ある場合は、Windowの非表示に変えれば、シートの表示・非表示などの切り替えなどは発生しません。ただし、メッセージも見えません。 (3) >変更を加えていなくても閉じるときにメッセージが出るのですが、 それは、いずれにしても、マクロで変更している部分があるわけですから、その後に、Saved =True の部分を、入れればよいのだと思いますが……。これそのものが、基本的には、1回きりのマクロで、何度も使うことは想定されていません。 (4) >パスワードを設定してようですが、ブックを保護したり、解除したりするしている この話も、「そもそも論」になってしまうと思います。 すでに、この答えは、書いたはずですが、ウィンドウの構成などをユーザーにいじらせていいなら、ある程度のExcelの知識のある人なら、自由に扱ってしまうだけでなく、そのようなシートの表示・非表示のマクロそのものが不要なはずです。しかし、いずれ、ウィンドウを構成をいじれば、マクロ側にエラーが発生するわけです。 もう少し、大局的に考えてみたほうがよいと思います。
お礼
長引いてしまって、すみません。 今回も丁寧なご回答ありがとうございました。 同じマクロを職場のPCと家のPCで使ってみたのですが、なぜか動きが少し違いました。 ご指摘のとおり今回はこうしたマクロを使わない方法で対処することにしました。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 ご質問に書かれたマクロは、マクロが機能していれば、編集用のシートを表示し、そうでなければ、ダミーを開くというものだと思いますが、そのコードは、Excel 2010 では、1回きりのもので、「マクロの警告メッセージ」のチェックを、有効にしてしまえば、それ以降は、「信頼済みのドキュメント」になってしまい、以降は、そのまま通りますので、あまり使えるものではありません。過去のバージョンなら有効だとは思います。 >強制的にマクロを有効にするようなVBAは、どのように組めば良いか、ご教授願います。 しかし、それは、私には答えられません。それは、ここの掲示板のような公開された場所では、禁止された行為です。書けば、すぐに削除されるはずです。ワーム・ウィルスをそのまま向かい入れることになるからです。 掲示板の規約の[保護手段の回避技術公開につながる記述]に該当します。 >マクロが有効になっていない場合は、ファイルは開けるものの、注意喚起のメッセージボックスを有効にするまで表示させるような設定にすることは可能でしょうか。 それは、無理です。だから、ダミーシートに、「マクロを有効にしてください」などと、メッセージを書いているわけです。MsgBox そのものが、VBAで動くものですし、仮に、他のマクロ(Ver.4)でも、現在ではマクロの対象とされています。 質問のマクロをどのブックでも有効にするには、同じパスワードとシートを同じスタイルにしてやる必要あるものの、Personal.xlsm のクラスモジュールに、イベントを書いてやればできるような気がします。一つのブックならともかく、複数のものに設定することはやったことがありません。一回きりのものに、そのような大掛かりなマクロが必要かどうか疑問です。 '-------Class Module ------------- Private WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) ' ↓ End Sub 'ThisWorkbook側で Private Sub Workbook_Open() Set App = Application End Sub
お礼
おはようございます。ご回答ありがとうございます。 強制的に解除することはできないとのこと、承知しました。 >質問のマクロをどのブックでも有効にするには、同じパスワードとシートを同じスタイルにしてやる必要あるものの、Personal.xlsm のクラスモジュールに、イベントを書いてやればできるような気がします。一つのブックならともかく、複数のものに設定することはやったことがありません。一回きりのものに、そのような大掛かりなマクロが必要かどうか疑問です。 どのブックでも有効にしようとは考えているのではなく、1つの特定のブックのみ有効にしたいと考えております。 質問に記載したコードだと、シートが「ダミー」と「編集用」の2枚で構成されたブックであればよいのですが、私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。 ダミーのシートは最初の1枚目に追加すれば良いとして、質問に書いたコードを修正して使用することは可能でしょうか。 また、このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。
お礼
毎度、ありがとうございます。 書いていただいたコードで試してみたのですが、以下の点がうまくいかなかったり、 気になったりしました。 (1)初回はマクロが有効になっていない場合、ダミーのシートのみ表示されましたが、 2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表 示されてしまいます。 (2)ブックを開くときに、画面上でそれぞれのシートが目まぐるしく切り替わって開いていく。 (これはマクロである以上、不可避かもしれませんが) (3)変更を加えていなくても閉じるときにメッセージが出るのですが、通常のエクセル のように変更を加えているのにもかかわらず上書き保存をせずに閉じるときのみ メッセージを表示させることは可能でしょうか。 (4)パスワードを設定してようですが、ブックを保護したり、解除したりするしている のでしょうか。そこはなくしてしまっても良いのでしょうか。 お答えいただけると幸いです。 よろしくお願いいたします。