ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VBA 유튜브 학습기 7 - 자동 복사, 붙여넣기의 모든 것(feat. 파워 문과 기획자)
    공부하는 노예/VBA(유튜브 무료 강의) 2021. 4. 5. 09:00
    728x90

    youtu.be/Ir4SmzhGgdA

     

    엑사남 님 강의 7강 듣고 왔습니다.

     

    저번주 금요일에 6강 들은 후에 주말 팽팽 놀고 돌아오니까 사실 앞에 내용이 기억이 잘 안 나요.....😂

    그래서 진도 나가는 걸 쉬고 오늘은 복습을 해야 하나 생각했는데...

    일단은 다 듣고, 다시 듣더라도 목표한 진도는 나가 보기로 합니다.

     

    잘하는 짓이겠죠?

     

     

    오늘 배운 내용은 복사, 붙여넣기에 대한 건데요.

    Ctrl + C, Ctrl + V로만 살아온 인생.

    이제 저도 VBA 코드를 작성해서 그걸로 뭔가를 해 볼 수 있는 날이 오나 봐요. 🤩

     

     

    예제1. 텍스트, 수식, 서식 모두 복사 - 붙여넣기

    위 이미지의 F6 : L18까지의 표를 텍스트, 수식, 서식을 모두 통째로 복사해다가 O6 셀에 붙여넣을 거예요.

    범위 지정해서 컨트롤 + C, V로도 가능하겠지만 조금 더 뭔가 있어 보이게 처리해 보는 거죠. ㅋㅋㅋ

     

    Sub Test01()

         Range("F6").CurrentRegion.Copy
         Range("O6").PasteSpecial

    End Sub

     

    코드는 이렇습니다.

     

    Range("F6").CurrentRegion.Copy          'F6셀을 시작으로 이어져 있는 모든 셀을 복사합니다.

     

    * 셀.CurrentRegion : 해당 셀부터 이어져 있는 전체 범위

     

    Range("O6").PasteSpecial               'O6셀에 복사한 것을 그대로 붙여넣습니다.

     

     

    그리고 실행해 보면

     

     

    이렇게 표가 그대로 복사돼 O6셀부터 붙여넣기 된 걸 볼 수 있는데요.

     

    거슬리는 게 있죠?

    복사한 표(F6 : L18) 테두리가 "여기 복사됐다." 라고 광고하고 있잖아요.

    녹색 점선 테두리가 반짝이는 걸 전 몹시 거슬려 하고 있었는데요.

     

    엑사남 선생님 완전 쪽집게.

    바로 말씀해 주시더라고요.

     

    코드에 무언가를 추가하면 저 반짝이는 테두리가 나타나지 않게 복사 - 붙여넣기가 가능하답니다.

     

    방법을 알아보면,

     

    Sub Test01()


         Range("F6").CurrentRegion.Copy
         Range("O6").PasteSpecial

         Range("F6").Select
         Application.Cutcopymode = false

    End Sub

     

    Range("F6").Select          'F6셀을 선택합니다.

     

    Application.Cutcopymode = false          '복사 모드를 취소합니다.

     

    이 코드들을 추가해 주면 된다고 하네요.

     

    코드를 추가하고 다시 실행해 보면

     

     

    이렇게!

     

    "여기를 복사했다!" 그런 표시 없이 복사 - 붙여넣기가 완료됐죠.

     

     

     

    예제2. 값만 복사 - 붙여넣기

     

    실무를 하다 보면 통째로 복사 - 붙여넣기보다는 값만 복사해 붙여넣는 걸 더 자주 쓰는 거 같아요.

    저만 그런가요?

     

     

    이 표는 K, L열에 전체적으로 수식이 적용돼 있었어요.

     

     

    이렇게 엑셀 표 안에 수식이 적용될 때가 있잖아요.

    수식은 됐고, 값만 가져다 쓰고 싶을 때.

    그런 경우도 VBA 코드로 해결할 수 있습니다.

     

    코드를 보면요.

     

    Sub Test02()

         Range("F6").CurrentRegion.Copy
         Range("F6").PasteSpecial xlPasteValues

         Range("F6").Select
         Application.CutCopyMode = False

    End Sub

     

    나머지 부분은 예제1과 동일한데

    붙여넣기 부분만 코드가 좀 바뀌었습니다.

     

    Range("F6").PasteSpecial xlPasteValues          'F6 셀에 복사한 걸 붙여넣는데, 값(Valuse)만 붙여 넣어라.

     

    * 셀.PasteSpecial xlPasteValues : 값만 붙여넣음

     

    이런 의미입니다.

     

    코드를 실행해 보면

     

    K7 셀을 찍어 보니 수식은 사라지고 값만 남았습니다.

     

    이렇게 K열에 있던 수식이 사라지고, 값만 붙여넣어진 걸 확인할 수 있습니다.

     

     

    예제3. 수식만 복사 - 붙여넣기

     

     

    이번엔 반대로.

     

    서식은 그대로 두고, 수식만 복사해 붙여넣고 싶을 때의 해결 방법인데요.

     

    K열, 합계를 구하는 데 사용할 수식은 위 이미지처럼 K3 셀에 미리 작성을 해 놓고요.

     

     

     

    L열, 평균을 구하는 데 사용할 수식은 위 이미지처럼 L3 셀에 미리 작성을 해 놨어요.

     

    그럼 이제 각각 K3 셀과 L3셀의 수식을 복사 - 붙여넣기를 데이터가 있는 행의 개수만큼 반복하면 되겠죠?

     

     

     

    그러기 위해선 데이터가 있는 행의 개수(데이가 입력된 마지막 행 번호)를 먼저 파악해야 합니다.

     

    전에 배웠던 COUNTA 함수를 이용해 데이터가 입력된 행의 개수를 구해 봅니다. (위 이미지 B2 셀 수식 참고)

     

    =COUNTA(F:F) + 5          'F열 전체에 텍스트가 입력돼 있는 셀의 개수를 구하고, 그 값에 5를 더해라.

     

    * 5를 더하는 이유는 위에 셀 서식을 맞추기 위해(?) 비워두 1~5행이 있기 때문이에요.

     

     

     

    기본 세팅을 해 두고 코드를 작성해 보면

     

    Sub Test03()

         Range("K3:L3").Copy
         Range("k7:L" & Range("B2")).PasteSpecial xlPasteFormulas

    End Sub

     

    Range("K3:L3").Copy          'K3에서 L3까지의 범위를 복사해라.

     

    Range("K7:L" & Range("B2")).PasteSpecial xlPasteFormulas

     

    '복사한 것을 K7셀부터 L열까지 붙여넣는데 몇 행까지냐면 "B2"에 표기된 행까지 붙여넣는다. 붙여넣을 땐 수식(xlPasteFormulas)만 붙여넣어라.

     

    * B2 셀엔 위에 보시면 아시겠지만, COUNTA 함수를 이용해 데이터가 입력된 셀의 개수를 카운트해 놓았습니다.

     

     

    코드를 실행해 보겠습니다.

     

     

    🤩👏

    서식은 유지되면서 잘 붙여넣어진 거 같은데.

    한번 확인해 보겠습니다.

     

     

     

    K11 셀(랜덤으로 그냥 찍은 셀이에요.)을 확인해 보니, 위의 이미지처럼 수식이 아주 잘 복사됐습니다.

     

     

     

    예제4. 값과 수식은 유지한 채로 서식만 복사 - 붙여넣기

     

    이번엔 이미 입력돼 있는 데이터 값과 수식들은 그대로 유지하면서 서식만 복사해 붙여넣는 방법입니다.

    저 같은 서식 디자인 집작 덕후에데 딱 맞는 팁이죠.

    제멋대로 복사해다 붙여넣어서 테두리 사라지고 막 정렬 안 맞고 그런 거 너무 싫거든요.

     

     

     

     

    이렇게 위의 이미지처럼 K열과 L열에는 합계와 평균을 구하기 위한 수식이 적용돼 있습니다.

     

    이 수식을 유지하면서 F3 : L3 범위에 있는 서식만 복사해다가

    F7 : L18 범위의 표에 적용하는 방법입니다.

     

     

    마찬가지로 먼저, 데이터가 있는 행의 개수(데이가 입력된 마지막 행 번호)를 먼저 파악해야 합니다.

     

    이젠 익숙해질 만도 한 COUNTA 함수를 이용해 데이터가 입력된 행의 개수를 구해 봅니다. (위 이미지 B2 셀 수식 참고)

     

    =COUNTA(F:F) + 5          'F열 전체에 텍스트가 입력돼 있는 셀의 개수를 구하고, 그 값에 5를 더해라.

     

    * 5를 더하는 이유는 위에 셀 서식을 맞추기 위해(?) 비워두 1~5행이 있기 때문이에요.

     

     

     

    기본 세팅을 해 두고 코드를 작성해 보면

     

     

    Sub Test04()

         Range("F3:L3").Copy
         Range("F7:L" & Range("B2")).PasteSpecial xlPasteFormats

    End Sub

     

    Range("F3:L3").Copy          'F3:L3 범위를 복사하라.

     

    Range("F7:L" & Range("B2")).PasteSpecial xlPasteFormats

     

    '복사한 걸 F7 셀부터 L열의(Range("F7:L") 행은 B2셀에 표기된 행만큼의 범위(& Range("B2"))에 붙여넣을 건데(PasteSpecial), 어떻게 붙여 넣느냐? 서식만 붙여넣어라.(xlPasteFormats)

     

     

    이렇게 코드를 작성하고 실행해 봅니다.

     

     

    일단 이렇게 서식은 잘 붙여넣기가 된 거 같습니다.

     

    캡처는 깜빡 잊고 못했는데.... 기존에 수식이 입력돼 있던 L열의 아무 셀이나 찍어 보면 수식도 잘 살아 있습니다.

     

     

    여기까지가 7강 학습한 내용이고요.

    7강은 과제가 있었어요.

     

     

    [과제]

    E6:K18 범위의 표에서 성별이 남자이면 E2:I2 영역의 서식과 J2:K2 영역의 서식 + 수식을 적용하고,

    성별이 여자이면 E3:I3 영역의 서식과 J3:K3 영역의 서식 + 수식을 적용하라. (1,000,000,000점😅)

    어려워.........

     

     

     

    전에 배웠던 For문과 If문을 활용하면 된다고 말씀해 주시더라고요.

    감은 오지만 약간 막막했어요.

     

    머리로만 생각해선 답이 안 나올 거 같으니 일단 시작해 봅니다.

     

     

     

    우선 데이터가 입력된 표의 마지막 행 번호를 구해야겠네요.

    앞에서 배운 대로 COUNTA 함수를 이용해 데이터가 입력된 마지막 행 번호를 구해 봅니다. (위 이미지 B2 셀)

     

    =COUNTA(E:E)+5

     

    여기까지 하고 한참의 시간이 흘렀습니다.🤣

    시험이었다면 떨어졌을 거예요....ㅋㅋㅋ

     

    Dim ..... 뭐뭐가 필요하지? 

    이렇게 삽질을 하다가 깨달음을 얻었습니다!

     

    For문부터 작성....

    중간중간 변수가 필요해지면 그때 Dim 변수 설정을 하기로 하고 작성하기 시작하니까 그래도 좀 감이 오더라고요.

     

    최종 코드는 이렇습니다!

    다른 분들 과제 해서 올리신 거 보니까 방법이 다양하더라고요.

    어떤 분 코드는 제게 너무 고난도라 이해가 안 가기도 하는데... 우선 이렇게 초보적 마인드로 작성한 코드도 되긴 됩니다....^^;;;

     

    Sub homework()

         Dim i As Long

         For i = 7 To Range("B2")
              If Range("F" & i) = Range("D2") Then
                   Range("E2 : I2").Copy
                   Range("E" & i).PasteSpecial xlPasteFormats
                   Range("J2 : K2").Copy
                   Range("J" & i).PasteSpecial

              Else
                   Range("E3 : I3").Copy
                   Range("E" & i).PasteSpecial xlPasteFormats
                   Range("J3 : K3").Copy
                   Range("J" & i).PasteSpecial
              End If
         Next i

         Range("E6").Select
         Application.CutCopyMode = False

    End Sub

     

    For i = 7 To Range("B2")          'i는 7(행)부터 B2 셀에 표기된 숫자(행)만큼 반복할 거예요.

         If Range("F" & i) = Range("D2") Then          'F열의 i행이 D2 셀과 같다면(즉, 셀 데이터가 "남"이라면)

              Range("E2 : I2").Copy          'E2:I2 범위를 복사해라.

              Range("E" & i).PasteSpecial xlPasteFormats          '복사한 값을 E열의 i행에 서식만 붙여넣어라.

              Range("J2 : K2").Copy          'J2:K2 범위를 복사해라.

              Range("J" & i).PasteSpecial          '복사한 값을 J열의 i행에 서식, 수식을 모두 붙여넣어라.

     

         Else          '만약 F열 i행이 D셀과 다르다면(즉, 셀 데이터가 "남"이 아니라면)

              Range("E3 : I3").Copy          'E3:i3 범위를 복사해라.

              Range("E" & i).PasteSpecial xlPasteFormats          '복사한 값을 E열의 i행에 서식만 붙여넣어라.

              Range("J3 : K3").Copy          'J3:K3 범위를 복사해라.

              Range("J" & i).PasteSpecial          '복사한 값을 J열의 i행에 서식, 수식을 모두 붙여넣어라.

     

     

    쓰긴 썼는데(사실 중간중간 막혀서 컨닝도 조금 했어요....ㅋㅋㅋㅋ)

    될까 싶었습니다.

     

    그렇게 자신 없게 일단 실행해 봅니다.

     

     

     

    되네요. 아주 잘!

     

    100% 제 힘으로 과제를 해내진 못해서 좀 찝찝한데...

    나중에 다시 백지 위에 해 보려고요.🙂

     

    파워 문과의 머리로 여기까지 이해한 것만 해도 전 제 스스로가 자랑스럽거든요 ㅋㅋㅋ

     

    이제 8강 들어야겠네요.

     

    반응형

    댓글

Designed by Tistory.