【问题标题】:Excel 365 vba - (un)protect sheet slows down macro a lotExcel 365 vba - (取消)保护工作表会大大减慢宏
【发布时间】:2019-07-08 20:54:21
【问题描述】:

与 Excel 2007 相比,在 Excel 365 中使用 VBA 取消保护/保护工作表的速度要慢得多。有人知道为什么会这样吗?有什么办法可以解决这个问题而不只是省略保护功能?

为确保问题完全由 unprotect/protect 语句引起,我使用包含单个模块的空白工作簿进行了测试,该模块具有以下代码:

Dim secondsElapsed As Double

startTime = Timer
Sheets("test").Unprotect ("****")
ThisWorkbook.Sheets("Timers").Cells(1, 1) = Round(Timer - startTime, 2)

startTime = Timer
Sheets("test").Protect Password:="****", DrawingObjects:=False, Contents:=True, Scenarios:=True, AllowSorting:=True, AllowFiltering:=True
ThisWorkbook.Sheets("Timers").Cells(2, 1) = Round(Timer - startTime, 2)

`

这会产生以下平均值:

  • Excel 2007
    • 取消保护:0.02 秒
    • 保护:0.01 秒
  • Excel 365
    • 解除保护:0.52 秒
    • 保护:0.47 秒

【问题讨论】:

  • 不看代码很难知道。例如,您是否使用.Select/.Activate? (如果是这样,please don't)。你是如何取消保护床单的?
  • 不,除非绝对必要,否则我不会使用.select.activate。我使用以下代码行(取消)保护工作表:ActiveSheet.Unprotect ("********")Sheets(Sheet_Name).Protect Password:="********", DrawingObjects:=False, Contents:=True, Scenarios:=True, AllowSorting:=True, AllowFiltering:=True。这些单独的行很容易多花 0.5 秒来执行。
  • 人们要求查看您的其余代码的原因是他们可以尝试重新创建问题并帮助您解决问题或找到可能导致问题的其他内容。这不是已知问题,也不是我在使用 Office 365 时遇到的问题。
  • 好的,我知道你是从哪里来的。我没有那样想,因为我注意到它发生在所有模块中,独立于相应模块中的其余代码。因此,我相当肯定代码的其余部分是无关紧要的。为了确保这一点,我用空白工作簿、1 个模块和最低限度的关闭代码重新测试了这个问题。问题依然存在。我会调整我原来的问题。
  • 请附上minimal reproducible example,以便每个人都可以重现该问题。

标签: excel vba office365 excel-2007


【解决方案1】:

经过更多研究并在其他论坛上询问,我找到了解决方案。 通过在保护语句中添加UserInterfaceOnly:=True 参数,可以只保护用户,而不保护VBA。因此,只需要保护一次(即其余代码中的 (un)protect 语句可以省略)。

当然,这还不能解释为什么 (un)protect 语句需要这么长时间。为了尝试找到这个问题的答案,我将直接与 Microsoft 联系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2019-03-30
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多