如何在VBA对象中存储工作表引用?
对于那些沉浸在Excel对象编程中的人来说,这似乎微不足道,但它却击败了我。
在过去,我已经在Excel的vba中完成以下操作,在退出子例程之前恢复活动页面。
sub foo() dim cursheet cursheet = ActiveSheet someOtherSheet.activate .... cursheet.activate end sub
这工作正常。 我试图用对象做类似的事情,经过几种不同的方法,在一个新的Problem类中写了下面的内容。
'''''''''''''''''''''' ' sheet property '''''''''''''''''''''' Public Property Get sheet() As Worksheet Set sheet = psheet End Property Public Property Let sheet(Value As Worksheet) Set psheet = Value End Property Public Sub saveCursheet() Me.sheet = ActiveSheet End Sub Public Sub activateSheet() Me.sheet.Activate End Sub
在我的代码中,我用这种方法调用方法…
Sub TallyQuizScore() Dim curStudent As Problem Set curStudent = New Problem curStudent.saveCursheet Worksheets("QuizTallies").Activate ... curStudent.activateSheet End Sub
当我尝试执行curStudent.activateSheet,我得到一个错误,说我需要一个对象。 所以我重新调用代码,并通过saveCursheet方法。 我看到activesheet得到存储,但注意到,只要我按setter的结束属性线,表单对象就消失了。 我不知道这是否是debugging器的工件,或者当我打到最终属性行时,如果表单真的被抛出,但是不pipe它是什么,当我完成时尝试重新激活它,对象就不见了。
令人沮丧的事情是我真的想写在我的调用者curStudent.sheet = Activesheet
和curStudent.sheet.Activate
通过某种程度上inheritance了内置的工作表方法,但是这导致了我试图使其工作的兔子的代码warren。
所以有三个问题:
- 为什么我保存在saveCursheet中的工作表消失了?
- 我需要改变什么来使代码工作?
- 为了使curStudent.sheet = Activesheet和它的合作伙伴curStudent.sheet.Activate方法的工作,我需要做什么不同的做法?
您需要一个模块级别的variables来存储值,而您的代码正在做其他事情。 请注意,它是私人的。
另外,正如ja72所捕捉到的那样,对象是Set
,而不是Let
:
UNTESTED:
Private m_Sheet as Worksheet Public Property Get Sheet() As Worksheet Set sheet = m_Sheet End Property Public Property Set Sheet(Value As Worksheet) Set m_Sheet = Value End Property Public Sub saveCursheet() Me.Sheet = ActiveSheet End Sub Public Sub activateSheet() Me.m_Sheet.Activate End Sub