全局变量自动重置

apk*_*ith 3 excel vba global-variables excel-vba

我想将一个全局变量定义为打开文件的工作表,所以我使用了以下代码:

在Module1中:

Public mySheet As Worksheet
Run Code Online (Sandbox Code Playgroud)

在ThisWorkbook中:

Sub Workbook_Open()  
    Set mySheet = Sheet1   
End Sub
Run Code Online (Sandbox Code Playgroud)

我想在mySheet整个过程中使用它来引用这个特定的工作表,其中一些参考这个工作表已经打开了一个新文件.

它的工作原理开始-当我打开变量设置的文件,宏涉及mySheet.Unprotect,mySheet.ProtectmySheet.Range("A1")工作.但是,当我尝试再次运行它时,我收到一个错误Object variable or With block variable not set,调试将我带到该mySheet.Unprotect行,这是第一次引用工作表.

如何在全局变量中定义此工作表以使定义坚持?

作为参考,我所指的特定宏如下所示,尽管我对不同的代码位有类似的问题:

Sub mySub()
    mySheet.Unprotect 
    With Application.FileDialog(msoFileDialogOpen)  
        .AllowMultiSelect = False           
        If .Show <> 0 Then
            mySheet.Range("A1") = .SelectedItems(1)
        End If           
    End With

    mySheet.Protect        
End Sub
Run Code Online (Sandbox Code Playgroud)

man*_*ogi 6

如其他答案中的链接所述,您可以理解为什么会发生这种情况.

这是我建议绕过这个问题.

在模块中创建过程.说出来,Init

Public mySheet As Worksheet

Sub Init()
   Set mySheet = Sheet1
End Sub
Run Code Online (Sandbox Code Playgroud)

然后在你Workbook_Open()这样做.

Sub Workbook_Open()
    Init
End Sub
Run Code Online (Sandbox Code Playgroud)

现在,无论您何时使用该对象,只需再添加一行

Sub mySub()
    If mySheet is Nothing then Call Init '<== Add this

    mySheet.Unprotect

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        If .Show <> 0 Then
            mySheet.Range("A1") = .SelectedItems(1)
        End If
    End With
    mySheet.Protect
End Sub
Run Code Online (Sandbox Code Playgroud)


Ror*_*ory 6

我个人建议你创建一个返回该表的函数.然后你基本上可以使用函数名作为Worksheet变量.(虽然如果你总是想要同一张纸,你可以使用Sheet1代号)

Function MySheet() As Excel.Worksheet
    Set MySheet = Sheet1
End Function
Run Code Online (Sandbox Code Playgroud)

并使用,例如:

Sub foo()
    MsgBox MySheet.Name
End Sub
Run Code Online (Sandbox Code Playgroud)