如何在VBA对象中存储工作表引用?

时间:2014-05-18 15:23:08

标签: excel excel-vba vba

对于那些沉浸在Excel对象编程中的人来说,这似乎是微不足道的,但它击败了我。

过去,我在Excel的vba中完成了以下操作,以便在退出子例程之前恢复活动表。

sub foo()
dim cursheet
cursheet = ActiveSheet

someOtherSheet.activate
....
cursheet.activate
end sub

工作正常。我尝试使用对象做类似的事情,并在几种不同的方法之后,在新的问题类中编写以下内容......

''''''''''''''''''''''
' 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方法。我看到活动表存储了,但是当我点击setter的end属性行时,注意到sheet对象消失了。我不知道这是否是调试器的工件,或者当我点击结束属性行时片材确实被抛出但不管它是什么,当我尝试重新激活它时,对象就消失了#39;完成了。

令人沮丧的是我真正想在我的来电者中写的东西    curStudent.sheet =活动表
  和    curStudent.sheet.Activate

通过某种方式继承了内置的工作表方法,但是当我试图让它工作时,这导致了一只兔子的代码。

所以有三个问题:

  1. 为什么我存储在saveCursheet中的工作表会消失?
  2. 我需要更改什么才能使代码生效?
  3. 我需要采取哪些不同的方法来制作curStudent.sheet = Activesheet以及它的合作伙伴curStudent.sheet.Activate方法?

1 个答案:

答案 0 :(得分:1)

在代码执行其他操作时,您需要一个模块级变量来存储值。请注意,它是私有的。

此外,正如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