如何在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。

所以有三个问题:

  1. 为什么我保存在saveCursheet中的工作表消失了?
  2. 我需要改变什么来使代码工作?
  3. 为了使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