인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

유니크한 오소리님의 프로필 이미지
유니크한 오소리

작성한 질문수

엑셀 매크로와 VBA 기초부터 실무활용까지 완전 정복

개체컬렉션 질문입니다!

작성

·

378

0

선생님! 주말 잘 보내셨나요??

전에 글이 너무 길어져서 질문 새로 올리겠습니다.

복습 중 궁금한게 새로 생긴 게 있습니다. 개체컬렉션은 복수의 뜻이 있기 때문에 worksheets("이름") 이런식으로 괄호 안에 이름은 따옴표로 몇번째인지를 나타낼 때는 worksheets(1) 이렇게 숫자로 나타낸다고 했습니다.

그럼 8-7번 강의에서

For i = 1 To UBound(선택파일) '반복시작, 선택한 파일의 개수만큼 반복

Set 복사파일 = Workbooks.Open(Filename:=선택파일(i), ReadOnly:=True)

'선택된 파일을 읽기 전용으로 열어서 복사파일 변수에 대입

제가 굵게 칠한 부분 선택파일(i)<< 이 부분에서 i가 선택파일(1), 선택파일(2), 선택파일(3).... 이렇게 몇번째를 뜻하는 인덱스 형식의 뜻이 맞나요?

파일도 시트처럼 workboos(1), workbooks(2) 이렇게 인덱스로 표시할 수 있는지 궁금합니다.

 

답변 2

1

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

네~ 맞습니다.

선택파일 변수에는 선택한 파일들이 모두 배열 변수로 저장되는 곳인데,
저장된 선택파일 배열 변수 값은 선택파일(1), 선택파일(2), 선택파일(3).... 형식으로 1개씩 지정하여 사용합니다.


그리고, 파일도 시트처럼 인덱스 번호를 넣어서 workboos(1), workbooks(2) 이렇게 사용할 수 있습니다.
다만 시트는 순서가 있는데, 열려있는 파일은 순서를 지정하기가 애매하므로
대부분 배열 변수에 순서대로 저장한 다음 인덱스 번호로 한 개씩 지정하는 편입니다.

선생님 시트 취합이나 파일 취합 할 때요 여기 실습파일에선 시작셀이 a2셀로 다 동일하지만 만약에 시트마다, 혹은 파일마다 시작셀이 다르면 취합할 수 있는 방법이 있나요?

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

취합할 데이터의 시작셀이 시트마다 다를 경우
각 시트마다 복사하기 전에 시작셀이 어디인지 확인하는 조건문이 필요합니다.
'시작셀' 변수를 선언해서 각 시트의 데이터 형태에 따라 시작셀 위치를 유동적으로 사용하는 것입니다.

예를들어 코드를 수정하면 이렇게 할 수 있을것 같습니다.


Sub 시트취합()

Dim 시트 As Worksheet

Dim 시작셀 As Range

For Each 시트 In Worksheets

If 시트.Name <> "전체" Then

If 시트.Range("A1").Value = "" Then

Set 시작셀 = 시트.Range("A1").End(xlDown).Offset(1, 0)

Else

Set 시작셀 = Range("A2") '여기서 Set은 개체 변수에 개체 값을 대입할 때 사용해야 하는 코드입니다.

End If

시트.Range(시작셀, 시작셀.End(xlToRight).End(xlDown)).Copy

Sheets("전체").Range("A1").End(xlDown).Offset(1, 0).PasteSpecial

End If

Next

End Sub

 

복사할 데이터들이 어떻게 입력되어 있느냐에 따라 조건을 여러 개를 지정해야 할 수도 있습니다.

 

선생님 엑셀 매크로를 사용하다 보면 정말 많이 사용하게 되는 단축키가 alt+f11이잖아요. 근데 가끔 실수로 alt+f12를 눌러서 파워쿼리 편집기창을 띄우는 경우가 있는데요 그러고 나면 다시 alt+f11 눌러서 비주얼베이직 편집기 창을 띄웠을 때 코드창에다가 한글을 입력하면 한글 입력이 안 되는 문제가 있습니다. 그럴 땐 엑셀 파일을 닫고 다시 들어와야 해결이 됩니다. 학습하다가 이런 경우가 종종 있어서요 ㅜ 혹시 제 컴퓨터 문제인지 아니면 원래 그러는 건지 모르겠습니다.

선생님 번거로우시겠지만 한번 선생님도 테스트 해봐주시면 안 될까요? ㅜ

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

쿼리 편집기 창과 vb편집기 창을 번갈아가면서 띄워보니까 한글 입력에 오류가 발생하네요.
제 PC의 경우는 한글 입력은 잘 되는데, 왼쪽 방향으로 입력되는 오류가 있습니다.

엑셀 프로그램 자체의 오류인듯 싶습니다.

선생님 PC에서도 같은 증상이 생기는군요.. 제가 어제 한글입력이 안된다고 말했는데 정확히 말하면 저도 입력은 되지만 커서가 옆으로 이동을 안하고 글자만 옆으로 이동이 되고 글자가 계속 제자리에서 겉돕니다. 결국 한글 입력이 안 되는거나 마찬가진거죠 ㅜㅜ.. 프로그램 자체의 문제라면 개선이 필요해 보이네요..

