プロが教えるわが家の防犯対策術!

エクセル2010を使っている者です。

マクロの入ったファイルを開くときに、強制的にマクロを有効にするようなVBAは
どのように組めば良いか、ご教授願います。

ネットで調べてみると、以下のものが見つかりました。
http://www.saka-en.com/office/vba-open-the-macro …

1 Option Explicit
2
3'**
4 ' ワークブックオープン
5'**
6 Private Sub Workbook_Open()
7 ThisWorkbook.Unprotect Password:="password"
8 On Error Resume Next
9 If ThisWorkbook.Sheets("編集用").Visible <> True Then ThisWorkbook.Sheets("編集用").Visible = True
10 If ThisWorkbook.Sheets("ダミー").Visible <> False Then ThisWorkbook.Sheets("ダミー").Visible = False
11 ThisWorkbook.Protect Password:="password"
12 'ThisWorkbook.RunAutoMacros Which:=xlAutoOpen
13 On Error GoTo 0
14 Exit Sub
15 End Sub
16
17 '**

18' ワークブックを閉じる前
19 '**
20 Private Sub Workbook_BeforeClose(Cancel As Boolean)
21 Dim Answer As Long
22' 保存されているかチェック
23 If ThisWorkbook.Saved = False Then
24 Answer = MsgBox("Do you want to save the changes to the '" & ThisWorkbook.Name & "' ?", vbExclamation + vbOKCancel, "Microsoft Excel")
25 Select Case Answer
26 Case vbCancel
27 Cancel = True
28 Exit Sub
29 End Select
30 End If
31 ThisWorkbook.Unprotect Password:="password"
32 On Error Resume Next
33 If ThisWorkbook.Sheets("ダミー").Visible <> True Then ThisWorkbook.Sheets("ダミー").Visible = True
34 If ThisWorkbook.Sheets("編集用").Visible <> False Then ThisWorkbook.Sheets("編集用").Visible = False
35 ThisWorkbook.Protect Password:="password"
36 ThisWorkbook.Save
37 End Sub

しかし、このコードだと、編集するシートが1枚であれば良いのですが、何枚もある場合や、随時、シートを追加していくようなファイルの場合は修正が必要だと思います。
どのように修正すれば良いのでしょうか。
もしくは、例えば、マクロが有効になっていない場合は、ファイルは開けるものの、注意喚起のメッセージボックスを有効にするまで表示させるような設定にすることは可能でしょうか。

ご教授いただけると幸いです。
よろしくお願いいたします。

