Excel 模块没有';看不到公共变量

Excel 模块没有';看不到公共变量,excel,vba,variables,Excel,Vba,Variables,对不起,又出问题了 标准模块: Public ws1 As Worksheet Public rCopy As Range ws1.Select ' Error rCopy.Select ' Error 工作簿未打开: Set ws1 = Sheets("abc") Set rCopy = ws1.Range("A1") 第三模块: Public ws1 As Worksheet Public rCopy As Range ws1.Select ' Error rCopy.Select

对不起,又出问题了
标准模块:

Public ws1 As Worksheet
Public rCopy As Range
ws1.Select ' Error
rCopy.Select ' Error
工作簿未打开:

Set ws1 = Sheets("abc")
Set rCopy = ws1.Range("A1")
第三模块:

Public ws1 As Worksheet
Public rCopy As Range
ws1.Select ' Error
rCopy.Select ' Error

请提供帮助。

如果第三个模块中的代码不是由于工作簿打开后发生的某个事件而调用的,则这两个变量仍然未初始化。

如果第三个模块中的代码不是由于工作簿打开后发生的某个事件而调用的,这两个变量仍然未初始化。

您发布的代码确实有效

出现错误的一个原因是,如果您一直在调试代码,但在某个时候出现错误并停止执行,则将不再设置公共变量。您只需再次运行
Workbook\u Open
sub(您可以使用
F5从IDE运行它)

注意,您应该采纳上一个问题的建议,并使用
Set ws1=thiswoolk.Sheets(“abc”)
。如果您不这样做,您就有可能在另一个工作簿中将
ws1
设置为sheet
abc
,因为在编写时它相当于
set ws1=ActiveWorkbook.Sheets(“abc”)

您发布的代码确实有效

出现错误的一个原因是,如果您一直在调试代码,但在某个时候出现错误并停止执行,则将不再设置公共变量。您只需再次运行
Workbook\u Open
sub(您可以使用
F5从IDE运行它)


注意,您应该采纳上一个问题的建议,并使用
Set ws1=thiswoolk.Sheets(“abc”)
。如果您不这样做,您就有风险,
ws1
将在另一个工作簿中设置为sheet
abc
,因为这样写相当于
set ws1=ActiveWorkbook.Sheets(“abc”)

,那么私有成员和财产呢

Option Explicit

Private m_mySheet As Worksheet
Private m_myRange As Range

Public Property Get MySheet() As Worksheet
    If (m_mySheet Is Nothing) Then
        Set m_mySheet = ThisWorkbook.Worksheets("abc")
    End If
    Set MySheet = m_mySheet
End Property

Public Property Get MyRange() As Range
    If (m_myRange Is Nothing) Then
        Set m_myRange = MySheet.Range("A1")
    End If
    Set MyRange = m_myRange
End Property

Option Explicit

Sub test()
    Debug.Print MyRange.Address
End Sub

那么私人成员和财产呢

Option Explicit

Private m_mySheet As Worksheet
Private m_myRange As Range

Public Property Get MySheet() As Worksheet
    If (m_mySheet Is Nothing) Then
        Set m_mySheet = ThisWorkbook.Worksheets("abc")
    End If
    Set MySheet = m_mySheet
End Property

Public Property Get MyRange() As Range
    If (m_myRange Is Nothing) Then
        Set m_myRange = MySheet.Range("A1")
    End If
    Set MyRange = m_myRange
End Property

Option Explicit

Sub test()
    Debug.Print MyRange.Address
End Sub

确保第三个工作簿中的代码在工作簿\u打开后运行。。。并且在这段时间内没有重置它:)请确保第三个工作簿中的代码在工作簿打开后运行。。。在这两者之间没有任何重置:)谢谢,丹尼尔。您的代码我不太清楚,但我会花一些时间来分析。@Alegro:为了更好地理解,在您的代码中,您不会使用公共变量ws1或rCopy,而是使用公共属性,例如MyRange。如果调用属性MyRange,则首先检查m_MyRange,如果它为Nothing,则设置它。因此,这样应该避免在需要MyRange时,它什么都不是:-)。希望有帮助,丹。谢谢,丹尼尔。你真是太好了。我现在明白了。很好的把戏。谢谢你,丹尼尔。您的代码我不太清楚,但我会花一些时间来分析。@Alegro:为了更好地理解,在您的代码中,您不会使用公共变量ws1或rCopy,而是使用公共属性,例如MyRange。如果调用属性MyRange,则首先检查m_MyRange,如果它为Nothing,则设置它。因此,这样应该避免在需要MyRange时,它什么都不是:-)。希望有帮助,丹。谢谢,丹尼尔。你真是太好了。我现在明白了。很好的把戏。