선생님 sendkeys 메서드랑 onkey 메서드의 입력할 코드가 같나요?

390~391페이지의 키보드 각 키의 표기법이 이 두 메서드가 완전 똑같은건지 궁금합니다.

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

네~ 맞습니다.

두 메서드의 key 인수값에 키표기법은 같습니다.

키보드 자판을 입력하는 인수라 같은 형식으로 사용됩니다

선생님 제가 질문을 너무 많이 해서 귀찮으실 법도 한데 매번 친절하게 답변해 주셔서 너무 감사합니다 ㅜㅜ

저 어느덧 책 2회독까지 학습 마쳤습니다. 갈수록 실력이 느는 거 같아 너무 뿌듯합니다 ㅎ 다 선생님 덕분입니다💕💕

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

와~ 대단하십니다. 그런 열정이 있으시다는것이 존경스럽습니다

선생님 잘 지내시죠? 오랜만에 글 올리는 거 같습니다 ㅎ

저 매크로 책 3회독까지 학습 마쳤습니다. 그 와중에 회사에서 엑셀로 살아남기도 1회독 했구요😊살아남기는 생각보다 막히는 부분 없이 수월하게 학습했던 거 같습니다. 저는 엑셀(스프레드시트)보다는 매크로 vba를 더욱 중점적으로 학습해야 할 거 같습니다.

선생님 제가 이제 매크로 책에 있는 내용은 거의 완벽하게 마스터 한 거 같습니다.

실력이 쌓일 수록 더욱 재밌어지기도 하구요. 해서 좀 더 추가로 vba를 공부해 보고 싶단 생각도 듭니다.

선생님 책에 있는 내용은 엑셀 vba에서 어느정도의 레벨 수준인가요? 여기서 더 깊게 들어가면 많이 어려워 질까요? 실무에서는 이정도만 하면 문제 없는지 궁금하구요. 더 많이 공부해 보려면 어느정도까지 공부해 보는 게 좋을지 조언해 주시면 감사하겠습니다!

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

와우~ 대단하십니다. 쉽지 않은 학습량인데, 단 시간에 이렇게까지 공부를 하시는 열정이 대단하십니다.

VBA는 지금 책의 내용만으로도 업무에 필요한 프로그램 제작은 충분하실겁니다.

좀 더 깊이 있게 학습하시려면 SQL배우셔서 외부 데이터를 엑셀 VBA로 컨트롤하는 프로그램 제작쪽도 괜찮습니다.

SQL 기초부터 시작하셔서 VBA에 응용할 수 있는 학습 내용을 찾아보시면 도움이 될것 같습니다

vba 에서 SQL, ADO DB 가 정말 고급자 쪽이라고는 들어본 거 같습니다. 한번 관심 가져봐야겠네요! 감사합니다 선생님!

선생님 혹시 매크로 신간은 내년에 출간을 하는 건지 아니면 그냥 계획만 잡히는 건지 궁금합니다.

회사 실무에 힘을 주는 엑셀 2016책 유일하게 구매할 수 있는 곳이 G마켓이더라구요. 신간이 아직 멀었다면 하나 구매해 놓으려고 합니다.

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

다음 버전 책이 나오려면 시간이 더 필요할것 같습니다.

2016버전 책 내용이나 예제가 지금 보신 책 내용과 유사해서 안보셔도 될것 같습니다.

오히려 다른 저자님 책을 보시는 것이 더 도움이 되지 않을까 싶습니다.

저자님들마다 중요하다 생각하는 내용과 관점이 다르기때문에 또 다른 시각으로 VBA를 공부하실 수 있을것 같아서요

0

선생님 파일취합 부분에서

application.displayalerts=false 이 부분이요

제가 코드 다 지우고 처음부터 계속 작성해 보면서 연습하고 있는데요 이 부분을 빼먹어 봤더니

클립보드 양이 많다고 나오면서 계속 실행할 것인지 예, 아니오, 취소 문구가 파일을 하나씩 취합할 때마다 나오더라구요 그 문구를 안 뜨게 하기 위해 실행하는 코드 맞는 거죠?

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

네~ 맞습니다.

엑셀에서 진행여부를 선택하는 메시지 창을 보여주지 않고

기본값으로 자동 선택하고 넘어가도록 하는 문장입니다.

이 문장은 해당 매크로 종료전까지 취소로 설정되어 있다가

매크로가 종료되면 다시 원래대로 True 값으로 설정됩니다

선생님 매크로 책 156페이지 물동관리(비법노트)부분에서요

만약에 처음 선택해야하는 셀 range("e2")셀이 생산이라고 입력돼있는 셀이라면 런타임 오류가 나오면서 매크로 실행이 안 되는 문제가 있습니다. 시작셀이 생산셀이 아닌 경우에만 매크로가 실행이 되더라구요.

만약 시작셀이 생산셀이면 코드를 어떻게 수정해줘야 매크로가 제대로 실행이 될까요 ㅜㅜ

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

