
エクセル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枚であれば良いのですが、何枚もある場合や、随時、シートを追加していくようなファイルの場合は修正が必要だと思います。
どのように修正すれば良いのでしょうか。
もしくは、例えば、マクロが有効になっていない場合は、ファイルは開けるものの、注意喚起のメッセージボックスを有効にするまで表示させるような設定にすることは可能でしょうか。
ご教授いただけると幸いです。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
こんにちは。
>私が有効にしたいと考えているブックは、最初の時点でシートが何枚もあり、使用しているうちに新しいシートを追加していくタイプのものです。
最初に、そのマクロ自体は、試してみたのですか?
ダミーだけ残して、後は、非表示にするというだけのことですから、そんなに、難しい話ではないと思います。ただし、二つの条件があります。
・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの
[マクロの設定]の「警告を表示せずにすべてのマクロを無効にする」という設定と、
・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼する」にチェックを外していることです。
それで、マクロが動かないようにしている相手は、いずれにしても、その設定自体を変えてもらう必要があると思いますが、実際、そういう相手は、「マクロ」自体を使わないという規則があったりします。
それから、リンク先のデジタル署名については、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
'//
毎度、ありがとうございます。
書いていただいたコードで試してみたのですが、以下の点がうまくいかなかったり、
気になったりしました。
(1)初回はマクロが有効になっていない場合、ダミーのシートのみ表示されましたが、
2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表
示されてしまいます。
(2)ブックを開くときに、画面上でそれぞれのシートが目まぐるしく切り替わって開いていく。
(これはマクロである以上、不可避かもしれませんが)
(3)変更を加えていなくても閉じるときにメッセージが出るのですが、通常のエクセル
のように変更を加えているのにもかかわらず上書き保存をせずに閉じるときのみ
メッセージを表示させることは可能でしょうか。
(4)パスワードを設定してようですが、ブックを保護したり、解除したりするしている
のでしょうか。そこはなくしてしまっても良いのでしょうか。
お答えいただけると幸いです。
よろしくお願いいたします。
No.4
- 回答日時:
補足です。
このマクロの仕組みは、
(0) 最初に、「ダミー」シートのみの状態で保存します。
(1) マクロが起動すれば、その「ダミー」シートは隠れて、他のシートが逆に現れます。
マクロが起動しなければ、本来は「ダミー」シートのみです。
この間に、マクロ・On の状態にするというのがふつうです。
(2) 終了時には、マクロが起動して、「ダミー」シートのみの状態に戻ります。
(ある意味で、ブックには、ここで変更が加えられます。)
完全に元に戻っていない状態で保存すれば、次回の起動で、元に戻っていない形で現れます。
ところで、マイクロソフト側では、
IRM(Windows Right Management) を薦めています。調べてみてください。
私個人は、実務では用いたことはないのですが、試験的には何度も使っています。
この機能は、使う人を限定するという考え方です。
残念ながら、Professional 版のみにしか機能はありません。
デジタル署名に関しては、昔は、それでも良かったのですが、現在では、最終的なブック
の変更自体が利かなくなってしまいますので、お勧めできません。
今回のマクロは、結果的には、現状の方法では、私自身は、満足するものにはならないと思っています。
このマクロのしていたことが、ようやく少しわかりました。
すでに変更を加えてあるとはそういうことだったのですね。
また、先ほど、職場のPCと家のPCで動きが違った理由がわかりました。
IRMなる機能があるのですね。
今回は活用できそうにありませんが、覚えておきます。
ありがとうございました。
No.3
- 回答日時:
最初に、私は、もう最近VBAそのものは書いていませんが、今回、たまたま、見覚えのあるコードでしたので、お話に乗っただけです。
だから、あまり話を長引かされても、事情があって、ずっとお付き合いできそうにもありません。だからといって、私は、別の質問を立ててくれ、というようなことを言うつもりもありません。現実に、この種のマクロが必要なのですか?
何か、デジタル証明についても、お聞きになろうとしていた様子でしたが。
単なるVBAの勉強ですか?何か、お困りのことがあるのですか?
私が、納得できるような条件のお話があれば別ですが、そもそも、とても実用的にはナンセンスなマクロだと思います。実際、マクロは使いたくないというユーザーに、Excelは使わせないというような目的のマクロでは、無理があります。
(1)
ですから、基本的には、私は、このマクロを実用的に使っていただくつもりはないし、Excel 2003用のコードを、Excel 2010 で使用するには条件が違いすぎて、問題が残ると考えています。
#2の説明が悪かったようですが、マクロを無効にしても、マクロを利用するという変更をしてもらわないと、ダメだということです。
・このマクロの使用条件は、標準設定ですが、セキュリティ・センターの
[マクロの設定]の「警告を表示してすべてのマクロを無効にする」という設定と、
・[信頼済みドキュメント]の「ネットワーク上のドキュメントを信頼することを許可する」にチェックをいれていること、
最終的には、こういう条件にしないと、マクロは結果的に動かないということです。
その上で、自分のPCで行う時には、信頼済みドキュメントをすべてクリアして、信頼されていない状態にする。[クリア(C)]をクリック。そして、マクロで終了させる、ということです。
>2回目以降はダミーのシートを非表示にしたいところ、毎回、他のシートと同様に表示されてしまいます。
とおっしゃられても、おそらく、環境設定自体が違っているのだろうと思います。つまり、マクロ自体が動いていない状態で、保存しているようです。マクロ自体の理解が出来ていないからだと思います。
もともと、マクロはが動いていない状態で開くことであり、それで、マクロを稼働させて、オシマイということです。「毎回」という条件ではないのです。そこらがよくお分かりなっていないようです。
(2) は、表示そのものをコマンドで止めているはずで、そのようなはずはないはずですが、PCのスペックの問題かもしれません。しかし、これも、そもそもになるのですが、「ダミー」シートを残すという発想自体の切り替えをしなければならないはずです。リンク先では、1つでしたが、多数ある場合は、Windowの非表示に変えれば、シートの表示・非表示などの切り替えなどは発生しません。ただし、メッセージも見えません。
(3)
>変更を加えていなくても閉じるときにメッセージが出るのですが、
それは、いずれにしても、マクロで変更している部分があるわけですから、その後に、Saved =True の部分を、入れればよいのだと思いますが……。これそのものが、基本的には、1回きりのマクロで、何度も使うことは想定されていません。
(4)
>パスワードを設定してようですが、ブックを保護したり、解除したりするしている
この話も、「そもそも論」になってしまうと思います。
すでに、この答えは、書いたはずですが、ウィンドウの構成などをユーザーにいじらせていいなら、ある程度のExcelの知識のある人なら、自由に扱ってしまうだけでなく、そのようなシートの表示・非表示のマクロそのものが不要なはずです。しかし、いずれ、ウィンドウを構成をいじれば、マクロ側にエラーが発生するわけです。
もう少し、大局的に考えてみたほうがよいと思います。
長引いてしまって、すみません。
今回も丁寧なご回答ありがとうございました。
同じマクロを職場のPCと家のPCで使ってみたのですが、なぜか動きが少し違いました。
ご指摘のとおり今回はこうしたマクロを使わない方法で対処することにしました。
No.1
- 回答日時:
こんにちは。
ご質問に書かれたマクロは、マクロが機能していれば、編集用のシートを表示し、そうでなければ、ダミーを開くというものだと思いますが、そのコードは、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枚目に追加すれば良いとして、質問に書いたコードを修正して使用することは可能でしょうか。
また、このコードでは、ブックを保護して解除して保護するという動きをしているようなのですが、その流れは必要なのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
電子書籍プレゼントキャンペーン!
最大2万円超分当たる!マンガや小説が読める電子書籍サービス『Renta!』で利用できるギフトコードプレゼント実施中!
-
エクセルマクロを有効にしないとファイルが開けないようにする方法
Excel(エクセル)
-
マクロを強制的に有効にする方法
Windows Vista・XP
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
4
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
5
Application.Runエラー(1004)
Excel(エクセル)
-
6
ファイルのアクセス回数について
Access(アクセス)
-
7
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
8
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
9
エクセルファイルを開く時、常に同じシートから開くようにするには?
Windows Vista・XP
-
10
ExcelVBAで質問です。Workbook_openイベントが発生し
その他(Microsoft Office)
-
11
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
12
EXCELファイルに誰がアクセスしたかを見たい
Access(アクセス)
-
13
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
14
EXCELのVBAでRange(A1:C4")を変数にする方法を教え"
Visual Basic(VBA)
-
15
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
16
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
17
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
18
EXCEL VBA で指定した範囲に入力があるかどうか?
Visual Basic(VBA)
-
19
エクセルで誰が今開いているか調べる方法。
Excel(エクセル)
-
20
VBAのテキストボックスに文字列を貼り付ける方法
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
EXCELのマクロが他のパソコンで...
-
5
LDPlayerのマクロの編集方法を...
-
6
エクセルの、記録を終了したマ...
-
7
Ctrl+Zが使えない
-
8
リーグ戦(10チーム2コート)作...
-
9
旅費精算ソフトについて
-
10
エクセル マクロ名にブック名...
-
11
WORDを使って印刷部数分の連番...
-
12
EndモードにしないEndキー
-
13
エクセルで明日の日付を表示す...
-
14
マクロ実行ボタンを自動削除したい
-
15
エクセルのマクロの記録状況を...
-
16
エクセルマクロで、別のブック...
-
17
マクロで並べ替えを複数のシー...
-
18
マクロの保存先を変更するには
-
19
vbaの勉強をしたいのですが、Of...
-
20
(Excel VBA)シートコピー時マ...
おすすめ情報
公式facebook
公式twitter