2017-04-18 13 views
0

エラー1004を表示せずにvbaの1行を削除することが可能かどうかは現在疑問に思っています。私はユーザーが設定に入り、vbaプロジェクトオブジェクトモデルへのアクセスを信頼する必要はありません。これは可能ですか? 現在のコード(選択されていないを信頼していない場合は、エラーが発生した): ActiveWorkbook.Application.VBE.ActiveVBProject.VBComponents("Sheet1").CodeModule.DeleteLines 170, 1vbaでexcel vbaの1行を削除する

+0

それを「選択」しないようにするためには、そこにコードがあるが、そう短くありません... –

+0

私の答えとコードを参照してください、私は使用しているオートツールのいくつかでそれを使用します –

答えて

2

私は、ユーザーがVBAプロジェクトオブジェクトモデルへの設定と信頼アクセスに行かなければならないしたくありません。これは可能ですか?

いいえ、これはセキュリティ機能です。プログラムでVBAを使用してこのセキュリティ設定を切り替えることは不可能です。

Microsoft(強調追加)あたり:

この設定は、開発者のためのものであり、故意 をロックアウト、または任意 オートメーションクライアントからVBAオブジェクトモデルへのプログラムによるアクセスを可能にするために使用されます。つまり、 のセキュリティオプションをOfficeプログラムを自動化するために作成し、 アプリケーション(VBA)環境とオブジェクトモデルのMicrosoft Visual Basicをプログラムで操作します。これはユーザーごとに とアプリケーションごとの設定であり、デフォルトではアクセスが拒否されます。この セキュリティオプションを使用すると、承認されていないプログラムがエンドユーザーシステムに影響を与える可能性のある「自己複製」コードを構築するのがより困難になります。 オートメーションクライアントがVBAオブジェクトモデル にプログラムでアクセスできるようにするには、コードを実行しているユーザーが明示的に アクセスを許可する必要があります。アクセスを有効にするには、チェックボックスをオンにします。

+0

アクセスを信頼することなくマクロの1行を削除する方法はありません? – Noisewater

+0

アプリケーションレベルの設定として明示的に許可せずに、プログラムでVBAプロジェクトオブジェクトモデルにアクセスする方法はありません。 –

1

あなたはそれがあなたのニーズに合うかどうかを確認、次のコードのようなものを試みることができる:

Option Explicit 

Sub CheckTrustAccess_toVBAProjModule() 

' display Windows Version installed on this PC 
' Win7.  (=6.1, 64bit) 
' Win8  (=6.2, 64bit) 
' Win8.1  (=6.3*) 
' Win10  (=10.0*) 
' 
' MsgBox "Windows Version is: " & getVersion 

Dim TrustAccess_VBAProjModule_Path   As String 
Dim TrustAccess_VBAProjModule    As Integer 

' ----- first check if "Trust Access to the VBA Project module is on ------ 
TrustAccess_VBAProjModule_Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM" 

' check if Trust Access to the VBA Projct Module in the Registry is 1 or 0 
TrustAccess_VBAProjModule = CInt(RegKeyRead(TrustAccess_VBAProjModule_Path)) 

If TrustAccess_VBAProjModule = 1 Then 
    ' run your code here ... 


Else ' need to auto-click the "v" by modifying the registry settings 

    ' loop until Trust Access to the VBA Projct Module in the Registry is 1 
    ' it might take time to modify, so use this instead of timers 
    While TrustAccess_VBAProjModule = 0 
     Call RegKeySave(TrustAccess_VBAProjModule_Path, "1") 

     TrustAccess_VBAProjModule = CInt(RegKeyRead(TrustAccess_VBAProjModule_Path)) 
    Wend 
    MsgBox "Initiated VBA settings, please run the Export again", vbInformation 
End If 

End Sub 

'=========================================================== 

Function RegKeyRead(i_RegKey As String) As String 

' reads the value for the registry key i_RegKey 
' if the key cannot be found, the return value is "" 
' Link : http://vba-corner.livejournal.com/3054.html 

Dim myWS As Object 

On Error Resume Next 
'access Windows scripting 
Set myWS = CreateObject("WScript.Shell") 
'read key from registry 
RegKeyRead = myWS.RegRead(i_RegKey) 

End Function 

'=========================================================== 

Sub RegKeySave(i_RegKey As String, i_Value As String, Optional i_Type As String = "REG_DWORD") 

' sets the registry key i_RegKey to the value i_Value with type i_Type 
' if i_Type is omitted, the value will be saved as string 
' if i_RegKey wasn't found, a new registry key will be created 
' Link : http://vba-corner.livejournal.com/3054.html 

Dim myWS As Object 

'access Windows scripting 
Set myWS = CreateObject("WScript.Shell") 
'write registry key 
myWS.RegWrite i_RegKey, i_Value, i_Type 

End Sub 
+0

@Noisewaterあなたは上記の私のコードを見ましたか?それがあなたの必要に合っているかどうかを調べようとしましたか? –

+0

これをテストしただけで動作します。ユーザーがアドインを2回クリックするのは大きな問題ではありません。ありがとう! – Noisewater

+0

ただ1つの問題。チェックを行いますが、信頼できない場合はチェックボックスをオンにします。ユーザーがセキュリティセンター/マクロセキュリティを開き、[OK]を選択した場合にのみ機能します。これは正しい方向の一歩ですが、ユーザーはまだ正式なOKを与える必要があります。 – Noisewater

関連する問題