2014-05-18 1 views
1

이것은 Excel 객체 프로그래밍에 익숙하지 않은 사용자에게는 사소한 것처럼 보일 것입니다. 과거 VBA 개체에 워크 시트 참조를 저장하는 방법은 무엇입니까?

, 나는 있습니다 .. 서브 루틴을 종료하기 전에 activesheet를 복원하는 엑셀의 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의 마지막 속성 선을 치면 시트 객체가 사라지는 것을 확인할 수 있습니다. 나는 이것이 디버거의 유물인지 또는 최종 속성 선을 칠 때 시트가 실제로 버려지는지는 모르지만, 그것이 완료되면 개체를 다시 활성화하려고하면 개체가 사라집니다.

낙심되는 것은 정말 내 발신자에 쓰고 싶다 무엇이었다 curStudent.sheet = Activesheet 어떻게 든 내장 워크 시트 방법을 상속하지만 그 토끼의 주도에 의해
및 curStudent.sheet.Activate

워렌 코드를 작동 시키려고 노력했습니다.

그래서 세 가지 질문 :

  1. 왜 내가 saveCursheet에 저장되어있는 시트가 사라질 않았다?
  2. 코드를 변경하려면 무엇을 변경해야합니까?
  3. 위의 방법과 다르게 curStudent.sheet = Activesheet 및 그 파트너 인 curStudent.sheet.Activate 접근 방식을 사용하려면 어떻게해야합니까?

답변

1

코드가 다른 일을하는 동안 값을 저장하려면 모듈 수준 변수가 필요합니다. 그것은 비공개임을 유의하십시오. 객체의 경우, ja72에 의해 체포로

또한,하지 Let, Set입니다 : 검증되지 않은

:

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 
+0

는 Let'이 공개'처럼'Set'를 사용'사용하지 마십시오 속성 세트 시트 (워크 시트 값) ' – ja72

+0

@ ja72, woops 놓쳤습니다. 수정합니다. –

+0

워크 시트 라인 인 개인 m_sheet가 트릭을 수행했습니다. 감사! 그것도 원래의 접근 방식에 걸림돌이되었습니다. let/set 에러를 발견 한 @ ja72에게 감사드립니다. – MichaelGreene

관련 문제