나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 조삿갓 (choga21)

추천:  2
파일:     조회:  1850
제목:   [RE]시트통합에서 순번안나오게
     
  - 엑셀 버전(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칸만 저장하라고 해야 맞습니다.
 
[불량 게시물 신고]  
차알돌이조삿갓님 너무 감사합니다
많은 시간을 고민한 것을 주석까지 달아주셔서 쉽게 이해할 수 있었습니다
사실은 b18부터 자동채번을 하려 했으나 잘안되어서
1. vba 실행후 순번을 드래그할까 
2. c18부터 합치기 하고 b18부터 엑셀 row함수로 채번할까 하다가 2번을 선택했습니다
3. c18부터 데이터가 있을경우에 b18부터 자동채번할수 있는 수식을 배우고 싶습니다 
01-22 (15:54)
삭제 ■신고
조삿갓자동 채번은
그냥 원래 시도하셨던 방식도 괜찮은 방법이던데요?
01-22 (17:15)
삭제 ■신고
차알돌이감사합니다01-23 (07:40)
삭제 ■신고
        
  

작성일 : 2018-01-22(11:41)
최종수정일 : 2018-01-22(12:10)
 


 ◎ 관련글

  제 목   작성자   날짜
시트통합에서 순번안나오게 차알돌이 2018-01-21
[RE]시트통합에서 순번안나오게 조삿갓 2018-01-22