从在 Access 中以编程方式打开的 Excel 工作表中删除受保护的视图
Posted
技术标签:
【中文标题】从在 Access 中以编程方式打开的 Excel 工作表中删除受保护的视图【英文标题】:Remove protected view from Excel sheet opened programmatically in Access 【发布时间】:2014-09-17 11:47:25 【问题描述】:我有一个电子表格,我使用 Access 中的 VBA 以编程方式打开:
Set xl = CreateObject("Excel.Application")
With xl
Call RunASCFormatting(xl, wb, strPath)
'More code
Sub RunASCFormatting(xl As Excel.Application, wb As Excel.Workbook, strPath As String)
With xl
If .ProtectedViewWindows.count > 0 Then
.ActiveProtectedViewWindow.Edit
End If
Set wb = .Workbooks.Open(Trim(strPath) & "ASC.xls", True, False)
wb.Sheets(1).Rows("1:1").Delete Shift:=xlUp
.ActiveWorkbook.SaveAs FileName:=Trim(strPath) & "ASC.xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
End With
End Sub
我已在 sub 中的“If”语句中添加,因为我希望它会删除“受保护的视图 - 由于信任中心中的文件阻止设置,不建议编辑此文件类型”消息。我想要实现的是去掉“启用编辑”按钮,这样这个宏就可以启用编辑并按计划运行。
目前,代码位于“Set wb”行。实现我所追求的正确方法是什么?
【问题讨论】:
删除受保护的视图需要用户权限。如果有一种方法可以在没有用户干预的情况下实用地删除它,那将是安全漏洞。 我很确定我已经完成了。我不担心这里的安全问题,因为这纯粹是为我和一位同事完成的。 【参考方案1】:一种可能性是在打开 Excel 工作簿之前以编程方式将宏安全设置更改为最低。操作数据后,重新启用之前的宏安全设置。
这是我在http://www.mrexcel.com/forum/excel-questions/631545-change-trust-center-settings-visual-basic-applications.html找到的一些修改后的代码:
Public Sub MySubroutine()
Dim lSecurity As Long
lSecurity = Application.AutomationSecurity
Application.AutomationSecurity = msoAutomationSecurityLow
'''''''''''''''''''''
' Run code here '
'''''''''''''''''''''
Application.AutomationSecurity = lSecurity
End Sub
作为旁注,VBA 将 Integer 实现为 Long,因此声明 Integer 变量实际上可能会稍微降低性能,因为它必须重新解释 Integer 关键字。当我了解到这一点时,我开始将 Integer 声明为 Long。实际上,我在一些 Microsoft 文档中读到了这一点,但几年前我失去了它的链接。
【讨论】:
这里是支持您声明的链接:docs.microsoft.com/en-us/previous-versions/office/developer/… 它清楚地表明:使用整数变量不再有性能优势;事实上,Long 变量可能会稍微快一些,因为 VBA 不必转换它们。【参考方案2】:Sub trusted_locations(path_to_add)
Const HKEY_CURRENT_USER = &H80000001
Dim oRegistry
Dim sDescription 'Description of the Trusted Location
Dim bAllowSubFolders 'Enable subFolders as Trusted Locations
Dim bAllowNetworkLocations 'Enable Network Locations as Trusted
' Locations
Dim bAlreadyExists
Dim sParentKey
Dim iLocCounter
Dim arrChildKeys
Dim sChildKey
Dim sValue
Dim sNewKey
Dim vers As Variant
'Determine the location/path of the user's MyDocuments folder
'*******************************************************************************
Set oRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
bAllowSubFolders = True
bAlreadyExists = False
vers = Application.Version
sParentKey = "Software\Microsoft\Office\" & vers & "\Excel\Security\Trusted Locations"
iLocCounter = 0
oRegistry.EnumKey HKEY_CURRENT_USER, sParentKey, arrChildKeys
For Each sChildKey In arrChildKeys
oRegistry.GetStringValue HKEY_CURRENT_USER, sParentKey & "\" & sChildKey, "Path", sValue
If sValue = spath Then bAlreadyExists = True
If CInt(Mid(sChildKey, 9)) > iLocCounter Then
iLocCounter = CInt(Mid(sChildKey, 9))
End If
Next
'Uncomment the following 4 linesif your wish to enable network locations as Trusted
' Locations
bAllowNetworkLocations = True
If bAllowNetworkLocations Then
oRegistry.SetDWORDValue HKEY_CURRENT_USER, sParentKey, "AllowNetworkLocations", 1
End If
If bAlreadyExists = False Then
sNewKey = sParentKey & "\Location" & CStr(iLocCounter + 1)
oRegistry.CreateKey HKEY_CURRENT_USER, sNewKey
oRegistry.SetStringValue HKEY_CURRENT_USER, sNewKey, "Path", path_to_be_added
oRegistry.SetStringValue HKEY_CURRENT_USER, sNewKey, "Description", description_of_path
If bAllowSubFolders Then
oRegistry.SetDWORDValue HKEY_CURRENT_USER, sNewKey, "AllowSubFolders", 1
End If
End If
End Sub
【讨论】:
此代码可以添加受信任的位置.....如果您想添加网络位置,请向您的管理员咨询有关网络位置的安全性【参考方案3】:您可以尝试在信任中心关闭受保护的视图设置
http://office.microsoft.com/en-us/excel-help/what-is-protected-view-HA010355931.aspx#BM5
http://www.howtogeek.com/60310/enable-editing-for-all-office-2010-documents-by-disabling-protected-view/
这可能有害。
此外,您应该设置受信任的位置。
【讨论】:
这真的是不得已而为之。如果我能以编程方式完成,仅针对这几个实例,那将是更可取的。【参考方案4】:子文件块(值 As Long) 常量 HKEY_CURRENT_USER = &H80000001
Dim oRegistry
Dim sParentKey
Dim vers As Variant
Dim item As String: item = filetype_to_change_fileblock
'确定用户的 MyDocuments 文件夹的位置/路径 '****************************************************** ****************************** 设置 oRegistry = GetObject("winmgmts:\.\root\default:StdRegProv")
vers = Application.Version
sParentKey = "Software\Microsoft\Office\" & vers & "\Excel\Security\FileBlock"
oRegistry.SetDWORDValue HKEY_CURRENT_USER, sParentKey, item, value
End Sub
【讨论】:
此代码可以更改文件块设置....该值给出了安全级别。没有安全=0安全打开=1安全打开和保存=2以上是关于从在 Access 中以编程方式打开的 Excel 工作表中删除受保护的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MS-Access 97 中以编程方式访问报表工具栏
MS-Access 2007 - 如何在点击事件中以编程方式访问子表单列数据