2013-03-07 58 views
1

有人能告诉我如何解锁我受保护的excel文件的vba项目吗?如何从C#中的excel文件解锁受保护的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; 
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); 

我已经把假的代码按照我的补偿规则。
请仔细检查一下,并告诉我我的代码有什么问题。

+0

你在[芯片皮尔森:VBE一些更多的阅读(http://www.cpearson.com/excel/vbe.htm),[Excel的先生 - 解锁VBV项目(HTTP:/ /www.mrexcel.com/forum/excel-questions/59402-code-unprotect-vbaproject.html), [Ozgrid](http://www.ozgrid.com/forum/showthread.php?t=13006) – 2013-03-07 12:56:35

+0

@菲利普:请检查我修改后的帖子。我正在寻找C#代码来解锁我的vba项目。 – user2144293 2013-03-07 13:08:28

+0

我其实需要在excel vb项目中添加一些宏。所以为了增加我的解锁权? – user2144293 2013-03-07 14:09:33

回答

0

不幸的是,VBA不会在其对象模型中公开VBProject密码。因此,通过解决方法来实现您想要的唯一方法。

通常的做法是使用SendKeys来模拟将用于输入项目密码的击键。但是,您应该意识到,这种方法并不是特别可靠,我当然不希望在我分配或销售的产品中使用它,或者在可能影响金钱或声誉的任何地方投入生产。

下面是代码,我在Ozgrid Forums发现(最初是由比尔·曼维尔写的)一个例子:

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

相关问题