对于那些沉浸在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
通过某种方式继承了内置的工作表方法,但是当我试图让它工作时,这导致了一只兔子的代码。
所以有三个问题:
答案 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