A 回答 (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

'//
    • good
    • 2
この回答へのお礼

毎度、ありがとうございます。

書いていただいたコードで試してみたのですが、以下の点がうまくいかなかったり、
気になったりしました。

(1)初回はマクロが有効になっていない場合、ダミーのシートのみ表示されましたが、
2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表
示されてしまいます。

(2)ブックを開くときに、画面上でそれぞれのシートが目まぐるしく切り替わって開いていく。
(これはマクロである以上、不可避かもしれませんが)

(3)変更を加えていなくても閉じるときにメッセージが出るのですが、通常のエクセル
のように変更を加えているのにもかかわらず上書き保存をせずに閉じるときのみ
メッセージを表示させることは可能でしょうか。

(4)パスワードを設定してようですが、ブックを保護したり、解除したりするしている
のでしょうか。そこはなくしてしまっても良いのでしょうか。

お答えいただけると幸いです。
よろしくお願いいたします。

お礼日時:2014/11/27 18:24

補足です。



このマクロの仕組みは、
(0) 最初に、「ダミー」シートのみの状態で保存します。
(1) マクロが起動すれば、その「ダミー」シートは隠れて、他のシートが逆に現れます。
  マクロが起動しなければ、本来は「ダミー」シートのみです。

  この間に、マクロ・On の状態にするというのがふつうです。

(2) 終了時には、マクロが起動して、「ダミー」シートのみの状態に戻ります。
  (ある意味で、ブックには、ここで変更が加えられます。)
  完全に元に戻っていない状態で保存すれば、次回の起動で、元に戻っていない形で現れます。
  

ところで、マイクロソフト側では、
IRM(Windows Right Management) を薦めています。調べてみてください。
私個人は、実務では用いたことはないのですが、試験的には何度も使っています。
この機能は、使う人を限定するという考え方です。
残念ながら、Professional 版のみにしか機能はありません。

デジタル署名に関しては、昔は、それでも良かったのですが、現在では、最終的なブック
の変更自体が利かなくなってしまいますので、お勧めできません。

今回のマクロは、結果的には、現状の方法では、私自身は、満足するものにはならないと思っています。
    • good
    • 0
この回答へのお礼

このマクロのしていたことが、ようやく少しわかりました。
すでに変更を加えてあるとはそういうことだったのですね。

また、先ほど、職場のPCと家のPCで動きが違った理由がわかりました。

IRMなる機能があるのですね。
今回は活用できそうにありませんが、覚えておきます。

ありがとうございました。

お礼日時:2014/12/06 17:36

最初に、私は、もう最近VBAそのものは書いていませんが、今回、たまたま、見覚えのあるコードでしたので、お話に乗っただけです。

だから、あまり話を長引かされても、事情があって、ずっとお付き合いできそうにもありません。だからといって、私は、別の質問を立ててくれ、というようなことを言うつもりもありません。

現実に、この種のマクロが必要なのですか?
何か、デジタル証明についても、お聞きになろうとしていた様子でしたが。
単なるVBAの勉強ですか?何か、お困りのことがあるのですか?

私が、納得できるような条件のお話があれば別ですが、そもそも、とても実用的にはナンセンスなマクロだと思います。実際、マクロは使いたくないというユーザーに、Excelは使わせないというような目的のマクロでは、無理があります。

(1)
ですから、基本的には、私は、このマクロを実用的に使っていただくつもりはないし、Excel 2003用のコードを、Excel 2010 で使用するには条件が違いすぎて、問題が残ると考えています。

#2の説明が悪かったようですが、マクロを無効にしても、マクロを利用するという変更をしてもらわないと、ダメだということです。

・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの
[マクロの設定]の「警告を表示してすべてのマクロを無効にする」という設定と、

・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼することを許可する」にチェックをいれていること、

最終的には、こういう条件にしないと、マクロは結果的に動かないということです。

その上で、自分のPCで行う時には、信頼済みドキュメントをすべてクリアして、信頼されていない状態にする。[クリア(C)]をクリック。そして、マクロで終了させる、ということです。

>2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表示されてしまいます。
とおっしゃられても、おそらく、環境設定自体が違っているのだろうと思います。つまり、マクロ自体が動いていない状態で、保存しているようです。マクロ自体の理解が出来ていないからだと思います。
もともと、マクロはが動いていない状態で開くことであり、それで、マクロを稼働させて、オシマイということです。「毎回」という条件ではないのです。そこらがよくお分かりなっていないようです。

(2) は、表示そのものをコマンドで止めているはずで、そのようなはずはないはずですが、PCのスペックの問題かもしれません。しかし、これも、そもそもになるのですが、「ダミー」シートを残すという発想自体の切り替えをしなければならないはずです。リンク先では、1つでしたが、多数ある場合は、Windowの非表示に変えれば、シートの表示・非表示などの切り替えなどは発生しません。ただし、メッセージも見えません。

(3)
>変更を加えていなくても閉じるときにメッセージが出るのですが、
それは、いずれにしても、マクロで変更している部分があるわけですから、その後に、Saved =True の部分を、入れればよいのだと思いますが……。これそのものが、基本的には、1回きりのマクロで、何度も使うことは想定されていません。

(4)
>パスワードを設定してようですが、ブックを保護したり、解除したりするしている
この話も、「そもそも論」になってしまうと思います。

すでに、この答えは、書いたはずですが、ウィンドウの構成などをユーザーにいじらせていいなら、ある程度のExcelの知識のある人なら、自由に扱ってしまうだけでなく、そのようなシートの表示・非表示のマクロそのものが不要なはずです。しかし、いずれ、ウィンドウを構成をいじれば、マクロ側にエラーが発生するわけです。

もう少し、大局的に考えてみたほうがよいと思います。
    • good
    • 0
この回答へのお礼

長引いてしまって、すみません。
今回も丁寧なご回答ありがとうございました。

同じマクロを職場のPCと家のPCで使ってみたのですが、なぜか動きが少し違いました。
ご指摘のとおり今回はこうしたマクロを使わない方法で対処することにしました。

お礼日時:2014/12/06 16:55

こんにちは。



ご質問に書かれたマクロは、マクロが機能していれば、編集用のシートを表示し、そうでなければ、ダミーを開くというものだと思いますが、そのコードは、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
    • good
    • 0
この回答へのお礼

おはようございます。ご回答ありがとうございます。

強制的に解除することはできないとのこと、承知しました。

>質問のマクロをどのブックでも有効にするには、同じパスワードとシートを同じスタイルにしてやる必要あるものの、Personal.xlsm のクラスモジュールに、イベントを書いてやればできるような気がします。一つのブックならともかく、複数のものに設定することはやったことがありません。一回きりのものに、そのような大掛かりなマクロが必要かどうか疑問です。

どのブックでも有効にしようとは考えているのではなく、1つの特定のブックのみ有効にしたいと考えております。
質問に記載したコードだと、シートが「ダミー」と「編集用」の2枚で構成されたブックであればよいのですが、私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。
ダミーのシートは最初の1枚目に追加すれば良いとして、質問に書いたコードを修正して使用することは可能でしょうか。

また、このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。

お礼日時:2014/11/25 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A