엑셀로 자료를 만들 때 아래 그림과 같이 셀 병합을 사용하는 경우가 있습니다.
셀 병합을 사용하여 자료를 만들면 보기는 좋습니다.
하지만 데이터로 활용한다는 측면에서 볼 때는 좋지는 않습니다.
위 그림과 같은 자료를 활용하기 위해서는
병합을 풀고 아래 그림과 같이 데이터를 만들어 주어야 합니다.
엑셀의 기본기능으로도 이 작업이 가능합니다.
병합을 해제하고
F5를 눌러 옵션을 선택
빈 셀을 선택하고
수식을 입력한 다음
함수식을 입력하면 됩니다.
이 절차를 VBA를 사용하여
간단하게 사용할 수 있도록 해보겠습니다.
구현기능
1. 셀 범위 선택 및 병합 해제는 엑셀 기본 기능 사용
2. 병합 해제되었을 경우 생기는 빈 셀은 위쪽 값 또는 좌측값으로 채우기
실질적으로 2번 기능을 구현하는 코드를 작성하겠습니다.
병합 해제 후 빈 셀을 위쪽 값으로 채우기
Sub FillBlankCellsWithAboveValue()
Dim cell As Range
Set Rng = Selection
For Each cell In Rng
If IsEmpty(cell) And cell.Row > Rng.Row Then
cell.Value = cell.Offset(-1, 0).Value
End If
Next cell
End Sub
먼저 셀 범위를 선택한 후 선택 범위를 변수에 넣어 줍니다.
Set Rng = Selection
그다음 선택된 범위의 셀을 순회합니다.
각 셀을 순회하며 조건을 검사할 겁니다.
For Each cell In Rng
...
Next cell
IsEmpty(cell)을 통해 셀이 비어있는지 확인합니다.
cell.Row : 현재 반복하고 있는 셀의 행 번호
Rng.Row : 선택된 전체 영역의 첫 번째 행의 번호
즉, 현재 처리 중인 셀의 행 번호가 선택된 범위의 첫 번째 행 번호보다 클 때만 실행되도록 하는 코드입니다.
처리 중인 셀의 행 번호와 선택 범위의 첫 번째 행 번호가 같다면
그리고 처리 중인 셀이 비어있다면 해당 셀은 맨 위의 셀임에도 비어있는 것이 되므로
채울 값이 없습니다.
For Each cell In Rng
If IsEmpty(cell) And cell.Row > Rng.Row Then
...
End If
Next cell
마지막으로 현재 처리 중인 셀이 비어있고,
행 번호가 선택된 범위의 맨 위의 행이 아니라면
바로 위 셀 값으로 처리 중인 셀에 값을 넣습니다.
cell.Value = cell.Offset(-1, 0).Value
※ Offset 함수의 설명 : 엑셀 VBA 셀 범위 선택하기, VBA resize와 VBA offset 활용
병합 해제 후 빈 셀을 왼쪽 값으로 채우기
아래 그림과 같은 경우도 있습니다.
셀 병합이 가로 방향으로 되어 있는 경우도 마찬가지로
데이터의 조작을 위해서는 셀 병합을 해제하고 왼쪽의 셀 값으로 채워야 합니다.
셀 병합을 풀고 채운 모습입니다.
이를 VBA로 구현하면 위 코드에서
Row를 Column으로 바꾸고
Offset 함수의 인자만 바꾸어 주면 됩니다.
Sub FillBlankCellsWithLeftValue()
Dim cell As Range
Set Rng = Selection
For Each cell In Rng
If IsEmpty(cell) And cell.Column > Rng.Column Then
cell.Value = cell.Offset(0, -1).Value
End If
Next cell
End Sub
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.
'EXCEL VBA' 카테고리의 다른 글
[ 엑셀 VBA ] 크롬 브라우저 버전 정보 확인하기 (0) | 2024.10.28 |
---|---|
[ 엑셀 VBA ] VBA로 내 컴퓨터에 설치된 ChromeDriver 버전 확인하기 (0) | 2024.10.28 |
[ 엑셀 VBA ] VBA 코드 보호하기 : VBA 코드 암호 걸기 (0) | 2024.09.26 |
[ 엑셀 VBA ] 특정 셀에 데이터를 입력하면, 입력 날짜 및 시간 생성, 데이터 변경 날짜 자동입력 (0) | 2024.09.12 |
[ 엑셀 VBA ] 선택한 범위의 셀 주소 표시하기 (0) | 2024.09.07 |