기초방 #9번 문제는 Offset 의 정확한 이해를 바탕으로 풀이가 가능한 문제이고
기초방 #9-1번 문제는 End 속성값을 통해 풀 수 있는 문제이다.
현재 기초방에서는 최대한 셀 기반으로 문제를 풀어내고 있다.
다른 언어들은 셀기반이 아니고 배열 구조여서 이해하기가 처음엔 어려울수도 있는데, VBA는 내가 하나씩 찍어볼수 있어서 이차원배열과 일차원배열을 이해하는데 더할 나위 없이 좋다..
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
할말이 없는데...참...나...
장인어른과 둘만 남아서 억지로 억지로 대화를 이어가는거 같다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/038.gif)
본인 코드에서 자주 등장하는 Cells(rows.count,"a").end(3)(2) 는 A열의 가장 아래에서 위로 컨트롤 윗 화살표를 했을 때 잡히는 셀에서 한칸 아래 부분을 말한다..
만일 잡힌셀에서 두줄 내려온 영역을 잡고 싶으면 Cells(rows.count,"a").end(3)(3) 이렇게 하면 된다.
본인이 초창기때 많이 했던 코드중에 range("a"&i) 이런 코드를 많이 사용하였는데 현재는 거의 쓰지 않는다. 불필요한 for문을 만들지 않기 위해서인데 가끔 이런걸 물어보시는 분이 계신다.
for i =1 to 10
for j=1 to 10
cells(i,j) = "X"
next j
next i
----------------------------------------
for each rngA in [a1:j10]
rngA = "X"
next rngA
이런것도
for i = 1 to 10
range("a" & i ) = "X"
next i
-------------------------------------
for each rngA in [a1:a10]
rnga = "X"
next rnga
for each 문은 컬렉션에서 개체를 순환할때 필수적 순환문이며, 여러 언어에서도 사용하고 있기에 For each 구문과 친해질 필요가 있다. 본인이 for each 를 쓰면서 가장 힘들었던건 cell(i,j) 이것을 표현하지 못해서 였다.
이런건 이렇게 사용하면 된다. 가령 for each rngA in rngall 을 순환해야 한다면
cells(rnga.row, rnga.column + 2) 이런식으로 사용이 가능하다
아래 구문에서 rngA.next는 단순하게 rngA(1,2) / rnga.offset(,1) 과 같다 . 그냥 rngA 에 옆에 있는값을 뜻한다.
Option Explicit
Sub 기초방_9()
Dim rngX As Range: Set rngX = [g4]
Dim rngAll As Range: Set rngAll = [c16:c26]
Dim rngA As Range
Dim Bln As Boolean: Bln = True
Haja_Format '= 초기화
Do Until rngX = ""
rngX.Offset(, rngX.Value) = rngX(1, -3) '= Offset 상수만큼 알파벳 출력하기
Set rngX = rngX.Offset(1)
Loop
For Each rngA In rngAll '= end 상수만큼 값 출력하기
If Bln = True Then
Cells(Rows.Count, "g").End(3)(2).Resize(1, 2) = Array(rngA, rngA.Next) '= 최초값
Bln = False
Else '= 두번째 값부터
Cells(Rows.Count, "g").End(3)(rngA.Next.Value + 2).Resize(1, 2) = Array(rngA, rngA.Next)
End If
Next rngA
' Haja_Format '= 서식입히기
End Sub
Function Haja_Format()
Dim rngAll As Range: Set rngAll = Union([h4:l10], [g16:h60])
rngAll.ClearContents
rngAll.Borders.LineStyle = 1
rngAll.HorizontalAlignment = xlCenter
End Function
큰 어려움없이 코드 이해가 가능하리라 본다.
보고있나...딱총!!
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #11 [ 영역과 조건에 따른 숫자채우기 ] (0) | 2023.01.07 |
---|---|
[기초방] VBA 100제 #10 [ 데이터 영역 재설정하기 ] (0) | 2023.01.06 |
[기초방] VBA 100제 #7 [ 행렬변환 ] (2) | 2023.01.04 |
[기초방] VBA 100제 #8 [ 데이터 영역 선택하기 ] (0) | 2023.01.04 |
[기초방] VBA 100제 #6 [ 데이터 영역 스위칭 ] (0) | 2023.01.02 |
댓글