본문 바로가기
  • 반가워요 : )
엑셀

VBA 워크 시트 참조 정석 3가지, 90%는 모름

by 교육의 기울기 2024. 11. 18.
반응형

 
VBA 워크시트 참조 세 가지 방법, 남들이 잘 모르는 팁까지 알려드립니다.
 

VBA 워크시트 참조 : Activesheet

Activesheet는 현재 사용 중인 시트를 참조하게 해주는 개체이다.
Activesheet를 이용 시 현재 사용 중인 시트에 원하는 메서드나 프로퍼티를 사용할 수 있다.
 
 

예를들어, activesheet의 특정 셀에 값을 집어넣는 명령어이다.

여기까지만 알아도 충분히 사용할수있다. 

 

다만 여기에는 문제가 하나 있는데, activesheet을 사용하게 되면, 어떤 명령어를 사용할 수 있는지 알기가 힘들다는 것이다.
예를 들어. 아래를 보자

activecell사용시 가능한 메소드, 프로퍼티가 나온다. 반면에 activesheet은 나오지않음

activecell 이라는 오브젝트를 적고, "."를 타이핑해주면 사용할수있는 메소드, 프로퍼티 리스트가 나오게된다.
반면에 activesheet은 드롭다운이 나오지 않는다.
 
사용자가 이를 모두 외우기는 어렵게 때문에, 이러한 기능이 지원되지 않는 것은 문제가 될 수 있다.
일일이 찾아야 하는 번거로움이 있기 때문이다.
 
이에 대한 이유를 찾아보자면... 엑셀이 activesheet이라는 개체를 어떻게 판단해야 할지 모르기 때문이다. 
아래의 사진을 보고 왜 그런지 이해해 보자.

activecell의 라이브러리, activecell하나만 참조된다. 오른쪽의 사진은, activecell의 명령어를 생략없이 적어보았다.

activecell 만적고 "."를 타이핑했을때, 드랍다운이 나오면서 사용가능한 명령어가 나오는이유는,
엑셀이 activecell이 무엇인지 정확하게 판단이 가능하기 때문이다.
오른쪽사진을 보면, activecell의 모든 명령어를 생략 없이 적어놓은 구문이다.

activesheet의 라이브러리.. 많은 클래스가 참조되고있다.

반면, activesheet을 적고 "." 타이핑시 아무런 반응이 없는이유는... 엑셀이 activesheet이 워크시트를 말하는것인지, 차트를 말하는것인지 판단할수없기 때문이다. 그리고 이 이유를 다르게 말해보자면... 아래와 같다.

activecell은 range이다.

activecell은 range이다. 즉 range에 필요한 프로퍼티와, 메소드를, 엑셀은 바로 판단할수있다.

activesheet은, object이다.

반면에, activesheet은 object이다. 엑셀이 바로 판단하기가 어렵다. object라는것은 엑셀내에 많이있기때문
activesheet는 object이기 때문에 object에 사용할 수 있는 메서드나 프로퍼티가 너무 광범위하다.
 
그래서 만약 엑셀의 activesheet에 관한 명령어를 (코딩도중에) 참조하고 싶다면... 아래와 같이하면 된다.

sh라는 변수를 워크시트로 선언하고, set명령어로 해당 수는 activesheet라고 만든다.

위와 같이 하면, activesheet의 명령어를드랍다운으로 볼수가있다.
"즉 해당 명령의 속성이 특정이 잘될수록 드롭다운(메서드, 프로퍼티)이 뜨게 된다"
 
 

 VBA 워크시트 참조 두번째, 시트의 인덱스번호 참조하기

Worksheets(5).Select
Sheets(5). Select


위 명령어는 두 개다 같은 방법이다. 
인덱스, 즉 워크시트의 순서를 이용해서 워크시트를 참조하는 방법이다.
다만 순서에 영향을 받으므로, 순서가 바뀌지 않도록 주의해야 할 것이다.
어떤 상황에 쓰냐면.. 어떤 워크북의 무조건 첫 번째 시트만을 참조하고 싶을 경우... 그 워크시트의 이름과 상관없이 말이다.
  

 VBA 워크시트 참조 세번째, 시트 이름 참조하기

 

Worksheets("sheet5"). Range("B3"). Value = "여기에카피 1"
Sheets("sheet5"). Range("B4"). Value = "여기에카피 2"


가장 흔한 방법으로, 특정시트의 이름을 통해서 시트를 참조한다.
그리고 참고로, 이름을 참조하는 방법은 또 두 가지로 나뉠 수 있다.
시트의 탭이름을 참조하는 방법과, 시트의 이름(vba상에서)으로 나뉠 수 있겠다.

sheet5워크시트의 탭이름은 그대로지만, vba속성에서 이름을 code5라고 바꿨다.

위와 같이 워크시트(sheet5)의 탭이름은 그대로지만, vba상에서 워크시트의 이름을 code5라고 바꿨다.
그렇게 code5라는 개체에 명령어를 썼는데, 실행이 잘된다.
즉, 워크시트상의 이름을 이용해서 워크시트를 참조하게 되면, 그 워크시트의 탭이름이 무엇이든지 상관이 없어진다.
이렇게 코드를 작성하면 더 안정적인 코드라고 할 수 있다. 
   
참고로 말하자면.. vba 구문에 worksheets를 타이핑하고
  '. '을 타이핑했을 때, 또 드롭다운이 나오지 않는데..
이것은 activesheet에서 설명한 것과 같은 이유로, worksheets는 개체로서, 너무 넓은 범위위 개념이기 때문이다.
 
하지만 해당 워크시트의 vba상의 이름을 타이핑하면, 드롭다운이 나온다. 즉 vba상 이름을 타이핑하면, 엑셀이 이것은 워크시트와 연관이 있다는 것을 안다는 것이다.

반응형

댓글