【问题标题】:Macro enabled workbook read only when shared启用宏的工作簿在共享时只读
【发布时间】:2016-10-21 00:04:15
【问题描述】:

我有一个启用宏的工作簿。它具有受保护的工作表和工作簿。 工作簿包括 3 张纸。 Sheet1 命名为 Main Sheet2 命名为 Tab2 Sheet3 命名为 Tab3

我在 Tab2 上禁用了单元格,并且我有一个宏应该提示用户是否启用单元格。如果用户选择“是”,则单元格将被启用,并且“主”工作表上的下拉菜单将更改为是。

宏对我来说很好用。我必须通过电子邮件将工作簿分享给其他用户。

用户将工作簿保存在他的机器上并选择“启用编辑”和“启用宏”。

但是当用户在提示符上单击“确定”时,顶部的工作簿名称显示 XXXX[只读] 和单元格 Tab2 未启用。

我可以选择打开工作簿读/写模式吗?或者对我来说还有什么其他选择可以让保护工作正常吗?

Private Sub Worksheet_Activate()

    NotifyUserGeneral

End Sub



Private Sub NotifyUserGeneral()
Dim mMessageDisplayed As Boolean
Dim message  As Integer

    If ActiveSheet.ProtectContents = True And Not mMessageDisplayed Then
        message = MsgBox("Cells are locked on current sheet, press ok to Unlock ", vbOKCancel)
        mMessageDisplayed = True
        If message = vbOK Then
        Sheets("MAIN").Range("G11") = "YES"
        Else
        Sheets("MAIN").Range("E29") = "NO"
    End If
End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
End Sub

请建议

【问题讨论】:

  • 而不是使用ActiveSheet 尝试ThisWorkbook.Worksheets("Tab2") - 也许它没有在正确的工作表上工作。您的Sheets("MAIN") 应该是ThisWorkbook.Sheets("MAIN") - 可能其他用户在代码运行时没有激活工作簿(因此它将在活动工作簿上执行)。
  • @DarrenBartrup-Cook 感谢您的回复!当然,让我试试
  • @DarrenBartrup-Cook it dint 帮助。仍然是同样的问题,当我在消息上单击“确定”时,它不会启用单元格。有其他建议,欢迎
  • 您知道,我刚刚意识到 - 如果您按 OK,则您的代码中没有任何内容可以解锁单元格。您需要添加ActiveSheet.Unprotect 才能真正解锁单元格。

标签: vba excel macros


【解决方案1】:

我认为这是您所追求的代码。

注意:我已将 mMessageDisplayed 的声明移至模块顶部,否则每次调用 NotifyUserGeneral 时它都会重置为 FALSE。

另请注意:如果您想从其他工作表调用 NotifyUserGeneral,最好将其移至普通模块 - 请记住将 mMessageDisplayed 声明移至。

Option Explicit

Private mMessageDisplayed As Boolean

Private Sub Worksheet_Activate()

    NotifyUserGeneral

End Sub

Private Sub NotifyUserGeneral()

    If ActiveSheet.ProtectContents And Not mMessageDisplayed Then
        mMessageDisplayed = True
        If MsgBox("Cells are locked on current sheet, press ok to Unlock", vbOKCancel + vbInformation) = vbOK Then
            ActiveSheet.Unprotect
            ThisWorkbook.Worksheets("MAIN").Range("G11") = "YES"
        Else
            ThisWorkbook.Worksheets("MAIN").Range("E29") = "NO"
        End If
    End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
End Sub

【讨论】:

  • 那行得通...我将 NotifyUserGeneral 移至普通模块。它现在工作得很好。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 2017-03-24
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多