【问题标题】:VBA Excel: Moving data macro error on protected sheetsVBA Excel:受保护工作表上的移动数据宏错误
【发布时间】:2017-03-21 09:17:38
【问题描述】:

我在 VBA 模块中有以下示例代码:

Sub My_Code()

ThisWorkbook.Sheets("Main").Range("A1") = "Main Data"
ThisWorkbook.Sheets("Secondary").Range("A2").Copy Sheets("Main").Range("B2")

End Sub

为了保护工作表,主要和次要,我在 VBA 的 Thisworkbook 中放入了以下代码:

Private Sub Workbook_Open()

Sheets("Main").Protect Password:="Mypassword", UserInterfaceOnly:=True
Sheets("Secondary").Protect Password:="Mypassword", UserInterfaceOnly:=True

End Sub

当我运行 My_Code() 时出现错误:

""运行时错误'1004' 您尝试更改的单元格或图表位于受保护的工作表上。 要进行更改,请单击“审阅”选项卡中的“取消保护工作表”(您可能需要密码)。""

这会调试到ThisWorkbook.Sheets("Secondary").... 行。

当我手动取消保护主工作表时,代码运行。任何想法为什么我不能让 Main 受到保护?我是不是忘记了什么?

【问题讨论】:

  • 也许这会让你开始:Thisworkbook.Sheets("Main").Range("B2").Value = ThisWorkbook.Sheets("Secondary").Range("A2").Value
  • @jkpieterse 这确实解决了问题,但仅适用于此代码,如果我将此修复替换为我的主代码,我会在我使用的代码上有条件地收到“应用程序定义或对象定义错误”格式化单元格。我的实际程序只有几 1000 行,所以我不能输入。你知道为什么保护代码会阻止它正常运行吗?
  • 这里要注意的一点..如果您按照自己的方式设置密码,如果失败也不会出错。因此,如果密码当前未设置为“MyPassword”,则整行将被忽略并且您不会被告知。再加上当工作簿被保存、关闭和重新打开时,它会删除保护的UserInterfaceOnly 部分,很可能UserInterfaceOnly 没有设置为您认为的True。检查您的代码中的其他地方是否没有设置其他替代密码或保护措施,并且用户没有覆盖它。
  • @CLR 感谢您的提醒。我浏览了我的代码,我的代码中没有其他密码或保护措施。我的代码的密码部分放在Private sub Workbook_Open() 下的工作簿中,该工作簿在打开工作簿时运行,因此每次打开工作簿时都将UserInterfaceOnly 设置为true。
  • 我还看到人们使用Workbook.Activate 事件而不是Workbook.Open。除了他们与您有类似问题外,我从来没有研究过为什么,但这可能是值得尝试的?

标签: vba excel


【解决方案1】:

@jkpieterse 给出了这个问题的解决方案,即将 My_Code() 的第二行更改为

Thisworkbook.Sheets("Main").Range("B2").Value = ThisWorkbook.Sheets("Secondary").Range("A2").Value

但是,这在我的代码中产生了一个新错误,该错误在 cmets 中提到。这个问题背后的原因是UserInterfaceOnly = true 不允许宏修改工作表,它只允许更改值。因此,当您修改工作表时,无法使用界面保护工作。这里唯一的解决方案是:

Sub My_Code()
Dim ws as Worksheet
Set ws = ThisWorkbook.Sheets("Main")

ws.UnProtect Password:="Mypassword"

On Error GoTo ErrHandeler

ws.Range("A1") = "Main Data"
ThisWorkbook.Sheets("Secondary").Range("A2").Copy ws.Range("B2")

ws.Protect:="Mypassword"

ErrHandler:
ws.Protect:="Mypassword"
End Sub

这是下一个最安全的解决方案。

【讨论】:

    【解决方案2】:

    您要在其中填充或修改数据的单元格必须是unlocked。所以选择单元格范围,然后在format cell 中将它们设置为unlocked。当您使用密码保护工作表时,请务必选中 allow to edit unlocked cells
    用你的原始代码试试这个,它应该可以工作。因为它在您取消保护工作表时起作用。

    【讨论】:

    • 这可行,但这意味着单元格不受保护,我希望它们受到保护:(
    • 也许在运行代码之前尝试使用 VBA 解锁单元格,然后在代码运行后立即锁定单元格。看到这个stackoverflow.com/questions/5192187/…
    【解决方案3】:

    看来您必须在Workbook_Open 上使用UserInterfaceOnly = True 重置保护,这解决了我的问题。 Excel 以 UserInterfaceOnly = False 的默认值关闭工作簿(即使我在 Workbook_BeforeClose 事件上运行安全命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-24
      • 2019-04-20
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多