|
- 엑셀 버전(95,97,2000,xp,2003,2007):2010
* 아래줄에 질문을 작성하세요 >>
첨부파일에서 시트가 c18부터 합치기가 되게하고
b18열부터 나오는 순번은 안나오게 매크로 수정해주세요
==============[차알돌이님 글에 대한 답변입니다]==============
'변경한 부분을 주석으로 설명해 두었으니 참고 바랍니다.
Sub Macro1()
Dim T As Variant
Dim rng As Range
Dim sht As Variant
Dim n As Integer
' 모든 변수는 미리 선언해서 사용하는 것이 안전함
Application.ScreenUpdating = False
For Each Sht In Worksheets
If InStr(Sht.Name, "통합") = 0 Then
Set rng = Cells(Rows.Count, "C").End(3)(2)
' C열을 기준으로 기존 데이터의 끝에 추가
With Sht.Range("B15").CurrentRegion
' 여기는 왜 C15로 바꾸지 않았나요? - 아래 보충설명 참고
T = .Offset(3, 1).Resize(.Rows.Count - 3, 9)
' B열이 빠지므로 9개 열이 됨
n = UBound(T)
End With
rng.Resize(n, 9) = T
' rng의 시작위치가 C열이므로 offset은 필요 없고, 9개열에 T를 붙여넣기
' 원 소스의 경우 rng의 시작위치가 B열이었고, B열의 일련번호는 통합 일련번호
' 로 따로 매겨야 하기 때문에 붙여넣을 필요가 없고 C열부터 붙여넣기 위해서
' .Offset(, 1)을 삽입한 것임
' 통합일련번호를 생성하는 아래의 With 이하 구문은 필요 없으므로 삭제
End If
Next Sht
End Sub
===================== 보충설명 ====================
Sht.Range("B15").CurrentRegion는 왜
Sht.Range("C15").CurrentRegion로 바꾸지 않았나요?
CurrentRegion 개체는 직상위 개체를 기준으로 하여 연속적으로 데이터가
존재하는 셀들을 모아놓은 범위를 가리킵니다.
이 때 '연속적'이라 함은 상하좌우 모든 방향으로 확장이 됩니다.
이 프로젝트의 대상 시트의 경우 B15와 C15는 인접한 셀로서 표 제목을 갖고 있는 셀이므로, 모두 데이터를 갖고 있고, 따라서
Range("B15").CurrentRegion 나 Range("C15").CurrentRegion는
모두 동일한 범위를 가리키게 됩니다.
물론 Range("K17").CurrentRegion이라도 마찬가지이지요.
-----------
그러고 보면 원본 프로그램에서 바로 다음 명령인
T = .Offset(3, 1).Resize(.Rows.Count - 3, 10)
은 사실은 논리오류가 됩니다.
이 명령을 해석하자면, 앞에 언급한 바 Range("B15").CurrentRegion
의 시작위치인 B15 셀은 기준으로,
.Offset(3, 1) 즉, 아래로 3줄, 오른쪽으로 1칸 이동한 곳 - C18 셀로부터
원래 범위 Range("B15").CurrentRegion 의 행 수에서 3을 빼고
(표 제목에 해당하는 15~17 3줄은 복사하지 않아야 하니까)
10칸을 센 만큼 범위의 크기를 조정(Resize)하여
배열 T에 기억시키는 명령입니다.
그러면 C18로부터 10칸을 세어보세요.
실제 데이터는 K열에서 끝나는데, 10칸을 가면 L열까지 저장합니다.
메모리의 낭비가 되는 셈이지요.
원본 프로그램에서도 이 명령은
T = .Offset(3, 1).Resize(.Rows.Count - 3, 9)
로 9칸만 저장하라고 해야 맞습니다. |
|