그렇네요. E열 데이터가 생산부터 시작할 수도 있겠네요.
그러면 생산열이 아닌 열을 첫 셀로 찾아야 하므로 반복문을 하나 더 사용하면 될것 같습니다.

Sub 불규칙한열삭제()

Dim 범위 As Range

Range("E2").Select

Do While ActiveCell.Value <> ""

If ActiveCell.Value <> "생산" Then

Set 범위 = ActiveCell

Exit Do

Else

ActiveCell.Offset(0, 1).Select

End If

Loop

ActiveCell.Offset(0, 1).Select

Do While ActiveCell.Value <> ""

If ActiveCell.Value <> "생산" Then

Set 범위 = Application.Union(범위, ActiveCell)

End If

ActiveCell.Offset(0, 1).Select

Loop

On Error Resume Next

범위.EntireColumn.Delete

Range("A1").Select

End Sub

 

선생님 216페이지 배열변수 부분에서요 처음에 배열 변수선언 할 때

dim 추첨값(10) as integer 에서 괄호 안에 10이라는 건 10개라는 뜻인 건가요?

책 설명에 배열 변수의 인덱스는 0부터 시작하기 때문에 for next문을 0~9로 해야 한다고 나와있습니다. 0부터 ~9까지 10개니까 저 추첨값 괄호 안에 9라고 쓰는 게 맞지 않나 하는 생각이 드는데 정확히 추첨값(10)의 의미를 알고 싶습니다. 9로 고치고 실행해 봤는데 결과는 같습니다.

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

dim 추첨값(10) as integer
이해하고 계신것처럼 이 문장은 10개짜리 배열변수를 만든다는 뜻이 맞습니다.

0~10의 의미는 아니고 10개 라는 개수의 의미입니다.

추첨값(9)라고 선언하면 9개짜리 배열 변수가 만들어져서 범위는 0~8까지로 설정됩니다.

이해가 되셨을까요?

변수 괄호 안의 10은 말 그대로 10개라는 갯수의 의미이군요! 인덱스가 0부터 시작한다고 해서 혹시 0~9이렇게 10개인가 하는 생각도 들었던 거 같습니다 ㅎ

감사합니다 선생님!

선생님 359페이지에서 조건문

if 복사범위.iten(i).rowheight<>0 then

복사범위.item(i).copy

반복범위.pastespecial

i=i+1

else

i=i+1 <<< 이 부분이요 화면에 보이지 않는 셀인데도 왜 순번을 올려줘야 하는지 이해가 잘 되지 않습니다.

제가 코드를 떠나서 작업 자체를 이해를 못하고 있는 건지.. 이게 만약 매크로를 안 쓴다고 한다면 품목코드 시트의 품목코드 b8셀 복사해서 매출현황 시트 d11에 붙여넣고 품목코드시트 b12 복사해서 매출현황 d16에 붙여넣고 이런식으로 한 셀씩 복사해서 붙여넣는 작업인 건가요?

조건문에서 else는 왜 써야 하는지 왜 else에서도 순번을 올려줘야 하는지 모르겠습니다.

지금까지 매크로 공부하면서 가장 막히고 있는 부분입니다 ㅜㅜ

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

복사범위의 셀 들을 하나씩 붙여넣는 과정이 맞습니다.

 

엑셀은 필터 조건이 설정된 셀 범위를 드래그로 선택하면 숨어있는(필터 조건과 맞지 않아 보이지 않는) 셀 들도 포함됩니다.

 

그래서 복사범위의 셀 들을 하나씩 확인해서 보이는 셀인지 숨겨진 셀인지 확인을 합니다

 

만약 숨겨진 셀이면 행 높이가 0이므로 이 셀을 복사하지 않고 다음 셀로 넘어갑니다.

이때 else 가 필요하고 다음 문장에서 i값을 1 증가시켜줍니다.

i=i+1 은 복사하지 않더라도 다음 셀로 넘어가야 하므로 1을 증가시켜줍니다

이해가 되셨을까요?

선생님 일요일인데도 이렇게 답변해 주셔서 너무 감사합니다. 저 드디어 책 1회독 끝냈습니다!

별책은 한 2~3회독 정도 하고 해보려 합니다.

책 정말 구매하기 너무 잘한 거 같습니다 ㅎ 강의만큼이나 설명이 너무 친절해서 다소 어려운 코드도 금방 이해 됐던 거 같아요 ㅎ 선생님 항상 너무 감사드립니다. 남은 주말 잘 보내세요💕

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

와우~ 두껍고 어려운 책인데 벌써 1회독을 하셨다니... 대단하십니다.

정말 열심히 공부하시네요~^^

선생님 사용자정의함수에서도 function 함수(인수) 이렇게 괄호 안에 인수 부분 데이터형식 생략하고 쓰면 function 함수(인수 as variant) 이렇게 가변형으로 선언한 거랑 똑같나요?

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

네~ 맞습니다.

가변형으로 선언되어 숫자, 문자, 셀범위 등 모두 인수값으로 받아들일 수 있습니다

유니크한 오소리님의 프로필 이미지
유니크한 오소리

작성한 질문수

질문하기