programing

"이 워크시트"와 동등한 건가요?

cafebook 2023. 10. 20. 14:20
반응형

"이 워크시트"와 동등한 건가요?

Excel에는 워크시트 모듈의 일부인 매크로가 있습니다.

코드에서 참조된 범위가 해당 워크시트의 일부인지 확인하고자 합니다.

예를 들어, 나의Main Sheet워크시트 모듈:

Sub test()
Dim rng as Range
Set rng = Range("A1")
End Sub

물론 워크시트에 범위를 명시적으로 부여하고자 합니다.보통은 제가.

Set rng = Worksheets("Main Sheet").Range("A1")

그런데 궁금한 게 있는데, 워크시트 모듈에 제 코드가 있는데 그 워크시트를 어떻게 참고하면 될까요?저는 이런 생각을 하고 있었습니다.ThisWorksheet하지만 그것은 VBA에서는 방법이 아닙니다.ThisWorkbook그것이 제가 그것을 시도해 볼 생각을 한 이유입니다.).

다른 유일한 생각은 매크로가 워크시트 모듈 내부에 있기 때문에 "unassigned" 범위 변수는 암시적으로 다음을 참조한다는 것입니다.Main Sheet다른 워크시트의 셀을 참조할 수 없습니다.

제가 정확히 이해하고 있습니까, 아니면 실행 중인 코드가 저장된 워크시트를 참조할 수 있는 방법이 있습니까?

워크시트 모듈은 문서 모듈로, 클래스에서 멤버를 상속(예, 상속)하는 것을 제외하고는 다른 클래스와 동일합니다.Worksheet인터페이스와 문서 모듈이 되는 것은 호스트 응용 프로그램의 객체 모델(즉, 문서 모듈)을 통해 인스턴스를 생성하는 유일한 방법입니다.ThisWorkbook.Worksheets.Add는 기본적으로 공장 방식입니다.

클래스 모듈일 때 해당 모듈의 워크시트 개체는 예를 들어 다음과 같습니다.Sheet1클래스는 당신이 그것에 넣었던 모든 멤버를 포함하고, 그리고 모든 멤버가 그것으로부터 물려받은.Worksheet인터페이스... 포함하여Range소유물.

그래서 자격이 없는 사람이Range워크시트 모듈의 호출은 단순히 VBA 언어의 범위 지정 규칙 때문에 해당 시트를 참조합니다. 코드는 다음과 같습니다.

foo = Range("B12").Value2
  1. 해당 범위에 지역 변수가 있는 경우Range Range…을 말합니다.

  2. 만약 그 모듈에 이름을 가진 멤버가 있다면,Range Range…을 말합니다.

  3. 현재 프로젝트에 글로벌 변수가 있는 경우Range Range…을 말합니다.

  4. 참조된 프로젝트 또는 유형 라이브러리에 전역 범위 식별자가 있는 경우Range Range…을 말합니다.

Members of 'Sheet1' include a 'Range' property, which is a member of the 'Worksheet' class

당신은 그것을 명확하게 할 수 있습니다.Range자격을 부여하여 호출합니다.Me키워드는 현재 객체에 대한 참조를 반환하며, 이 경우에는Sheet1interface (아직도 당신이 코드 비하인드에 있다고 가정할 때)Sheet1):

foo = Me.Range("B12").Value2

그 코드는 그에게 불리하게 작용할 것입니다.Sheet1만약 당신이 비밀에 부쳐진다면Sheet1, 반대로Sheet2만약 당신이 비밀에 부쳐진다면Sheet2, ...표준 모듈에서 컴파일이 실패합니다.

하지만 그 본질과 의미는Me관심을 더 가질 만합니다.


'나'에 대하여

Me는 프로시저의 범위에 있는 런타임에만 존재할 수 있는 것, 즉 현재 개체를 가리키는 예약된 이름(해당 이름의 변수를 가질 수 없음)입니다.후드 밑에, 멤버들에게 전화를 걸 때DoSomethingA에 대항해Class1object, 호출은 기본적으로 다음과 같이 진행됩니다.

Set obj = New Class1
Class1.DoSomething obj

이 뜻은DoSomethingVBA에서는 다음과 같습니다.

Public Sub DoSomething()
End Sub

하지만 VBA는 이렇게 봅니다.

Public Sub DoSomething(ByVal Me As Class1)
End Sub

그래서.Me암시적인 국소적 범위ByVal유형의 매개변수Class1, 그리고 안에서DoSomething스코프는 호출자가 현재 사용 중인 모든 개체에 대한 참조를 보유합니다.

그것이 기본적으로 나의 이해 '나'의 핵심입니다. (꽃, 벌이 없음) 기사 =)

(relevant 언어 사양)


표준 모듈에 있을 때, 자격이 없는 사람은Range호출은 정확히 동일한 범위 규칙을 준수합니다.

  1. 해당 범위에 지역 변수가 있는 경우Range, 그 다음은Range…을 말합니다.

  2. 만약 그 모듈에 이름을 가진 멤버가 있다면,Range, 그 다음은Range…을 말합니다.

  3. 현재 프로젝트에 글로벌 변수가 있는 경우Range, 그 다음은Range…을 말합니다.

  4. 참조된 프로젝트 또는 유형 라이브러리에 전역 범위 식별자가 있는 경우Range, 그 다음은Range…을 말합니다.

(assuming의 그림자도 보이지 않음)Range해당 모듈/프로젝트에서 식별자가 발생하고 있음)

이 경우 전역 범위 식별자는 숨겨진 곳에서 찾을 수 있습니다.Global모듈:

members of '_Global' include a 'Range' property

언급URL : https://stackoverflow.com/questions/51752543/thisworksheet-equivalent

반응형