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
设置为sheetabc
,因为在编写时它相当于set ws1=ActiveWorkbook.Sheets(“abc”)
您发布的代码确实有效
出现错误的一个原因是,如果您一直在调试代码,但在某个时候出现错误并停止执行,则将不再设置公共变量。您只需再次运行Workbook\u Open
sub(您可以使用F5从IDE运行它)
注意,您应该采纳上一个问题的建议,并使用Set ws1=thiswoolk.Sheets(“abc”)
。如果您不这样做,您就有风险,ws1
将在另一个工作簿中设置为sheetabc
,因为这样写相当于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时,它什么都不是:-)。希望有帮助,丹。谢谢,丹尼尔。你真是太好了。我现在明白了。很好的把戏。