1

保護された Excel ファイルの vba プロジェクトのロックを解除する方法を誰か教えてもらえませんか?

以下のC#コードで試しました:

Exc.wbook = (Excel._Workbook)Exc.Workbooks.Open(FilePath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true);
Exc.VBE.ActiveVBProject = Exc.wbook.VBProject;
Exc.Visible = true;
SendKeys.SendWait("%{F11}^r{TAB}~" + sPrd + "~~%{F11}"); 

これは vbaproject のロックを解除しませんでした。

私もこのC#コードで試してみました....うまくいきませんでした。

Exc.wbook = (Excel._Workbook)Exc.Workbooks.Open(FilePath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true);
Exc.VBE.ActiveVBProject = Exc.wbook.VBProject;
Exc.Visible = true;
Exc.Unprotect(sPrd );

コンプルールに従うために偽のコードを入れました。
それを調べて、私のコードの何が問題なのか教えてください。

4

1 に答える 1

0

残念ながら、VBA はそのオブジェクト モデルで VBProject のパスワードを公開していません。したがって、目的を達成する唯一の方法は、回避策を使用することです。

通常のアプローチは、SendKeys を使用して、プロジェクトのパスワードを入力するために使用されるキーストロークをシミュレートすることです。ただし、このアプローチは特に信頼できるものではないことに注意してください。私が配布または販売している製品で使用したり、お金や評判に影響を与える可能性のある場所で生産したりする危険を冒したくはありません。

以下は、 Ozgrid フォーラムで見つけたコードの例です(元は Bill Manville によって書かれました)。

VB:

'need reference To VBA Extensibility 
'need To make sure that the target project Is the active project 
Sub test() 
    UnprotectVBProject Workbooks("ABook.xls"), "password" 
End Sub 

Sub UnprotectVBProject(WB As Workbook, ByVal Password As String) 
' 
' Bill Manville, 29-Jan-2000 
' 
Dim VBP As VBProject, oWin As VBIDE.Window 
Dim wbActive As Workbook 
Dim i As Integer 

Set VBP = WB.VBProject 
Set wbActive = ActiveWorkbook 

If VBP.Protection <> vbext_pp_locked Then Exit Sub 

Application.ScreenUpdating = False 

' Close any code windows To ensure we hit the right project 
For Each oWin In VBP.VBE.Windows 
    If InStr(oWin.Caption, "(") > 0 Then oWin.Close 
Next oWin 

WB.Activate 
' now use lovely SendKeys To unprotect 
Application.OnKey "%{F11}" 
SendKeys "%{F11}%TE" & Password & "~~%{F11}", True 

If VBP.Protection = vbext_pp_locked Then 
    ' failed - maybe wrong password 
    SendKeys "%{F11}%TE", True 
End If 

' leave no evidence of the password 
Password = "" 
' go back To the previously active workbook 
wbActive.Activate 

End Sub 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
Sub ProtectVBProject(WB As Workbook, ByVal Password As String) 

Dim VBP As VBProject, oWin As VBIDE.Window 
Dim wbActive As Workbook 
Dim i As Integer 

Set VBP = WB.VBProject 
Set wbActive = ActiveWorkbook 

' Close any code windows To ensure we hit the right project 
For Each oWin In VBP.VBE.Windows 
    If InStr(oWin.Caption, "(") > 0 Then oWin.Close 
Next oWin 

WB.Activate 
' now use lovely SendKeys To unprotect 
    Application.OnKey "%{F11}" 
    SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & Password & "~" 
    Application.VBE.CommandBars(1).FindControl(Id:=2578, recursive:=True).Execute 
    WB.Save 
End Sub 

ご自身の責任で使用してください。

HTH

于 2013-03-07T13:05:08.427 に答える