본문 바로가기
VBA

[VBA] For Each & Areas 를 이용한 셀 조작하기

by 일등미노왕국 2022. 12. 25.

 

기초방에서 올린 문제 #1

초심으로 돌아가기 위한 프로젝트 #1 : 빈셀에 규칙을 이용하여 채우는 문제

 

왼쪽에 있는 문제는 엑셀 상에서 F5 > alt + s > alt + k를 누르고 바로 ' = 바로 윗셀 +1 '을 하면 된다.

 

하지만 오른쪽 문제는 좀 생각을 해야한다.

 

엑사남님은

 

Sub aaaaa()
    '''' 선택 범위 빈셀에 함수 입력하기
    Range("B4:B23").SpecialCells(xlCellTypeBlanks) = "=B5+1"
    Range("D4:I23").SpecialCells(xlCellTypeBlanks) = "=COLUMN()-3+((ROW()-4)*6)"
End Sub

이렇게 풀어버리셨다...

 

순간 알고리즘 문제를 내야하나 하고 욱했다..ㅋㅋㅋ

이번 기초방 문제에 기존에 참여가 힘드셨던 많은 분들이 함께 해주시고 본인들의 코드를 오픈하였다.

그 코드들을 본인은 잔인하게 박제하려고 한다.

훗날 이 프로젝트가 끝날때 그 분들이 얼마나 달라졌는지 오늘 이 박제된 본인들의 코드들을 보고 성장의 척도를 

갸늠하시길 바란다.

그리고 여기 또 하나의 실력자인 잔머리Jr님 코드도 올린다.

손수 한땀 한땀 주석을 달아주셨다. 잔머리JR님은 블로그도 운영중이신데, 그 구성과 글솜씨가 일품이어서 링크를 첨부한다.

https://blog.naver.com/mrdjrblog

 

코딩하는 룡룡이 : 네이버 블로그

- 배움의 흔적을 남기는 소중한 공간. - 매크로 제작 문의https://open.kakao.com/o/sNboYsIc

blog.naver.com

솔직히 주석다는게 귀찮고 힘들다.

물론 유지 보수를 위해서는 주석이 필수인데 실무에서는 크게 크게 주석을 달고 그밑에 코드를 진행하기에 하나하나 주석을 다는건 코드 짜는것 보다 더 힘들 수 있다. 

 

잔머리JR님께 다시한번 감사를 표한다.

 

오늘 공개할 코드는 딱총님의 코드로 하려고 한다.

 

숙제를 낸 본인의 의도와 90%이상 일치한다.

 

코드 진행은 이렇다.

왼쪽 영역과 오른쪽 영역을 Union으로 묶어버리면 보기에는 하나의 영역으로 보이지만

VBA 에서는 영역을 분리해서 인식하게 된다.

 

set rngAll = Union(왼쪽, 오른쪽)

 

이렇게 하였을때 rngAll.areas(1) / rngAll.areas(2) 로 분리가 된다.

 

숫자가 1부터 +1 씩 진행되기에 Areas의 속성값인 Count로 Area의 크기를 확인하여 빈셀 여부를 판단하여

빈셀에 +1씩 증가시킨 값을 넣어주면 된다.

 

참 기분이 좋다..이런 코드들을 보고 있으면...

 

앞으로도 많은 참여 부탁드립니다.

 

더보기
Option Explicit

Sub 빈셀채우기()

    Dim rngAll As Range: Set rngAll = Union([b4:b23], [d4:i23])
    Dim rngA As Range
    Dim rngX As Range
    Dim i&, j&
    
    For Each rngA In rngAll.Areas   '= 병합 Areas 순환
      
        For Each rngX In rngA
          
            셀움직임 rngX
         
            i = i + 1               '= 숫자를 +1 증가
            
            If IsEmpty(rngX) Then
            
                rngX = i            '= 값이 비어 있으면 증가된 i값을 넣어라
                rngX.Font.Color = vbBlack
                
            End If
           
           
        Next rngX
        
            i = 0                   '= i값 초기화
    
    Next rngA

End Sub

Function 셀움직임(rngX As Range)

    Dim j&
    
     '= 해당코드는 셀의 움직임을 보이기 위한 임시코드
     
        For j = 1 To 500
            rngX.Select
        Next j
        

End Function

엑사남(기초방)#1.xlsm
0.02MB

댓글