Ms语句中的MsgBox不起作用

时间:2017-12-06 20:10:54

标签: excel-vba vba excel

如果Windows用户是" bhope"我试图使用以下代码打开受密码保护的文件?或者" jdean"如果用户是其他任何人,则显示一个消息框。当用户是" bhope"它会根据需要打开文件。或者" jdean"但如果其他用户点击该按钮,则没有任何反应/没有错误。我错过了什么?

Sub Button1_Click()

Dim wb As Workbook
Dim strUser As String
strUser = Environ("USERNAME")

  Application.ScreenUpdating = False

  Select Case strUser

    ' Full Workbook Access
    Case Is = "bhope", "jdean"
       If ActiveWorkbook.ReadOnly Then _
          Set wb = Workbooks.Open(Filename:="M:\...", Password:="TEST")

    ' Limit Access
    Case Is = "mjackson" 'also tried "Case Is <> "bhope", "jdean"
       If Not ActiveWorkbook.ReadOnly Then _
          MsgBox ("This button is reserved for SAMs")
  End Select

  Application.ScreenUpdating = True
End Sub

如果有帮助,我使用this link启动代码的基础并尝试从那里修改它。谢谢,欢呼!

2 个答案:

答案 0 :(得分:0)

您在这里使用IS可能是罪魁祸首。充其量它是多余的,更糟糕​​的是它掩盖了这个问题。而是尝试:

Sub Button1_Click()

Dim wb As Workbook
Dim strUser As String
strUser = Environ("USERNAME")

  Application.ScreenUpdating = False

  Select Case strUser

    ' Full Workbook Access
    Case "bhope", "jdean"
       If ActiveWorkbook.ReadOnly Then _
          Set wb = Workbooks.Open(Filename:="M:\...", Password:="TEST")

    ' Limit Access
    Case "mjackson" 
       If Not ActiveWorkbook.ReadOnly Then _
          MsgBox ("This button is reserved for SAMs")
  End Select

  Application.ScreenUpdating = True
End Sub

另请考虑将第二个CASE更改为CASE ELSE

另一件事是你的msgbox在IF条件之内。 strUser必须等于mjackson并且ActiveWorkbook(此代码执行时可能出现的任何内容)必须不是ReadOnly才能触发该msgbox。

  1. 考虑将“ActiveWorkbook”更改为更具体。也许是ThisWorkbook.ReadOnly

  2. 考虑Else if语句,看看mjackson是否正在点击但readonly不是:

    Case "mjackson" 
       If Not ActiveWorkbook.ReadOnly Then 
          MsgBox ("This button is reserved for SAMs")
       Else
          MsgBox ("ActiveWorkbook is not Read Only so yo get this message")
       End If
    
  3. 最后,在SELECT上放置一个断点(F9)并查看代码运行时strUser的值{停留在该行的strUSer上或检查“本地”窗格)。您可能还希望在此时查看ActiveWorkbook的内容,以防万一。答案将再次出现在“本地”窗格中,因此请确保在VBE的view下拉列表中打开该答案。

答案 1 :(得分:0)

我找到了解决方案。显然是&#34;其他情况&#34;我说我之前尝试过的实际上已经完成了另一个具有类似代码的测试文件,因为我在测试比较行为时通常会打开几个。我还必须删除下面的行&#34; case else&#34;这样只有msg框线才能运行。以下是我将来使用的代码:

Sub Button1_Click()

Dim wb As Workbook
Dim strUser As String
strUser = Environ("USERNAME")

Application.ScreenUpdating = False

Select Case LCase(strUser)
' Full Workbook Access
Case Is = "bhope", "jdean"
If ThisWorkbook.ReadOnly Then _
Set wb = Workbooks.Open(Filename:="M:...", Password:="TEST")
' Limit Access
Case Else
MsgBox ("This button is reserved for SAMs")
End Select
Application.ScreenUpdating = True
End Sub

回答之前的问题:我对屏幕更新的理解是,如果关闭屏幕,应用程序将以非直观方式运行,以免引起将要使用此文件的用户的担忧。此外,这段代码使它运行得更快,不是吗?

就工作簿和安全问题的目的而言......该按钮将用于包含我们公司指标的许多部分的只读工作簿。该文件是只读的,以便用户无法保存。由于文件有点大,预计会有大量数据进入,我的思考过程是加载&#34; Shell&#34;然后,主文件的按钮确定应该允许谁向某些工作表添加信息。通过使这两个文件只读并受密码保护,我可以在适当的用户单击按钮时打开第二个工作表,然后在工作簿之间来回传输数据。我仍然打算使用密码保护VBA代码,因此我不知道它们是如何成为安全问题的。另外,@ ashleed,我的意思是我们公司的每个人都有小写的用户名。