使用 VBA 复制 Excel Sheet 失去保护
Copy Excel Sheet with VBA Loses Protection
有没有更安全的方法来保护 excel sheet 而不用 sheet.Protect 代码在 vba 代码中嵌入密码?所需功能是使用宏复制 excel sheet 并保留保护,以便公式保持隐藏状态。
两个模板 sheet 有隐藏的公式。这些 sheet 的复制保护允许用户执行除编辑对象和编辑场景之外的所有操作。
sheet需要分组功能,这需要 VBA 代码(添加到 workbook_Open)来为任何 sheet 设置 sheet.Protect UserInterfaceOnly:=True带有 ProtectedContents = True 和 .EnableOutlining:=True 的 s。除了 DrawingObjects 和 Scenarios 之外,所有其他 Protect 属性在代码中都设置为 True。
使用 excel 接口复制受保护的 sheet 可保持对副本的保护。在 VBA 代码中复制 sheet 会导致新的 sheet 没有保护。
我担心的是,尽管在 excel 2010 年使用安全密码保护代码,但通过在其他软件中打开文件,代码和嵌入的密码很容易显示出来。有没有更安全的方法来保护 sheets 而无需在代码中嵌入密码?
参考:
本质上,Excel 安全性不是特别强。保护功能的存在主要是为了防止外行用户无意中犯错误。但是,任何有决心和能力的人都不会花太长时间 hack/crack 您设置的任何安全措施。作为一个简单的例子,请看这里 up-voted 最多的问题之一:
Is there a way to crack the password on an Excel VBA Project?
因此,即使您保护了实际的 VBA 项目,绕过这个也相对简单。
在您的特定情况下,您正在使用 Worksheet_Open 事件来应用保护 - 然而,这是世界上任何人都可以绕过的最简单的方法,只需通过 sub 打开有问题的工作簿关闭事件后的另一个工作簿。您可能还有一些用户的宏安全设置未自动启用,如果他们在打开您的工作簿时关闭 "Enable Macros?" 提示,则永远不会触发 Open 事件。
如果您对这种安全级别感到满意 - 并且很高兴您的工作簿不会成为坚定用户的黑客攻击目标 - 那么您不必太担心将保护密码存储在代码本身中.然而,有几个简单的方法至少可以让它不那么显眼(以防用户不小心按下 Alt+F11,或者错误导致 VBE 打开:
不要在代码中以纯文本形式键入密码,而是使用 Chr() 函数。所以而不是:
Dim pw As String
pw = "hello!"
...你可以这样写:
Dim pw As String
pw = Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(111) & Chr(33)
另一种方法是将密码存储在另一个 sheet 的单元格(例如 A1)中,其可见性设置为 xlVeryHidden,并引用 Sheets("HiddenSheetName").Cells(1,1 ).价值.
正如我所说 - 这些并不是保护敏感数据和公式的完美方法:但是,如果您的目标只是阻止临时用户犯错,或者在他们不该犯的地方四处乱摸,那么他们会这样做工作。
补充:对于需要密码的多个实例,我自己使用这样的东西:
Function pw() As String
pw = Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(111) & Chr(33)
End Function
然后根据需要调用它。您甚至可以将函数命名为其他稍微神秘的东西,而不是 "pw" 等
有没有更安全的方法来保护 excel sheet 而不用 sheet.Protect 代码在 vba 代码中嵌入密码?所需功能是使用宏复制 excel sheet 并保留保护,以便公式保持隐藏状态。
两个模板 sheet 有隐藏的公式。这些 sheet 的复制保护允许用户执行除编辑对象和编辑场景之外的所有操作。
sheet需要分组功能,这需要 VBA 代码(添加到 workbook_Open)来为任何 sheet 设置 sheet.Protect UserInterfaceOnly:=True带有 ProtectedContents = True 和 .EnableOutlining:=True 的 s。除了 DrawingObjects 和 Scenarios 之外,所有其他 Protect 属性在代码中都设置为 True。
使用 excel 接口复制受保护的 sheet 可保持对副本的保护。在 VBA 代码中复制 sheet 会导致新的 sheet 没有保护。
我担心的是,尽管在 excel 2010 年使用安全密码保护代码,但通过在其他软件中打开文件,代码和嵌入的密码很容易显示出来。有没有更安全的方法来保护 sheets 而无需在代码中嵌入密码?
参考:
本质上,Excel 安全性不是特别强。保护功能的存在主要是为了防止外行用户无意中犯错误。但是,任何有决心和能力的人都不会花太长时间 hack/crack 您设置的任何安全措施。作为一个简单的例子,请看这里 up-voted 最多的问题之一:
Is there a way to crack the password on an Excel VBA Project?
因此,即使您保护了实际的 VBA 项目,绕过这个也相对简单。
在您的特定情况下,您正在使用 Worksheet_Open 事件来应用保护 - 然而,这是世界上任何人都可以绕过的最简单的方法,只需通过 sub 打开有问题的工作簿关闭事件后的另一个工作簿。您可能还有一些用户的宏安全设置未自动启用,如果他们在打开您的工作簿时关闭 "Enable Macros?" 提示,则永远不会触发 Open 事件。
如果您对这种安全级别感到满意 - 并且很高兴您的工作簿不会成为坚定用户的黑客攻击目标 - 那么您不必太担心将保护密码存储在代码本身中.然而,有几个简单的方法至少可以让它不那么显眼(以防用户不小心按下 Alt+F11,或者错误导致 VBE 打开:
不要在代码中以纯文本形式键入密码,而是使用 Chr() 函数。所以而不是:
Dim pw As String
pw = "hello!"
...你可以这样写:
Dim pw As String
pw = Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(111) & Chr(33)
另一种方法是将密码存储在另一个 sheet 的单元格(例如 A1)中,其可见性设置为 xlVeryHidden,并引用 Sheets("HiddenSheetName").Cells(1,1 ).价值.
正如我所说 - 这些并不是保护敏感数据和公式的完美方法:但是,如果您的目标只是阻止临时用户犯错,或者在他们不该犯的地方四处乱摸,那么他们会这样做工作。
补充:对于需要密码的多个实例,我自己使用这样的东西:
Function pw() As String
pw = Chr(104) & Chr(101) & Chr(108) & Chr(108) & Chr(111) & Chr(33)
End Function
然后根据需要调用它。您甚至可以将函数命名为其他稍微神秘的东西,而不是 "pw" 等