2017-06-22 31 views
3

「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」オプションが有効になっているかどうかを起動時にチェックするコードがあります。起動時にVBAからマクロセキュリティを開く

有効になっていない場合、ユーザーに簡単にアクセスできるようにマクロセキュリティ設定を開くためのプログラムが必要です。

ほとんどの場合、これを行うコードを作成しましたが、回避方法がわからないという問題が発生しました。次のように

コードは次のとおりです。

Private Sub Workbook_Open 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled" & vbNewLine & vbNewLine & _ 
    "Please allow access by ticking the checkbox in the window that appears after clicking Ok" 
    Application.CommandBars.ExecuteMso ("MacroSecurity") 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

このコードは、その仕事をして、マクロ設定がデフォルトにしない限り、私はマクロをアクティブにしてからランを取得した場合には、「通知にすべてのマクロを無効にします」 -2147467259(80004005)オブジェクト '_CommandBars'の 'ExecuteMso'メソッドが失敗しました。

このエラーは最初の起動時に発生します。連続した起動時にマクロをアクティブにする必要はないため、ファイルの場所。

私は2秒間マクロを一時停止しようとしましたが、それは私のために何もしなかったし、エラーを捕らえて再びApplication.CommandBars.ExecuteMso ("MacroSecurity")行を実行しようとしたエラーハンドラもありませんでした。それは同じエラーで終わった。

エラーがApplication.CommandBars.ExecuteMso ("MacroSecurity")行にあるとデバッガから通知されますが、そのエラーメッセージではあまり驚くことではありません。

+3

はあなたが火災で 'Application.OnTime'イベントを設定し、2秒を一時停止すると考える代わりにあり2秒? – CLR

+0

私は過去にこのようなことを試みましたが、それは簡単ではありません。なぜなら、悪意のあるコードがユーザーのコンピュータ上で実行されるのを防ぐために難しいことでした。これを行うことが可能だと確信していますが、自分自身で実行可能な解決策を見つけることはできませんでした。 – dwirony

+0

@dwirony以下のいくつかのソリューションを参照してください:) –

答えて

1

上記のコメントで@CLRによって提案されたような単純な解決策しかし、最初にテストしたときにはうまくいかなかった(ユーザーエラー!)。

Option Explicit 

Private Sub Workbook_Open() 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled. " & vbNewLine & _ 
    "Please allow access by ticking the checkbox in the window that appears" 
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.SetSecurity" 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

Sub SetSecurity(Optional foo) 
    Application.CommandBars.ExecuteMso "MacroSecurity" 
End Sub 

もう少し手の込んだ:ユーザーがクリックした後、セキュリティ設定ペインが開きますワークシートにMSForms.CommandButtonを追加し、すべてのコードがThisWorkbookモジュールになります。 MsgBoxにボタンをクリックし、セキュリティ設定を変更するようにユーザーに指示します。

Module1

、ボタンのClickイベントハンドラ:ThisWorkbookモジュールで

Option Explicit 
Sub Button1_Click() 
    Call ThisWorkbook.SetSecurity 
End Sub 

Option Explicit 

Private Sub Workbook_Open() 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled. " & vbNewLine & _ 
    "Please allow access by:" & vbNewLine & vbNewLine & _ 
    "1. Clicking the button on this sheet" & vbNewLine & _ 
    "2. Ticking the checkbox in the window that appears" 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

Sub SetSecurity(Optional foo) 
    Application.CommandBars.ExecuteMso "MacroSecurity" 
End Sub 
+0

これは私が望んでいたより精巧ではあるが、それを回避するのに最適な方法です。私はちょうどCLRが最初の投稿へのコメントで示唆した 'Application.Ontime'をテストすることに慣れています、そしてそれは実際にトリックを行います。 –

+0

本当ですか?私がApplication.OnTimeを試したとき、私は同じエラーがあると思った。 –

+0

Ahhh。うん、私はそれを試したときにいくつかの設定が間違っていた。私はこの答えにもそのオプションを追加します。 –

2

ここにボックス外で考えてみましょう...
シートに大きなメッセージを入れて、マクロをアクティブにしてから、自動開始マクロを削除または非表示にするとどうなりますか?それはメッセージを必要とする人に伝えますが、他の人には伝えません。

+0

私は自分の人生でコンピュータを使ったことがないユーザーのために完全に自動化されたシートを作っています。彼らがExcelの設定に入るように頼むのはただのメルトダウンを求めることなので、私はそれをすることはできません。私を信じてください、私は気に入っていますが、私はできません –

+1

@ChristianEmilJohansenこれは、あなたが望むように精巧にすることができます(詳細な手順とスクリーンショットのワークシートを参照)。デフォルトで表示しますが、 'VBATrusted'の場合は' Auto_Open'または 'Workbook_Open'イベントでそのシートを非表示にして、影響を受けていないユーザには表示されません。 –

+0

ボタンをクリックすると、ステップバイステップチュートリアルの 'Application.CommandBars.ExecuteMso(" MacroSecurity ")'が実行されます。そのため、Excelから「コンテンツを有効にする」と打ち込んだら、自分のボタンをクリックして設定を指示するだけです。 –

関連する問題